据 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/acl-dev/acl
2、acl redis 头文件地址:https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/include/acl_cpp/redis
3、acl redis 源文件地址:https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/src/redis
4、acl redis 示例地址:https://github.com/acl-dev/acl/tree/master/lib_acl_cpp/samples/redis
5、acl QQ 群:242722074
6、微博:http://weibo.com/zsxxsz/
相关推荐
aredis 是一款由同步的 redis 客户端 redis-py 改写而成的高效的异步 redis 客户端,在最新的 1.0.7 版本中完成了对于 redis 集群的支持。 改动 主要重写了底部建立连接和读取数据部分的代码,接口部分都向下兼容,...
基于和Rust的Redis客户端,支持PubSub命令,集群式Redis部署等。 安装 带。 cargo add fred 特征 支持集群式Redis部署。 具有多个退避策略的可选内置重新连接逻辑。 发布-订阅界面。 支持ElastiCache,包括TLS...
不支持原子操作:在Redis集群中,不同节点之间的数据访问会出现延迟,因此不支持原子操作,可能会导致数据的不一致性。 需要配置复杂:Redis集群需要配置投票数、数据分片等参数,增加了配置的复杂度。 高成本:...
客户端不应该尝试连接集群总线端口,而应一直与正常的Redis命令端口通信,但是要确保在防火墙中打开了这两个端口,否则Redis集群的节点不能相互通信。命令端口和集群总线端口的偏移量一直固定为10000。注意,为了让...
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操作
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组命令... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组命令... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的
这意味着 Redis 通过一组命令提供对可变数据结构的访问,这些命令使用带有 TCP 套接字和简单协议的服务器-客户端模型发送。所以不同的进程可以以共享的方式查询和修改相同的数据结构。 Redis 中实现的数据结构有一些...
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操
本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的