据 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/
相关推荐
- **Redis集群**:如果例子中包含,可以学习如何搭建和使用Redis Cluster,了解槽的概念和分片原理。 - **Java客户端使用**:熟悉Jedis或Lettuce的API,了解如何在Java代码中进行连接、发送命令、关闭连接等操作。 ...
开发者可以像使用原生Redis客户端一样,方便地进行各种操作。 4. **易于集成**:由于其轻量级的特性,`rcluster.lua`非常适合与OpenResty(一个基于Nginx的高性能Web平台)结合使用,构建高效的边缘计算或微服务...
aredis 是一款由同步的 redis 客户端 redis-py 改写而成的高效的异步 redis 客户端,在最新的 1.0.7 版本中完成了对于 redis 集群的支持。 改动 主要重写了底部建立连接和读取数据部分的代码,接口部分都向下兼容,...
**redis-plus-plus** 是一个基于C++编写的高效、易用的Redis客户端库,它为开发者提供了方便的接口,使得在C++应用中操作Redis数据库变得更加简单。这个库充分利用了C++11特性,提供了现代C++编程风格的API,提高了...
Java客户端库如JedisCluster或Lettuce提供了连接和操作Redis集群的API。 批量插入String类型数据时,通常使用`JedisCluster`类中的`mset`方法。这个方法允许一次性设置多个键值对,但需要注意的是,由于Redis集群的...
基于和Rust的Redis客户端,支持PubSub命令,集群式Redis部署等。 安装 带。 cargo add fred 特征 支持集群式Redis部署。 具有多个退避策略的可选内置重新连接逻辑。 发布-订阅界面。 支持ElastiCache,包括TLS...
Jedis是一个非常流行的Redis客户端,同样提供了丰富的API。首先,确保在项目中引入了Jedis的依赖。然后,创建Jedis实例并连接到Redis服务器: ```java Jedis jedis = new Jedis("localhost"); jedis.connect(); ```...
不支持原子操作:在Redis集群中,不同节点之间的数据访问会出现延迟,因此不支持原子操作,可能会导致数据的不一致性。 需要配置复杂:Redis集群需要配置投票数、数据分片等参数,增加了配置的复杂度。 高成本:...
4. **客户端支持**:不是所有的Redis客户端都支持集群模式,使用前需确认客户端兼容性。 5. **备份与恢复**:集群环境下,备份和恢复策略需要考虑到所有节点,可能需要额外工具和策略。 在实际生产环境中,Redis...
- 命令行客户端:Redis提供了一个命令行客户端`redis-cli.exe`,用于与Redis服务器进行交互,执行各种命令如`SET`, `GET`, `PING`等。 3. **安全性考虑**: - 默认情况下,Redis没有内置安全机制,所有连接都是...
9. **集群与复制**:尽管Windows版Redis可能不支持原生的Redis集群,但可以通过其他方式实现分布式部署,比如使用哨兵(Sentinel)系统进行高可用性配置,或通过复制将数据分发到多个实例。 10. **性能优化**:Redis...
在这个例子中,我们创建了一个`JedisSentinelPool`实例,然后从池中获取一个`Jedis`对象,调用`select`方法指定数据库,接着执行Redis操作。在操作完成后,记得关闭资源以避免资源泄露。 总的来说,解决Redis哨兵...
Redis是一个高性能的键值对数据库,常用于缓存和消息中间件。在本教程中,我们将...通过这个简单的例子,你可以理解如何在实际项目中集成Redis,并开始探索更高级的功能,如发布/订阅、事务处理、持久化和集群支持。
Jedis是Java开发人员广泛使用的Redis客户端库,版本2.9.0是Jedis的一个较新版本,它提供了丰富的API来操作Redis中的各种数据结构。Jedis支持连接池功能,允许开发者有效地管理与Redis服务器的连接,提高应用的性能和...
- **对比哨兵模式**:Redis Cluster提供了更高效的读写并发,减少了中间代理的延迟,但不支持动态调整槽位,而哨兵模式适合需要动态管理的场景。 总结,Redis 5集群配置是一个涉及安装、配置、初始化等多个步骤的...
- **解决方案:** `redis-rb`是Ruby社区中最常用的Redis客户端。 - **讨论细节:** - 安装`redis-rb`可以通过`gem install redis`命令完成。 - `redis-rb`支持Redis的所有基本命令,并且易于集成到Ruby项目中。 ...
在这个例子中,我们创建了一个 `redis.NewClusterClient` 实例,设置了至少一个集群节点的地址。然后,我们使用 `Set` 方法设置键值对,并通过 `Get` 方法获取该键对应的值。 总的来说,`go-redis` v3 为 Go 开发者...
5. **使用客户端连接**:在应用中,使用 "redis-3.2.1.gem" 这样的客户端库,配置连接集群的节点,库会自动处理槽位映射和故障转移。 在 Ruby 中使用 Redis 的基本操作包括: - 连接 Redis 服务器:`redis = Redis...