REDIS集群API学习

    REDIS从3.0开始支持多个节点间共享数据的集群模式,数据自动分隔自动分区单个节点故障不影响总体功能,高效稳定一如既往,单机进化到集群想喷都找不到槽点了。

    数据分区简单直观用哈希做一级索引,集群默认16384个slot,N个节点近似平分所有的slot,每个slot维护自己的区间,CRC16校验值落没落在区间里一目了然,定位到节点以后的操作和之前的REDIS就没有区别了,节点增加删除移动slot的同时不影响总体功能,不足之处是节点故障会导致slot缺失。

    主从模式在数据分区之上增加数据副本,单个节点故障从节点被选举为新的主节点,数据服务继续保持可用,当然如果这个新节点再挂了那谁也没招了。主从节点间的数据复制是异步的,能否成功被许多因素左右,极端情况下导致数据集差异是难免的,这需要在效率和一致性上做取舍也是可以理解的,相信强一致性的REDIS已经在路上了。

    用C++操作REDIS有个r3c-master库,五六个文件把经常用到的操作都封装好了,拿来直接用挺方便的。

    声明一个CRedisClient对象并用集群地址进行构造,parse_nodes函数解析地址信息,用逗号分隔设备信息,用冒号分隔地址和端口,结果保存到向量里,元素是std::pair<std::string, uint16_t>类型,向量集大于一设置集群模式并开始初始化。list_nodes函数遍历向量集连接集群节点发送CLUSTER NODES命令并解析返回结果保存到NodeInfo结构体中,每行数据描述了设备ID、地址加端口、节点角色、PING时间戳、PONG时间戳、节点连接状态和slot的起始与终止值。节点信息都获取到了,接下来在堆上new个SlotInfo结构体来保存slot值、redis上下文和地址键值对,把指针存到该对象的私有向量集中。

                113748_KEyB_1376494.png

    以get为例操作步骤先构造一个ParamInfo结构体保存redis命令、key值、若干变参以及返回值val,封装好了一起传给包裹函数redis_command以便用于在外围生成redisCommand可识别指令。在提交redis之前调用keyHashSlot函数计算key的slot值,拿着slot进get_redis_context函数在那个存着SlotInfo指针的对象私有向量集里找出SlotInfo,这个结构体里的node成员变量是std::pair<uint32_t, uint16_t>类型,把它作为key去平衡二叉树里直接提取redis集群节点对应的上下文,有了句柄后续就是业务层面的操作了。

    库地址:https://github.com/eyjian/r3c,代码简洁规范,用例与性能测试一应俱全贴心周到十分好用。已经七月份了上半年没有实现梦想的小伙伴儿们要抓紧了,年初撸起袖子加油干现在还在撸袖子的可实在说不过去了,不行就光着膀子先干起来再说吧~

转载于:https://my.oschina.net/gonglibin/blog/1113937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值