Django por defecto maneja las sesiones en un tabla llamada django_session
por lo que cada vez que accedemos a la sesión se hace una consulta a la base de datos, esto no es eficiente cuando a nuestro proyecto acceden miles de usuarios, para esto debemos guardar las sesiones en un lugar de rápido acceso, redis al ser una base de datos que se ejecuta en memoria es una buena opción para almacenar las sesiones.
Django puede guardar las sessiones en varios tipos de almacenamiento:
- Base de datos (por defecto)
- Cache
- Archivos
Para este caso usaremos el almacenamiento basado en cache, ya que podemos usar un backend de cache basado en redis, para configurar redis como backend de cache puedes revisar este post.
Una vez configurado redis debemos agregar unas lineas a nuestro proyecto en el archivo settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
Con esto le decimos a django que use la cache para guardar las sesiones, solo con esta configuración django ya guardará las sesiones en redis.
El problema con esta configuración es que django esta guardando la cache y las sesiones en la misma base de datos, por lo que cuando limpiemos la cache tambien se perderán las sesiones guardadas, para evitar esto podemos decirle a django que guarde a cache en una base de datos y las sesiones en otra.
Django tiene una variable en la cual podemos especificar un alias para acceder a una configuración diferente de la usada en la cache.
SESSION_CACHE_ALIAS = 'session'
Con esto le decimos a django que use la configuración session de las disponibles en la variable CACHES
CACHES = {
'default': {
'BACKEND': 'redis_cache.RedisCache',
'LOCATION': 'localhost:6379',
'OPTIONS': {
'DB': 0,
'PASSWORD': '',
'PARSER_CLASS': 'redis.connection.HiredisParser',
'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
'CONNECTION_POOL_CLASS_KWARGS': {
'max_connections': 50,
'timeout': 20,
}
},
},
'session': {
'BACKEND': 'redis_cache.RedisCache',
'LOCATION': 'localhost:6379',
'OPTIONS': {
'DB': 1,
'PASSWORD': '',
'PARSER_CLASS': 'redis.connection.HiredisParser',
'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
'CONNECTION_POOL_CLASS_KWARGS': {
'max_connections': 50,
'timeout': 20,
}
},
}
}
La configuración default es la que se usa en django para guardar la cache por lo que en la configuración session le especificamos que acceda a otra base de datos de redis, asi podemos mantener separada la data de cache y de sesión por lo que si limpiamos la cache las sesiones se mantendrán.