Redis哈希槽

概念

Redis哈希槽 Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis
先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383
之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

问题

有1亿条数据需要缓存,请问如何设计存储这批数据?

利用哈希槽的做法

1.哈希槽其实就是一个数组,数组[0, 1, 2, …, 2^14-1]形成hash slot空间

2.把哈希槽均匀分段,分配给redis节点
redis节点1,负责存储5461个哈希槽的数据,编号0号至5460号哈希槽
redis节点2,负责存储5462个哈希槽的数据,编号5461号至10922号哈希槽
redis节点3,负责存储5461个哈希槽的数据,编号10923号至16383号哈希槽

3.计算每条数据的slot空间位置
将数据key进行哈希取值,映射已经固定大小的hash slot空间上

redis哈希槽分区的特点

1)解耦数据和节点之间的关系,方便节点数据迁移,例如:数据的读写只要计算出槽号就可以,节点的扩容和收缩只要重新均衡分配槽区间即可;故简化了节点扩容和收缩难度
2)节点自身维护槽的映射关系,不需要客户端(spring)或者代理服务维护槽分区和数据
3)支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景

槽位总数为什么是 16384?

1.当集群扩展到1000个节点时,也能确保每个master节点有足够的插槽,实际情况很难达到1000节点。
2.槽位过多会增加网络带宽消耗

你可能感兴趣的:(redis,哈希算法,java)