Django 使用 Redis 实现全站缓存

想着提升下网站性能,开始学习折腾 Redis 缓存,记录下。

1. 安装 Redis

apt update
# 安装
apt install redis-server

2. Redis 参考配置

# 绑定本机(禁止外部访问)
bind 127.0.0.1 ::1

# 数据库数量
databases 5

# 持久化
save 900 1
save 300 10
save 60 10000

# 密码
requirepass XXOO.OOXX

# 内存限制
maxmemory 256mb

# 内存满时策略:删除最少使用的缓存
maxmemory-policy allkeys-lru

# 客户端配置
timeout 300
tcp-keepalive 300

3. 配置 django

# settings.py
# 全站缓存,必须保持在最前和最后
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    # ... 其他中间件 ...
    'django.middleware.cache.FetchFromCacheMiddleware',
]


# Redis配置
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': 'XXOO.OOXX',
            "SOCKET_CONNECT_TIMEOUT": 5,
            "SOCKET_TIMEOUT": 5,
        }
    }
}

CACHE_MIDDLEWARE_SECONDS = 21600
CACHE_MIDDLEWARE_KEY_PREFIX = 'Codenotes:'

4. 更新清理缓存

# admin.py
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'category', 'publish_date', 'author', 'hits', 'status')
    # 保存时清理
    def save_model(self, request, obj, form, change):
        obj.save()
        cache.clear()
    # 删除时清理
    def delete_model(self, request, obj):
        obj.delete()
        cache.clear()
    # 批量删除时清理
    def delete_queryset(self, request, queryset):
        queryset.delete()
        cache.clear()