2013-09-09 5 views
1

Я пытаюсь перевести часть системы сообщений в redis. У меня есть вопрос относительно управления подключением к redis от django. Ниже взято из quora:Предлагаемый способ реализации управления соединением redis в Django

При разговоре с Redis от Django (или, действительно, любой другой веб-каркас, я думаю) интересной задачей является решение, когда нужно подключиться и отключиться. Если вы создаете новое соединение для каждого запроса в Redis, это тонна ненужных накладных расходов, учитывая одностраничный запрос, который может сделать сотни запросов Redis. Если вы поддерживаете одно соединение открытым в потоке/процессе, вы получаете массу незакрытых соединений, которые могут привести к проблемам. Я также видел, что в клиентской библиотеке Redis выпадает случайная ошибка таймаута, что явно плохо. Лучший результат, который я получил, заключался в том, чтобы открыть одно соединение Redis в начале запроса, а затем закрыть его в конце - что может быть достигнуто с помощью промежуточного программного обеспечения Django. Он чувствует себя немного грязным, хотя нужно добавить часть промежуточного слоя, чтобы получить это поведение.

У кого-нибудь был шанс создать такое промежуточное ПО redis, я всегда за то, чтобы не изобретать колесо, но ничего не нашел в google, связанном с этой темой.

+0

Клиент python Redis уже реализует объединение пулов. Вам не нужно ничего делать, чтобы использовать его. См. Пример по адресу http://stackoverflow.com/questions/12967107/managing-connection-to-redis-from-python/12973514#12973514 –

ответ

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 (ключ).

 Смежные вопросы

  • Нет связанных вопросов^_^