当前位置:

首页 > 编程开发 > 介绍Python库Rb实现的Redis非复制分片功能

介绍Python库Rb实现的Redis非复制分片功能

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

Rb,redisblaster,是一个为redis实现非复制分片(non-replicatedsharding)的库。它在pythonredis之上实现了一个自定义路由系统,允许您自动定位不同的服务器,而无需手动将请求路由到各个节点。它没有实现redis的所有功能,也没有尝试这样做。您可以随时将客户端连接到特定主机,但大多数情况下假设您的操作仅限于可以自动路由到不同节点的基本key/value操作。你可以做什么:自动针对主机进行单key操作。对所有或部分节点执行命令。并行执行所有

本文目录

    Rb,redis blaster,是一个为 redis 实现非复制分片(non-replicated sharding)的库。它在 python redis 之上实现了一个自定义路由系统,允许您自动定位不同的服务器,而无需手动将请求路由到各个节点。

    它没有实现 redis 的所有功能,也没有尝试这样做。您可以随时将客户端连接到特定主机,但大多数情况下假设您的操作仅限于可以自动路由到不同节点的基本 key/value 操作。

    你可以做什么:

    • 自动针对主机进行单 key 操作。
    • 对所有或部分节点执行命令。
    • 并行执行所有这些。

    安装

    rb 在 PyPI 上可用,可以从那里安装:

    $ pip install rb
    

    配置

    开始使用 rb 非常简单。如果您之前一直在使用 py-redis,您会感到宾至如归。主要区别在于,不是连接到单个主机,而是将 cluster 配置为连接到多个:

    rom rb import Cluster
    
    cluster = Cluster(hosts={
    0: {'port': 6379},
    1: {'port': 6380},
    2: {'port': 6381},
    3: {'port': 6382},
    4: {'port': 6379},
    5: {'port': 6380},
    6: {'port': 6381},
    7: {'port': 6382},
    }, host_defaults={
    'host': '127.0.0.1',
    })
    

    在这种情况下,我们在同一主机上的四个不同服务器进程上设置了 8 个节点。hosts 参数是要连接的主机的映射。字典的 key 是 host ID(整数),值是参数字典。host_defaults 是为所有主机填写的可选默认值字典。如果您想共享一些重复的常见默认值(在这种情况下,所有主机都连接到 localhost),这很有用。

    在默认配置中,PartitionRouter 用于路由。

    路由

    现在集群已经构建好了,我们可以使用 Cluster.get_routing_client() 来获取一个 redis 客户端,它会为每个命令自动路由到正确的 redis 节点:

    client = cluster.get_routing_client()
    results = {}
    for key in keys_to_look_up:
    results[key] = client.get(key)
    

    该客户端的工作原理与标准的 pyredis StrictClient 非常相似,主要区别在于它只能执行只涉及一个 key 的命令。

    然而,这个基本操作是串联运行的。使 rb 有用的是它可以自动构建 redis 管道并将查询并行发送到许多主机。但是,这会稍微改变用法,因为现在该值无法立即使用:

    results = {}
    with cluster.map() as client:
    for key in keys_to_look_up:
    results[key] = client.get(key)
    

    虽然到目前为止看起来很相似,但不是将实际值存储在 result 字典中,而是存储 Promise 对象。当 map context manager 结束时,它们保证已经被执行,您可以访问 Promise.value 属性来获取值:

    for key, promise in results.iteritems():
    print '%s: %s' % (key, promise.value)
    

    如果要向所有参与的主机发送命令(例如删除数据库),可以使用 Cluster.all() 方法:

    with cluster.all() as client:
    client.flushdb()
    

    如果你这样做,promise 值是一个字典,其中 host ID 作为 key,结果作为 value。举个例子:

    with cluster.all() as client:
    results = client.info()
    for host_id, info in results.iteritems():
    print 'host %s is running %s' % (host_id, info['os'])
    

    要明确针对某些主机,您可以使用 Cluster.fanout() 接受要将命令发送到 host ID 列表。

    API

    这是公共 API 的完整参考。请注意,此库扩展了 Python redis 库,因此其中一些类具有更多功能,您需要查阅 py-redis 库。

    Cluster

    class rb.Cluster(hosts, host_defaults=None, pool_cls=None, pool_options=None, router_cls=None, router_options=None)

    cluster 是 rb 背后的核心对象。它保存到各个节点的连接池,并且可以在应用程序运行期间在中央位置共享。

    具有默认 router 的四个 redis 实例上的集群的基本示例:

    cluster = Cluster(hosts={
    0: {'port': 6379},
    1: {'port': 6380},
    2: {'port': 6381},
    3: {'port': 6382},
    }, host_defaults={
    'host': '127.0.0.1',
    })
    

    hosts 是一个主机字典,它将 host ID 数量映射到配置参数。参数对应于 add_host() 函数的签名。这些参数的默认值是从 host_defaults 中提取的。要覆盖 pool 类,可以使用 pool_cls 和 pool_options 参数。这同样适用于 router 的 router_cls 和 router_options。pool 选项对于设置 socket 超时和类似参数很有用。

    • add_host(host_id=None, host='localhost', port=6379, unix_socket_path=None, db=0, password=None, ssl=False, ssl_options=None)

    将新主机添加到集群。这仅对单元测试真正有用,因为通常主机是通过构造函数添加的,并且在第一次使用集群后进行更改不太可能有意义。

    • all(timeout=None, max_concurrency=64, auto_batch=True)

    扇出到所有主机。其他方面与 fanout() 完全一样。

    例子:

    with cluster.all() as client:
    client.flushdb()
    
    • disconnect_pools()

    断开与内部池的所有连接。

    • execute_commands(mapping, *args, **kwargs)

    同时在 Redis 集群上执行与路由 key 关联的一系列命令,返回一个新映射,其中值是与同一位置的命令对应的结果列表。例如:

    >>> cluster.execute_commands({
    ... 'foo': [
    ... ('PING',),
    ... ('TIME',),
    ... ],
    ... 'bar': [
    ... ('CLIENT', 'GETNAME'),
    ... ],
    ... })
    {'bar': [],
     'foo': [, ]}
    
    • 作为 redis.client.Script 实例的命令将首先检查它们在目标节点上的存在,然后在执行之前加载到目标上,并且可以与其他命令交错:
    >>> from redis.client import Script
    >>> TestScript = Script(None, 'return {KEYS, ARGV}')
    >>> cluster.execute_commands({
    ... 'foo': [
    ... (TestScript, ('key:1', 'key:2'), range(0, 3)),
    ... ],
    ... 'bar': [
    ... (TestScript, ('key:3', 'key:4'), range(3, 6)),
    ... ],
    ... })
    {'bar': [],
     'foo': []}
    

    在内部,FanoutClient用于发出命令。

    • fanout(hosts=None, timeout=None, max_concurrency=64, auto_batch=True)

    用于获取路由客户端、开始扇出操作并 join 结果的快捷上下文管理器。

    在上下文管理器中,可用的客户端是 FanoutClient。示例用法:

    with cluster.fanout(hosts='all') as client: client.flushdb()
    get_local_client(host_id)
    
    • get_local_client(host_id)

    返回特定主机 ID 的本地化 client。这个 client 就像一个普通的 Python redis 客户端一样工作,并立即返回结果。

    • get_local_client_for_key(key)

    类似于 get_local_client_for_key() 但根据 router 所说的 key 目的地返回 client。

    • get_pool_for_host(host_id)

    返回给定主机的连接池。

    redis 客户端使用此连接池来确保它不必不断地重新连接。如果要使用自定义 redis 客户端,可以手动将其作为连接池传入。

    • get_router()

    返回 cluster 的 router 。如果 cluster 重新配置,router 将被重新创建。通常,您不需要自己与 router 交互,因为集群的路由客户端会自动执行此操作。

    这将返回 BaseRouter 的一个实例。

    • get_routing_client(auto_batch=True)

    返回一个路由客户端。该客户端能够自动将请求路由到各个主机。它是线程安全的,可以类似于主机本地客户端使用,但它会拒绝执行无法直接路由到单个节点的命令。

    路由客户端的默认行为是尝试将符合条件的命令批处理成批处理版本。例如,路由到同一节点的多个 GET 命令最终可以合并为一个 MGET 命令。可以通过将 auto_batch 设置为 False 来禁用此行为。这对于调试很有用,因为 MONITOR 将更准确地反映代码中发出的命令。

    有关详细信息,请参阅 RoutingClient。

    • map(timeout=None, max_concurrency=64, auto_batch=True)

    用于获取路由客户端、开始映射操作并 join 结果的快捷上下文管理器。max_concurrency 定义在隐式连接发生之前可以存在多少未完成的并行查询。

    在上下文管理器中,可用的客户端是 MappingClient。示例用法:

    results = {}
    with cluster.map() as client:
    for key in keys_to_fetch:
    results[key] = client.get(key)
    for key, promise in results.iteritems():
    print '%s => %s' % (key, promise.value)
    
    • remove_host(host_id)

    从 client 中删除 host。这仅对单元测试真正有用。

    Clients

    class rb.RoutingClient(cluster, auto_batch=True)

    可以路由到单个目标的客户端。

    有关参数,请参见 Cluster.get_routing_client()。

    • execute_command(*args, **options)

    执行命令并返回解析后的响应

    • fanout(hosts=None, timeout=None, max_concurrency=64, auto_batch=None)

    返回映射操作的 context manager,该操作扇出到手动指定的主机,而不是使用路由系统。例如,这可用于清空所有主机上的数据库。context manager 返回一个 FanoutClient。示例用法:

    with cluster.fanout(hosts=[0, 1, 2, 3]) as client:
    results = client.info()
    for host_id, info in results.value.iteritems():
    print '%s -> %s' % (host_id, info['is'])
    

    返回的 promise 将所有结果累积到由 host_id 键入的字典中。

    hosts 参数是一个 host_id 列表,或者是字符串 'all' ,用于将命令发送到所有主机。

    fanout API 需要非常小心地使用,因为当 key 被写入不期望它们的主机时,它可能会造成很多损坏。

    • get_fanout_client(hosts, max_concurrency=64, auto_batch=None)

    返回线程不安全的扇出客户端。

    返回 FanoutClient 的实例。

    • get_mapping_client(max_concurrency=64, auto_batch=None)

    返回一个线程不安全的映射客户端。此客户端的工作方式类似于 redis 管道并返回最终结果对象。它需要 join 才能正常工作。您应该使用自动 join 的 map() 上下文管理器,而不是直接使用它。

    返回 MappingClient 的一个实例。

    • map(timeout=None, max_concurrency=64, auto_batch=None)

    返回映射操作的 context manager。这会并行运行多个查询,然后最后 join 以收集所有结果。

    在上下文管理器中,可用的客户端是 MappingClient。示例用法:

    results = {}
    with cluster.map() as client:
    for key in keys_to_fetch:
    results[key] = client.get(key)
    for key, promise in results.iteritems():
    print '%s => %s' % (key, promise.value)
    

    class rb.MappingClient(connection_pool, max_concurrency=None, auto_batch=True)

    路由客户端使用 cluster 的 router 根据执行的 redis 命令的 key 自动定位单个节点。

    有关参数,请参见 Cluster.map()。

    • cancel()

    取消所有未完成的请求。

    • execute_command(*args, **options)

    执行命令并返回解析后的响应

    • join(timeout=None)

    等待所有未完成的响应返回或超时

    • mget(keys, *args)

    返回与 key 顺序相同的值列表

    • mset(*args, **kwargs)

    根据映射设置 key/value。映射是 key/value 对的字典。key 和 value 都应该是可以通过 str() 转换为 string 的字符串或类型。

    class rb.FanoutClient(hosts, connection_pool, max_concurrency=None, auto_batch=True)

    这与 MappingClient 的工作方式相似,但它不是使用 router 来定位主机,而是将命令发送到所有手动指定的主机。

    结果累积在由 host_id 键入的字典中。

    有关参数,请参见 Cluster.fanout()。

    • execute_command(*args, **options)

    执行命令并返回解析后的响应

    • target(hosts)

    为一次调用临时重新定位 client。当必须为一次调用处理主机 subset 时,这很有用。

    • target_key(key)

    临时重新定位客户端以进行一次调用,以专门路由到给定 key 路由到的一台主机。在这种情况下,promise 的结果只是一个主机的值而不是字典。

    1.3 版中的新功能。

    Promise

    class rb.Promise

    一个尝试为 Promise 对象镜像 ES6 API 的 Promise 对象。与 ES6 的 Promise 不同,这个 Promise 也直接提供对底层值的访问,并且它有一些稍微不同的静态方法名称,因为这个 Promise 可以在外部解析。

    • static all(iterable_or_dict)

    当所有传递的 promise 都解决时,promise 就解决了。你可以传递一个 promise 列表或一个 promise 字典。

    • done(on_success=None, on_failure=None)

    将一些回调附加到 Promise 并返回 Promise。

    • is_pending

    如果 promise 仍然等待,则为 True,否则为 False。

    • is_rejected

    如果 promise 被拒绝,则为 True,否则为 False。

    • is_resolved

    如果 promise 已解决,则为 True,否则为 False。

    • reason

    如果它被拒绝,这个 promise 的原因。

    • reject(reason)

    以给定的理由拒绝 promise。

    • static rejected(reason)

    创建一个以特定值被拒绝的 promise 对象。

    • resolve(value)

    用给定的值解决 promise。

    • static resolved(value)

    创建一个以特定值解析的 promise 对象。

    • then(success=None, failure=None)

    向 Promise 添加成功和/或失败回调的实用方法,该方法还将在此过程中返回另一个 Promise。

    • value

    如果它被解决,这个 promise 所持有的值。

    Routers

    class rb.BaseRouter(cluster)

    所有路由的基类。如果你想实现一个自定义路由,这就是你的子类。

    • cluster

    引用回此 router 所属的 Cluster。

    • get_host_for_command(command, args)

    返回应执行此命令的主机。

    • get_host_for_key(key)

    执行路由并返回目标的 host_id。

    子类需要实现这一点。

    • get_key(command, args)

    返回命令操作的 key。

    class rb.ConsistentHashingRouter(cluster)

    基于一致哈希算法返回 host_id 的 router。一致的哈希算法仅在提供 key 参数时才有效。

    该 router 要求主机是无间隙的,这意味着 N 台主机的 ID 范围从 0 到 N-1。

    • get_host_for_key(key)

    执行路由并返回目标的 host_id。

    子类需要实现这一点。

    class rb.PartitionRouter(cluster)

    一个简单的 router,仅根据简单的 crc32 % node_count 设置将命令单独路由到单个节点。

    该 router 要求主机是无间隙的,这意味着 N 台主机的 ID 范围从 0 到 N-1。

    • get_host_for_key(key)

    执行路由并返回目标的 host_id。

    子类需要实现这一点。

    exception rb.UnroutableCommand

    如果发出的命令无法通过 router 路由到单个主机,则引发。

    Testing

    class rb.testing.TestSetup(servers=4, databases_each=8, server_executable='redis-server')

    测试设置是生成多个 redis 服务器进行测试并自动关闭它们的便捷方式。这可以用作 context manager 来自动终止客户端。

    • rb.testing.make_test_cluster(*args, **kwargs)

    用于创建测试设置然后从中创建 cluster 的便捷快捷方式。这必须用作 context manager:

    from rb.testing import make_test_cluster
    with make_test_cluster() as cluster:
    ...
    
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python 服务器
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    xshell密钥登录服务器教程及操作方法
    xshell密钥登录服务器教程及操作方法

    详细介绍如何使用 Xshell 通过密钥登录服务器的完整中文教程,包含步骤、示例及注意事项。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?