为什么为有集群
- 在 Redis3 版本之前,每台 Redis 机器需要存储所有 Redis key ,这要求每台 Redis 机器有足够大的内存
- 而且只能是主节点写,从节点读,对于高并发情况下会有性能瓶颈
- 虽然有哨兵模式来保证服务的高用,但是切换主节点还是需要时间的(实测)
分布式数据库
分布式数据库指将数据均匀的分布到每个节点上,可以做数据冗余来排除故障,每个节点负责数据的一个子集
如何进行分区
常见的分区规则 哈希分区,顺序分区,Redis 集群使用了哈希分区 虚拟槽分区 方式
所有的键根据哈希函数 (CRC16[key]&16383) 映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据
哈希函数: Hash()=CRC16[key]&16383 按位与
Redis用虚拟槽分区原因:解耦数据与节点关系,节点自身维护槽映射关系,分布式存储
Redis集群的不足
- 键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了
- 键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务
- 键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点
- 不支持多数据库,只支持 0 数据库
- 主从结构只支持单层结构,不支持树型结构
搭建集群
参考我的另一篇文章 https://blog.csdn.net/sanri1993/article/details/101720686
一点小推广
创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。
Excel 通用导入导出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi
使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven