redis键值存储集群的python接口
rediscluster的Python项目详细描述
redis键值存储集群的python接口。
项目目标
目标是rediscluster-py,以及rediscluster-php, 是要有一个一致的、兼容的客户端库 当以透明、快速和 容错方式。rediscluster-py基于 redis-py狭窄 因此,原始的Api命令在 redis服务器集群的上下文
安装
$ 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}} >>>
多个键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
信息
- 代码:git clone git://github.com/salimane/rediscluster-py.git
- 首页:http://github.com/salimane/rediscluster-py
- 错误:http://github.com/salimane/rediscluster-py/issues