`
zsxxsz
  • 浏览: 444226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

支持集群版 redis 的客户端例子

阅读更多

      据 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/

 

 

1
0
分享到:
评论

相关推荐

    高效异步redis客户端aredis优劣势原理解析

    aredis 是一款由同步的 redis 客户端 redis-py 改写而成的高效的异步 redis 客户端,在最新的 1.0.7 版本中完成了对于 redis 集群的支持。 改动 主要重写了底部建立连接和读取数据部分的代码,接口部分都向下兼容,...

    fred.rs:基于Future和Tokio的Rust的Redis客户端

    基于和Rust的Redis客户端,支持PubSub命令,集群式Redis部署等。 安装 带。 cargo add fred 特征 支持集群式Redis部署。 具有多个退避策略的可选内置重新连接逻辑。 发布-订阅界面。 支持ElastiCache,包括TLS...

    redis集群模式例子,三主三从,非常简单

    不支持原子操作:在Redis集群中,不同节点之间的数据访问会出现延迟,因此不支持原子操作,可能会导致数据的不一致性。 需要配置复杂:Redis集群需要配置投票数、数据分片等参数,增加了配置的复杂度。 高成本:...

    Redis架构及分片管理

    客户端不应该尝试连接集群总线端口,而应一直与正常的Redis命令端口通信,但是要确保在防火墙中打开了这两个端口,否则Redis集群的节点不能相互通信。命令端口和集群总线端口的偏移量一直固定为10000。注意,为了让...

    redis_comment:redis的评论

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis:Redis是一个内存数据库,可持久存储在磁盘上。 数据模型是键值,但支持许多不同类型的值

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操作

    Redis-Source-Code-Analyze:Redis原始阅读和分析(Redis-3.2.5)-redis source code

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-annotated:编译,调试和注释redis源代码-redis source code

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-5.0.8:Win10 Clion本地调试redis

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组命令... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-source-code-reading:redis 4.0 Mac下clion源码调试-redis source code

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-5.0.5:nginx + redis + lua这是后台开发的基本功。大家多交流

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组命令... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的

    redis:redis源码分析与个人理解

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的

    Redis数据库-其他

    这意味着 Redis 通过一组命令提供对可变数据结构的访问,这些命令使用带有 TCP 套接字和简单协议的服务器-客户端模型发送。所以不同的进程可以以共享的方式查询和修改相同的数据结构。 Redis 中实现的数据结构有一些...

    redis-source-reading:Redis源码解析

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的

    redis:Redis原始数据摘要析和注释

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-5.0.7-annotation:redis 5.0.7源码注释

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis视为memcached的一个更复杂的版本,其中的操

    redis-source-analysis:redis-3.2.12源码分析

    本自述文件只是一个快速入门文档。 您可以在找到更多详细的文档。 什么是Redis? Redis通常被称为数据结构服务器。 这意味着Redis通过一组... 另一个很好的例子是将Redis认为是memcached的一个更复杂的版本,其中的

Global site tag (gtag.js) - Google Analytics