【问题标题】:How to use connection pooling for redis.StrictRedis?如何为 redis.StrictRedis 使用连接池?
【发布时间】:2019-09-12 08:37:59
【问题描述】:

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

【问题讨论】:

    标签: python django redis


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2014-11-12
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多