我正在尝试了解Redis的基础知识。Redis是无处不在的一种,它是使事情变得原子化的单线程,但是我无法想象这在内部是如何工作的。
如果它是IO绑定的应用程序(例如Node.js),则我们不设计服务器单线程,该线程在启动IO操作后释放了另一个请求的空间,并在IO操作完成后将数据返回给客户端(提供并发性)。但是在Redis的情况下所有数据都可以在主内存中使用,我们根本就不会做IO操作。那么为什么Redis是单线程的呢?如果第一个请求花费大量时间会发生什么情况,剩下的请求将不得不保留等候?
TL; DR :单线程使redis更加简单,并且redis仍然受IO约束。
内存是I / O。Redis仍受I / O约束。当redis处于高负载下并达到每秒最大请求数时,它通常会饿死于网络带宽或内存带宽,并且通常不会占用大量CPU。对于某些命令,这不是真的,但是在大多数情况下,redis将受到网络或内存的严格I / O约束。
除非内存和网络速度突然提高几个数量级,否则单线程通常不是问题。如果您需要扩展一个或几个线程(即master <-> slave <-> slave setup),那么您已经在研究Redis Cluster。在这种情况下,如果您因某种原因而CPU饿了并且想要最大化线程数,则可以为每个CPU内核设置一个群集实例。
我对Redis的源代码或内部信息不是很熟悉,但是我可以看到使用单个线程如何使实现无锁原子操作变得容易。线程会使事情变得更加复杂,并且由于redis不受CPU限制,因此似乎并没有提供很大的优势。在redis实例之上的某个级别实现并发似乎是一个不错的解决方案,这是Redis Sentinel和Redis Cluster的帮助。
Redis需要很长时间时,其他请求会如何处理?
当redis完成长请求时,这些其他请求将被阻止。如果需要,可以使用client- pause命令进行测试。
client- pause