redis slot 槽点
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value
时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,
这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大
致均等的将哈希槽映射到不同的节点。
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。
"用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?"
Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。
"为了动态增删节点的时候,不至于丢失数据么?"
节点增删时不丢失数据和hash算法没什么关系,不丢失数据要求的是一份数据有多个副本。
“还有集群总共有2的14次方,16384个哈希槽,那么每一个哈希槽中存的key 和 value是什么?”
当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。
相关文章
- Redis命令总结
- windows redis:Uncaught exception 'RedisException' with message 'Redis server went away'
- Redis学习(2)-redis安装
- Redis的Python客户端redis-py的初步使用
- spring boot单元测试之十:用embedded-redis库做Redis的mock(spring boot 2.4.3)
- redis集群之REDIS CLUSTER
- Redis-Cluster实战--5.使用redis-cli安装
- Redis集群原理篇之图文并茂
- redis的安装
- [Bug]redis问题解决(MISCONF Redis is configured to save RDB snapshots)
- Atitit redis使用 attilax 艾提拉总结 1.1. Redis默认有16个库,默认连接的是 index=0 的那一个。解决与原来不方便查询查看的问题1 1.2. redis不是现
- 〖Python 数据库开发实战 - Python与Redis交互篇①〗- redis-py的安装与使用
- 〖Python 数据库开发实战 - Python与Redis交互篇⑪〗- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
- 详解事务模式和Lua脚本,带你吃透Redis 事务
- 聊聊游戏业务怎么用高斯Redis
- Python使用redis介绍
- redis配置文件详解——筑梦之路
- ASP.NET Core微服务(六)——【redis命令详细列表2】
- Redis is configured to save RDB snapshots redis的 rdb持久化错误
- 【Redis|2】Redis应用场景 ——分布式锁
- Redis key的生命周期详解及故障案例描述(三)
- K8S 使用NFS存储 动态创建 PVC/PV 并通过 Statefulset 部署 Redis