Redis集群做法的难点,百万并发客户端「实战」( 四 )

test it!注意:可能遇到到问题1、xxx is not Empty,请停着个xxx的节点 , 删除bin目录下的dump.rdb,notes.conf,note6380.conf,必要时删除/var/run/redis.pid2、cannot connect to xxxx , 你着redis配置密码了 , 在ruby的client里面写上你配置的密码 , 具体怎么找这个文件 , find命令3、执行集群启动基本一直卡在:Waiting for the cluster to join …,请在你服务器上开启16379和16380端口 , 反正就是10000+你redis的端口三、原理原理图如下
Redis集群做法的难点,百万并发客户端「实战」文章插图
eids cluster模式最小得6个服务 , 每个服务之间通过ping-pong机制实现相互感知(注意:此模式没有单独的哨兵监控 , 集群内部完全自制) 。 redis集群数据存储类似于hashmap , 其将数据划成16484个片区(又叫插槽 , 每个槽可以放n多个数据) , 通过对key进行一定的算法与16384取模 , 得到其在16384中间的一个片区中 。 如上图姑且认为1-4;2-5;3-6 , 两两结对 , 前者为master负责写(其实也具备读能力) , 后者slave负责读 , 而且是只读 , 防止数据出现不一致,同时slave从master同步数据 。 按照上述配对 , 1-4主从将只负责0-5500片区的读写;2~5主从只负责5501-11000片区的读写;3-6主从负责11001-16383片区的读写 , 从而实现了分摊了读写的压力 。
三、容灾恢复

  • 主节点(如1)宕机 , 从节点(如4)将上位成master
  • 主节点又活了 , 角色反转为slave
  • 主从成对的宕机 , redis cluster将重新在剩下的节点上分配16384个片区(通过配置:cluster-require-full-coverage)
四、java如何使用public void jedisCluster() throws Exception { // 这里建议能把所有节点都写上就写上 , 防止单点连接失败 Set nodes = new HashSet<>(); nodes.add(new HostAndPort(yourIp, 7001)); nodes.add(new HostAndPort(yourIp, 7002)); nodes.add(new HostAndPort(yourIp, 7003)); nodes.add(new HostAndPort(yourIp, 7004)); nodes.add(new HostAndPort(yourIp, 7005)); nodes.add(new HostAndPort(yourIp, 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); jedisCluster.set("k1", "100"); String result = jedisCluster.get("k1"); System.out.println(result); jedisCluster.close();探讨cluster模式存在的问题
  • 多键操作不支持(如mset k1 v1 k2 v2;k1,k2可能不在一个服务器上)
  • 由于多键操作不支持直接导致redis事物不支持
  • 由于多键操作不支持直接导致redis可能不支持luna脚本(未测试),那些希望通过redis搭配
总结;文章内容仅代表个人观点 , 如有不正之处 , 欢迎批评指正 , 谢谢大家 。
luna脚本实现抢购秒杀方案的可能需要在测试一下 , 有空本人在测试一下 。
有一起学习的可以后台私信“资料”领取视频资料 各大厂面试题内容包括C/C++ , Linux , Nginx , golang , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , ffmpeg , 流媒体 ,音视频 , CDN , P2P , K8S , Docker , Golang,TCP/IP , 协程 , 嵌入式 , ARM , DPDK等等 。。。