python - 如何为 redis.StrictRedis 使用连接池?
问题描述
为了能够在我的 django 应用程序中使用 redis 列表,我使用redis.StrictRedis
连接而不是标准 djangocache.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 的连接?
解决方案
您创建的每个 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
推荐阅读
- android - 无法使用 Window.Callback 接收运动事件
- powershell - 在 Import-Csv 上排除一行
- android - com.google.android.gms:play-services-base 正在被其他各种库请求
- c# - 保存调用堆栈
- functional-programming - Ramda 中惯用的“obj.value = f(obj)”?
- identityserver4 - IdentityServer4 PersistedGrantStore - 如何存储刷新令牌
- mysql - MySQL Alter Table DB 冻结
- python - 如何在 python 中使用 spacy 库将句子转换为问题 [请参阅下面的代码进行更正]
- python - matplotlib.pyplot.contour 出了点问题
- symfony-3.4 - PhpSpreadsheet 将数据从 excel 导入数据库 symfony 3.4