python之redis-cluster

来源:互联网 发布:js正则表达式\s 编辑:程序博客网 时间:2024/05/16 03:32

redis有2种部署方式,单点和cluster。

生产中为避免单点故障丢失数据都会部署为cluster,最近有用到python开发涉及到操作redis的操作。简单封装了下,可以在传参的时候确定是连接哪种模式。

需要安装的python插件:

redis-2.10.6 (redis-2.10.3 )

redis-py-cluster-1.3.4

详见代码:

class myRedis(object):
    def __init__(self,redis_type=None,**args):
        if redis_type == "cluster":
            import rediscluster
            self.r_conn = rediscluster.StrictRedisCluster(**args)
        else:
            import redis
            self.r_conn = redis.StrictRedis(**args)
           
   
    def GetValue(self,name):
        return self.r_conn.get(name)
       
    def IncrValue(self,name):
        return self.r_conn.incr(name)

    def SetValue(self,name,value):
        self.r_conn.set(name,value)
       
    def GetSetValue(self,name,value):
        return self.r_conn.getset(name,value)
       

if __name__ == '__main__':  

    #单点
    conn_dict={'host':'127.0.0.1', 'port':6379}
    redis_type='single'
    myredis = myRedis(redis_type,**conn_dict)
    print(myredis.SetValue('name','test'))
    print(myredis.GetValue('name'))
    print(myredis.GetSetValue('name1',0))
    print(myredis.GetValue('name'))
   
    #cluster
    conn_dict={"startup_nodes":[{'host':'127.0.0.1', 'port':9001},{'host':'127.0.0.1', 'port':9002},{'host':'127.0.0.1', 'port':9003}]}
    redis_type='cluster'
    myredis = myRedis(redis_type,**conn_dict)
    print(myredis.SetValue('name','test'))
    print(myredis.GetValue('name'))
    print(myredis.GetSetValue('name',0))
    print(myredis.GetValue('name'))


1、操作单点的的时候,没有问题。


2、操作cluster模式的时候,报了一个错误:

Traceback (most recent call last):
  File "2.py", line 18, in <module>
    redis_cluster()
  File "2.py", line 10, in redis_cluster
    redisconn = rediscluster.RedisCluster(startup_nodes=redis_nodes,decode_responses=True)
  File "/home/zt/mypy/soft/py273/lib/python2.7/site-packages/rediscluster/client.py", line 181, in __init__
    **kwargs
  File "/home/zt/mypy/soft/py273/lib/python2.7/site-packages/rediscluster/connection.py", line 141, in __init__
    self.nodes.initialize()
  File "/home/zt/mypy/soft/py273/lib/python2.7/site-packages/rediscluster/nodemanager.py", line 194, in initialize
    raise RedisClusterException("ERROR sending 'cluster slots' command to redis server: {0}".format(node))


然后在分析nodemanager.py源码,然后发现cluster也导入了redis的进行的连接,自己安装的版本是redis-2.10.3,然后换成了redis-2.10.6,问题就解决了。

redis-2.10.3版本在连接redis有一些问题。所以需要升级。



原创粉丝点击