在 Django Rest Framework (DRF) 中缓存接口的数据,并将缓存存储在 Redis 中,通常的做法是使用 Django的缓存框架 ,配合 Redis 作为缓存后端。并且实现缓存数据的更新策略 ,即:如果数据库中的数据变化,更新缓存,否则使用缓存中的数据。
步骤一:安装依赖
首先,你需要安装 Django Redis 和 Django 缓存框架。
bash
pip install django-redis
步骤二:配置 Django 缓存后端为 Redis
在你的 settings.py 中,配置 Django 缓存 使用 Redis 后端:
python
# settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1', # Redis 地址,/1 表示 Redis 的 DB 1
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# 设置缓存过期时间(例如 5 分钟)
CACHE_TTL = 60 * 5 # 5 minutes
步骤三:在 DRF 中使用缓存
接下来,你可以在 DRF 的 视图 中缓存数据。这里用到的是 Django的缓存 API ,你可以使用 cache.set 和 cache.get 来存取 Redis 缓存。
假设你有一个接口,需要缓存查询的数据:
python
from rest_framework.views import APIView
from rest_framework.response import Response
from django.core.cache import cache
from myapp.models import Product
from django.conf import settings
class ProductListView(APIView):
def get(self, request):
cache_key = 'product_list' # 设置缓存的唯一键
# 检查缓存中是否已有数据
cached_data = cache.get(cache_key)
if cached_data:
# 如果缓存存在,直接返回缓存数据
return Response(cached_data)
# 如果缓存没有数据,从数据库获取
products = Product.objects.all()
# 序列化数据
product_data = [{'id': product.id, 'name': product.name} for product in products]
# 将数据缓存到 Redis
cache.set(cache_key, product_data, timeout=settings.CACHE_TTL)
return Response(product_data)
解释:
- 检查缓存: 使用
cache.get(cache_key)从 Redis 中获取缓存数据。 - 缓存不存在: 如果缓存不存在,则从数据库查询数据。
- 缓存数据: 使用
cache.set(cache_key, product_data, timeout)将查询结果存储到 Redis 中。缓存的过期时间由settings.CACHE_TTL配置(例如 5 分钟)。
步骤四:处理数据变化时更新缓存
当数据库中的数据发生变化(如增删改),你需要清除或更新相应的缓存。
1. 数据更新时清除缓存
在数据修改后(如 Product 增、删、改操作后),你可以清除缓存,使下一次查询时重新从数据库加载数据:
python
from django.core.cache import cache
from myapp.models import Product
def update_product(product_id, new_data):
product = Product.objects.get(id=product_id)
# 更新数据
product.name = new_data['name']
product.save()
# 数据更新后,删除缓存
cache.delete('product_list') # 清除缓存
2. 监听模型变化并自动更新缓存
你也可以使用 Django 信号 (post_save, post_delete) 来在数据变动时自动更新缓存。
python
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.core.cache import cache
from myapp.models import Product
@receiver(post_save, sender=Product)
@receiver(post_delete, sender=Product)
def clear_product_cache(sender, instance, **kwargs):
# 清除缓存
cache.delete('product_list')
说明:
post_save: 当Product模型的对象保存时(增、改操作),调用clear_product_cache清除缓存。post_delete: 当Product模型的对象删除时,清除缓存。
步骤五:缓存失效策略
如果你希望缓存的失效时间(TTL)自动更新,可以使用缓存的 "滑动过期时间"。例如,设置每次读取缓存时,都会刷新缓存的过期时间:
python
cache.set(cache_key, product_data, timeout=settings.CACHE_TTL)
也可以选择不设置过期时间,依赖 Redis 默认的缓存过期策略。
总结
- 使用
django-redis配置缓存,设置 Redis 作为缓存后端。 - 在 DRF 视图中使用
cache.get和cache.set存取缓存数据。 - 数据变动时清除或更新缓存,确保数据一致性。
- 使用 Django 信号
post_save和post_delete来监听数据变化,自动清理缓存。
进阶:
- 缓存预热:可以使用定时任务(如 Celery)来定期刷新缓存,保持缓存数据的"新鲜度"。
- 分布式缓存:如果你有多个服务器实例,Redis 作为缓存后端可以帮助你实现缓存的共享和一致性。