一、缓存后端选型对比
特性 | Memcached | Redis |
---|---|---|
数据结构 | 简单键值存储 | 丰富数据结构(哈希/列表等) |
持久化支持 | 不支持 | 支持 |
最大内存管理 | 自动淘汰 | 可配置淘汰策略 |
集群支持 | 需要第三方工具 | 原生集群方案 |
适用场景 | 简单缓存场景 | 复杂缓存/会话/消息队列 |
二、Memcached 配置实战
- 安装依赖
# 使用pymemcache客户端(推荐)
pip install pymemcache
# 或使用pylibmc客户端
pip install pylibmc
2. 基础配置
# settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
'OPTIONS': {
'no_delay': True,
'ignore_exc': True,
'max_pool_size': 4,
'connect_timeout': 5,
}
}
}
3. 多节点配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': [
'cache1.example.com:11211',
'cache2.example.com:11211',
],
'OPTIONS': {
'use_pooling': True
}
}
}
三、Redis 配置实战
1. 安装依赖
pip install redis django-redis
2. 基础配置
# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "yourpassword",
"SOCKET_CONNECT_TIMEOUT": 5,
"COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
}
}
}
# 会话存储(可选)
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
3. 高可用配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": [
"redis://:password@master.example.com:6379/0",
"redis://:password@replica.example.com:6379/0"
],
"OPTIONS": {
"SENTINEL_SERVICE_NAME": "mymaster",
"CLIENT_CLASS": "django_redis.client.SentinelClient",
"CONNECTION_POOL_CLASS": "redis.sentinel.SentinelConnectionPool",
"CONNECTION_POOL_KWARGS": {
"max_connections": 100
}
}
}
}
四、缓存策略配置
1. 缓存超时设置
# 全局默认超时(秒)
CACHES['default']['TIMEOUT'] = 60 * 15
# 视图级设置
from django.views.decorators.cache import cache_page
@cache_page(60 * 5) # 5分钟缓存
def my_view(request):
...
2. 多缓存后端配置
CACHES = {
'default': {
# 主缓存配置
},
'page_cache': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/2',
'TIMEOUT': 60 * 60 * 24 # 24小时
}
}
五、生产环境最佳实践
1. 安全配置
# Redis密码保护
"OPTIONS": {
"PASSWORD": "strongpassword!123",
"SSL": True
}
# IP白名单
# 在Redis配置文件中配置
bind 127.0.0.1
protected-mode yes
2. 性能优化
# 连接池配置
"OPTIONS": {
"CONNECTION_POOL_KWARGS": {
"max_connections": 100,
"retry_on_timeout": True
}
}
# 禁用缓存击穿保护
"OPTIONS": {
"IGNORE_EXCEPTIONS": False
}
3. 监控指标
# Redis监控命令
redis-cli info stats | grep keyspace
redis-cli --latency -h 127.0.0.1 -p 6379
六、常见问题排查
1. 连接失败处理
# 测试Redis连接
python -m redis.cli ping -h 127.0.0.1
# 检查防火墙
sudo ufw allow 6379/tcp
2. 缓存未生效检测
# 在Django shell中测试
from django.core.cache import cache
cache.set('test_key', 'value', 60)
cache.get('test_key') # 应返回'value'
总结:
本教程详细讲解Django与Redis/Memcached
的集成方案,涵盖基础配置、生产优化、故障排查等全流程内容。建议根据业务需求选择缓存后端:
- 选择
Memcached
:当需要简单键值缓存且无需持久化时- 选择
Redis
:当需要数据结构支持/持久化/高可用特性时
扩展资源:
Django缓存官方文档
django-redis文档