您的位置:首页 > 数据库 > Redis

REDIS集群API学习

2017-07-03 06:42 190 查看
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上下文和地址键值对,把指针存到该对象的私有向量集中。



以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,代码简洁规范,用例与性能测试一应俱全贴心周到十分好用。已经七月份了上半年没有实现梦想的小伙伴儿们要抓紧了,年初撸起袖子加油干现在还在撸袖子的可实在说不过去了,不行就光着膀子先干起来再说吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: