为了能够在我的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的连接?

最佳答案

您依次创建的每个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

关于python - 如何将连接池用于redis.StrictRedis?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57902876/

10-09 17:18
查看更多