Redis 不是整个程序只有一个线程,而是“核心命令执行”主要是单线程
也就是说,客户端发来的 GET、SET、HGET、ZADD 等命令,在 Redis 主线程中按顺序执行。
因为 Redis 的主要操作都在内存中完成,不需要频繁磁盘 IO
单线程的好处
text多个客户端连接 ↓ IO 多路复用监听事件 ↓ Redis 主线程读取请求 ↓ 单线程执行命令 ↓ 返回结果
常见判断:
实现简单,范围查询和排名操作更方便,平均性能和红黑树接近,非常适合 ZSet 的使用场景
js查找:O(log n)
插入:O(log n)
删除:O(log n)
范围遍历:O(log n + m)
同一套代码不同的部署环境可能需要时单机部署,可能是集群部署
Sentinel 更适合单机容量够用、只需要主从高可用的场景;Cluster 适合数据量或 QPS 超过单机瓶颈,需要水平扩容的场景。我们选择 Cluster,是因为它不仅能故障转移,还能通过 slot 分片把数据分散到多个主节点上。
redis cluster 不是直接将key映射到节点上,而是 key -> slot -> node
CRC16(key) % 16384Hash Tag 的作用是指定 key 中参与 slot 计算的部分。Redis Cluster 如果发现 key 中有 {xxx},会只对 xxx 做 CRC16 计算,因此多个 key 只要 {} 中内容相同,就会落到同一个 slot,从而支持 MGET、Lua、事务等同 slot 操作
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!