设为首页 收藏本站
查看: 805|回复: 0

[经验分享] 支持集群版 redis 的客户端例子

[复制链接]

尚未签到

发表于 2016-12-19 11:26:27 | 显示全部楼层 |阅读模式
  据 redis 官方网站显示,支持集群版的 redis3.0 快要发布了(现在已经到了redis3.0 rc4 版本),这样使用者就不需要自己花很大力气来针对 redis 进行分库了,之前人们为了使单机版的 redis 能支持集群方式,往往是在客户端或通过加一个中间的代理层(比如使用 tweaproxy)做很多工作,现在有了集群版的 redis3.0 ,这些额外的操作都不再需要。
  为了能够支持集群版的 redis 服务,另外增加了两个主要的重定向指令需要客户端能够支持:MOVE, ASK。其中以 MOVE 指令为例,之所以增加此重定向指令,主要是考虑效率的因素,redis-server 集群以哈希槽的方式存放数据(目前最大是 16384 个哈希槽),各个 redis-server 结点都会记录着每个哈希槽所在的最终结点的位置,所以当 redis 客户端访问一个 redis-server 时,如果该服务结点在计算完哈希槽后发现该哈希槽在别的服务结点上,则会给客户端返回一个重定向指令(如:MOVE hash_slot ip:port),客户端在获得此重定向指令后会去连接最终的服务结点;另外,不了尽量减少重定向次数(有利于提高处理效率),官方协议文档中建议客户端 应该缓存住哈希槽的存储位置。
  虽然集群版本的 redis3.0 即将发布,但目前主要的问题是缺乏客户端的支持(目前据说可以支持的只有少数的几个客户端库:象JAVA版的 jedis,ruby 版本),尤其是 C/C++ 客户端库更是匮乏,好消息是 acl 库中的 redis 客户端模块已经很好地支持集群 redis3.0 了,该库不仅支持 redis 的重定向指令及哈希槽的自动缓存及自动更新功能,同时还支持 redis 服务结点自动发布机制,即在初始 acl redis 客户端库时只需添加 一个或多个 redis 服务器结点地址,在运行过程中会根据服务器返回的重定向信息动态添加新的 redis 服务器结点。下面是使用 acl redis 库集群版本的例子:

#include "acl_cpp/lib_acl.hpp"
static void test_redis_string(acl::redis_string& cmd, const char* key)
{
acl::string val("test_value");
// 向 redis 集群中添加一条字符串类型的数据对象
// 对应的 redis 命令:SET key value
if (cmd.set(key, val.c_str()) == false)
{
printf("redis set error\r\n");
return;
}
else
printf("redis set ok\r\n");
// 清除缓冲区
val.clear();
// 重置 redis 客户端命令的状态,以便可以复用该操作对象
cmd.clear();
// 从 redis 集群中获取指定键值的数据
if (cmd.get(key, val) == false)
printf("get key error\r\n");
else
printf("get key ok, value: %s\r\n", val.c_str());
}
static void test_redis_key(acl::redis_key& cmd, const char* key)
{
// 查询给定键在 redis 服务端是否存在
if (cmd_key.exists(key) == false)
printf("key not exists\r\n");
else
printf("key exists\r\n");
}
int main(void)
{
const char* redis_addr = "127.0.0.1:6379";
int conn_timeout = 10, rw_timeout = 10, max_conns = 100;
// 定义 redis 客户端集群管理对象
acl::redis_client_cluster cluster;
// 添加一个 redis 服务结点,可以多次调用此函数添加多个服务结点,
// 因为 acl redis 模块支持 redis 服务结点的自动发现及动态添加
// 功能,所以添加一个服务结点即可
cluster.set(redis_addr, max_conns);
// redis 字符串类 (STRING) 操作对象
acl::redis_string cmd_string;
// redis 键值类(KEY) 操作对象
acl::redis_key cmd_key;
// 给 redis 操作对象绑定 redis 客户端集群对象
cmd_string.set_cluster(&cluster, max_conns);
cmd_key.set_cluster(&cluster, max_conns);
const char* key = "test_key";
// redis 集群命令操作的测试过程
test_redis_string(cmd_string, key);
test_redis_key(cmd_key, key);
return 0;
}
  
参考:
  1、acl 库地址:https://github.com/zhengshuxin/acl
  2、acl redis 头文件地址:https://github.com/zhengshuxin/acl/tree/master/lib_acl_cpp/include/acl_cpp/redis
  3、acl redis 源文件地址:https://github.com/zhengshuxin/acl/tree/master/lib_acl_cpp/src/redis
  4、acl redis 示例地址:https://github.com/zhengshuxin/acl/tree/master/lib_acl_cpp/samples/redis
  5、acl QQ 群:242722074
  6、微博:http://weibo.com/zsxxsz/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316410-1-1.html 上篇帖子: [gkk]--redis的效率----ajax长连接 下篇帖子: redis主动向页面push数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表