如何将连接池用于redis.StrictRedis?

时间:2019-09-12 08:37:59

标签: python django redis

为了能够在我的django应用程序中使用redis列表,我已经选择了redis.StrictRedis个连接,而不是stardard django cache.getcache.set。而且我经常在不同的功能中使用它。

我的示例代码如下:

 import redis
 r = redis.StrictRedis(unix_socket_path='/var/run/redis/redis.sock', db=3)
posts = r.lrange('posts', 0 , -1)

但是我遇到了一些性能问题(gunicorn线程在高负载下停滞,并且我经常遇到502)

我想这些是由于过多的redis.StrictRedis连接而不使用池。如果是这样,我想知道如何使用连接池而不是为每个数据提取建立与Redis的连接?

1 个答案:

答案 0 :(得分:1)

依次创建的每个Redis实例将创建它们自己的连接池。您可以使用Python中的单例设计来覆盖此行为,如下所示:

import redis

class RedisOperation(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
            cls.instance=redis.StrictRedis(connection_pool=pool)
        return cls.instance

obj1=RedisOperation()
print(id(obj1))

obj2 = RedisOperation()
print(id(obj2))

以上两个对象都引用相同的Redis连接池。

有关更多详细信息,请参阅redis docs