首页 > 解决方案 > 如何为 redis.StrictRedis 使用连接池?

问题描述

为了能够在我的 django 应用程序中使用 redis 列表,我使用redis.StrictRedis连接而不是标准 djangocache.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 的连接?

标签: pythondjangoredis

解决方案


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


推荐阅读