我正在尝试将一些消息系统放到redis上。我有一个关于从django到redis的连接管理的问题。以下摘自quora:
当我从Django(或者其他任何其他网络框架,我想象)与Redis交谈时,一个有趣的挑战是决定何时连接和断开连接。 如果为Redis的每个查询建立新连接,那么考虑到单个页面请求可能会产生数百个Redis请求,这会产生大量不必要的开销。 如果在线程/进程中保持一个连接打开,则最终会出现大量未关闭的连接,从而导致出现问题。我还看到Redis客户端库偶尔会抛出超时错误,这显然很糟糕。 我得到的最好结果是在请求开始时打开一个Redis连接,然后在结束时关闭它 - 这可以通过Django中间件实现。虽然为了获得这种行为而必须添加一块中间件,但感觉有点脏。
有没有人有机会创建这样的redis中间件,我总是赞成不重新发明轮子,但在谷歌没有找到与此主题相关的任何内容。
答案 0 :(得分:1)
我实现了中间件:
import redis
from redis_sessions import settings
# Avoid new redis connection on each request
if settings.SESSION_REDIS_URL is not None:
redis_server = redis.StrictRedis.from_url(settings.SESSION_REDIS_URL)
elif settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH is None:
redis_server = redis.StrictRedis(
host=settings.SESSION_REDIS_HOST,
port=settings.SESSION_REDIS_PORT,
db=settings.SESSION_REDIS_DB,
password=settings.SESSION_REDIS_PASSWORD
)
else:
redis_server = redis.StrictRedis(
unix_socket_path=settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH,
db=settings.SESSION_REDIS_DB,
password=settings.SESSION_REDIS_PASSWORD,
)
class ReddisMiddleWare(object):
def process_request(self,request):
request.redisserver = redis_server
然后在视图中我只使用request.redisserver.get(key)。