Redis单线程模型解析
什么是Redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis的单线程模型
Redis的单线程模型采用非阻塞IO多路复用的机制,使用单线程轮训监控与客户端的socket连接,监控socket命令所形成的AE_READABLE。拿到命令不直接执行,而是放入队列中,一个一个执行,不会有并发问题。
单线程的Redis为什么这么快?
- 纯内存操作,查找和操作的时间复杂度都是O(1)
- 单线程操作,避免了频繁的上下文切换,而多线程切换会涉及到锁以及消耗更多CPU
- 采用非阻塞IO多路复用机制:内部采用epoll+自己实现的简单事件框架。在epoll中的读,写,关闭,连接都转化成了事件,然后利用epoll的多路复用机制,绝不在IO上浪费一点时间
- 数据结构简单,对数据操作也简单
Redis为什么是单线程的?
官方答案:
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
如果CPU成为Redis的瓶颈怎么办?
可以考虑多起几个Redis进程,只要客户端分清楚哪些数据在哪个Redis进程就可以了。使用redis-cluster更好。
单线程处理的缺点?
无法发挥CPU的多核性能,不过可以通过在单机开多个Redis实例来完善。