acl 框架中的 Redis 库已经支持集群版 Redis 3.0

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

据 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.reset();

    // 从 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_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;
}

文章转载自 开源中国社区 [http://www.oschina.net]

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
66 12
|
1月前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
361 0
|
1月前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
290 2
|
22小时前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
6 0
|
2天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式
|
7天前
|
NoSQL Redis
透视Redis集群:心跳检测如何维护高可用性
Redis心跳检测保障集群可靠性,通过PING命令检测主从连接状态,预防数据丢失。当连接异常时,自动触发主从切换。此外,心跳检测辅助实现`min-slaves-to-write`和`min-slaves-max-lag`策略,避免不安全写操作。还有重传机制,确保命令无丢失,维持数据一致性。合理配置心跳检测,能有效防止数据问题,提升Redis集群的高可用性。关注“软件求生”获取更多Redis知识!
108 10
透视Redis集群:心跳检测如何维护高可用性
|
10天前
|
监控 NoSQL 算法
Redis集群模式:高可用性与性能的完美结合!
小米探讨Redis集群模式,通过一致性哈希分散负载,主从节点确保高可用性。节点间健康检测、主备切换、数据复制与同步、分区策略和Majority选举机制保证服务可靠性。适合高可用性及性能需求场景,哨兵模式则适用于简单需求。一起学习技术的乐趣!关注小米微信公众号“软件求生”获取更多内容。
42 11
Redis集群模式:高可用性与性能的完美结合!
|
10天前
|
NoSQL Shell Go
在go中简单使用go-redis库
在go中简单使用go-redis库
|
10天前
|
监控 NoSQL Redis
|
15天前
|
NoSQL Redis Docker
使用Docker搭建Redis主从集群
使用Docker搭建Redis主从集群
32 1