redis键值存储集群的python接口

rediscluster的Python项目详细描述


redis键值存储集群的python接口。

项目目标

目标是rediscluster-py,以及rediscluster-php, 是要有一个一致的、兼容的客户端库 当以透明、快速和 容错方式。rediscluster-py基于 redis-py狭窄 因此,原始的Api命令在 redis服务器集群的上下文

特拉维斯ci

目前,rediscluster-py正在通过travis ci for python进行测试 版本2.6、2.7和3.2:Build Status

安装

$ sudo pip install rediscluster

或者(您确实应该使用pip):

$ sudo easy_install rediscluster

来源:

$ sudo python setup.py install

运行测试

$ git clone https://github.com/salimane/rediscluster-py.git
$ cd rediscluster-py
$ vi tests/config.py
$ ./run_tests

开始

>>> import rediscluster
>>> cluster = {
...          # node names
...          'nodes' : { # masters
...                      'node_1' : {'host' : '127.0.0.1', 'port' : 63791},
...                      'node_2' : {'host' : '127.0.0.1', 'port' : 63792},
...                    }
...     }
>>> r = rediscluster.StrictRedisCluster(cluster=cluster, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
'bar'

群集配置

集群配置是一个散列,它主要基于节点的概念,节点只是一个主机:端口对 指向单个redis服务器实例的。这是为了确保它不会被绑住 到特定的主机(或端口)。 这样做的好处是可以很容易地从 系统运行时调整容量的系统。

读从和写主

rediscluster使用存储在实例化期间传递的群集哈希中的主服务器来自动发现 如果有奴隶附属于他们。然后,它透明地将读取redis命令中继到从属服务器,并将命令写入主服务器。

也支持即使发出了read redis命令,也只能使用masters,只需在客户端实例化时指定,如:

>>> r = rediscluster.StrictRedisCluster(cluster=cluster, db=0) # read redis commands are routed to slaves
>>>
>>> r = rediscluster.StrictRedisCluster(cluster=cluster, db=0, mastersonly=True) # read redis commands are routed to masters

分区算法

rediscluster不像其他库那样使用一致的散列。为了将每个给定的密钥映射到适当的redis节点,使用的算法是, 基于CRC32和模,是:

(abs(binascii.crc32(<key>) & 0xffffffff) % <number of masters>) + 1

这用于确保与其他语言(特别是php)的某些兼容性。 提供了一个函数getnodefor,用于获取将要/已存储特定密钥的节点。

>>> r.getnodefor('foo')
{'node_2': {'host': '127.0.0.1', 'port': 63792}}
>>>

哈希标记

为了指定您自己的散列键(以便相关的键可以全部落地 在给定的节点上,rediscluster允许您以“a{b}”的形式传递一个字符串,在这里您通常会传递一个标量。 列表的第一个元素是用于哈希和 第二个是应该获取/修改的真正密钥:

>>> r.get("bar{foo}")
>>>
>>> r.mset({"bar{foo}": "bar", "foo": "foo"})
>>>
>>> r.mget(["bar{foo}", "foo"])

在这种情况下,“foo”是散列键,但“bar”仍然是 从“foo”散列到的redis节点获取的密钥。

多个键redis命令

在存储跨多个redis服务器的应用程序数据的上下文中,使用多个键的命令 因为参数很难使用,因为如果两个键散列到两个不同的 实例,则无法执行该操作。幸运的是,rediscluster有点容错 在这种情况下,就客户机而言,它仍然为那些多密钥操作获取正确的结果。 为此,它在接口级别处理相关的redis服务器

>>> r.sadd('foo', *['a1', 'a2', 'a3'])
3
>>> r.sadd('bar', *['b1', 'a2', 'b3'])
3
>>> r.sdiffstore('foobar', 'foo', 'bar')
2
>>> r.smembers('foobar')
set(['a1', 'a3'])
>>> r.getnodefor('foo')
{'node_2': {'host': '127.0.0.1', 'port': 63792}}
>>> r.getnodefor('bar')
{'node_1': {'host': '127.0.0.1', 'port': 63791}}
>>> r.getnodefor('foobar')
{'node_2': {'host': '127.0.0.1', 'port': 63792}}
>>>

redis分片和redis拷贝

为了帮助将具有单个redis服务器的应用程序移动到redis服务器群集 这可以利用rediscluster,我写了redis-sharding 以及redis-copy

信息

作者

rediscluster-py由Salimane Adjao Moustapha开发和维护 (me@salimane.com)。可以在这里找到: http://github.com/salimane/rediscluster-py

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
添加组件后,java JTable为空   java将json发送到php并插入mysql,但返回null   java Spring引导JNDI CommonJ资源   从不同PC创建和合并后的Java servlet问题   java如何在使用findelements时从xpath获取文本   java使用spring boot使用gmail smtp发送电子邮件   java在不使用pojo、bean或getter和setter的情况下获取Json标题的Json数组   Java中的OpenFile对话框将null作为响应   JavaBuilder模式。扩展接口   java中无需替换的数据结构选取   java如何评价Encog中的预测神经网络   java如何在安卓中使用实际的HttpURLConnection进行单元测试?   java使用XML配置禁用WebSocket中的CSRF保护   java如何通过hibernate从多表查询中获取数据?   mysql如何在java中获取更新的行Id   java AEM/CQ组件单一组件/有限组件   java FFmpeg Javacv延迟问题   显示整数数组的java不起作用