| name | redis |
| description | Redis - in-memory database, caching, pub/sub, sessions, rate limiting, data structures |
| metadata | {"author":"OSS AI Skills","version":"1.0.0","tags":["redis","database","caching","pub-sub","sessions","rate-limiting","data-structures","nosql"]} |
Redis
Redis - in-memory data structure store, used as database, cache, and message broker.
Installation
pip install django-redis
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
Caching
Basic Configuration
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 50,
'retry_on_timeout': True,
},
'SOCKET_CONNECT_TIMEOUT': 5,
'SOCKET_TIMEOUT': 5,
},
'KEY_PREFIX': 'myapp',
'VERSION': 1,
}
}
Using Cache
from django.core.cache import cache
cache.set('key', 'value', timeout=300)
cache.set_many({'key1': 'value1', 'key2': 'value2'}, timeout=300)
value = cache.get('key')
value = cache.get('key', 'default_value')
cache.delete('key')
cache.delete_pattern('user_*')
View Caching
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
return render(request, 'template.html')
Template Fragment Caching
{% load cache %}
{% cache 500 sidebar request.user.id %}
<div class="sidebar">
<!-- Content to cache -->
</div>
{% endcache %}
Session Backend
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
Or with Redis directly:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
}
}
Celery Broker
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
Django Channels with Redis
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('127.0.0.1', 6379)],
},
}
}
Connection Pool
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 100,
},
'PASSWORD': 'your_password',
}
}
}
Redis CLI Commands
redis-cli
KEYS *
FLUSHDB
Best Practices
Connection Management
from django_redis import get_redis_connection
def get_redis():
return get_redis_connection("default")
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CONNECTION_POOL_KWARGS': {
'max_connections': 100,
'retry_on_timeout': True,
},
'SOCKET_CONNECT_TIMEOUT': 5,
'SOCKET_TIMEOUT': 5,
}
}
}
Key Design
KEY_PREFIX = 'myapp'
VERSION = 1
cache.set('temp_token', token, timeout=300)
cache.set('user:profile:123', data)
cache.set('user:session:123', data)
Performance
cache.set_many({
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
}, timeout=3600)
pipe = cache.client.get_client()
pipe.set('a', 1)
pipe.set('b', 2)
pipe.execute()
Error Handling
from django.core.cache import CacheKeyError
try:
value = cache.get('key')
except ConnectionError:
value = get_from_db()
Do:
- Always set TTL (expire keys)
- Use key prefixes for namespacing
- Reuse connections (don't create per request)
- Use pipeline for batch operations
Don't:
- Use KEYS * in production (blocks Redis)
- Store large values (>1MB consider compression)
- Use Redis as primary data store (it's a cache)
- Forget connection timeout settings
References