为了能够在我的django应用程序中使用redis列表,我已经选择了redis.StrictRedis
个连接,而不是stardard django cache.get
和cache.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的连接?
答案 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