Django缓存接口数据

Django Rest Framework (DRF) 中缓存接口的数据,并将缓存存储在 Redis 中,通常的做法是使用 Django的缓存框架 ,配合 Redis 作为缓存后端。并且实现缓存数据的更新策略 ,即:如果数据库中的数据变化,更新缓存,否则使用缓存中的数据。

步骤一:安装依赖

首先,你需要安装 Django RedisDjango 缓存框架

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.setcache.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)

解释:

  1. 检查缓存: 使用 cache.get(cache_key) 从 Redis 中获取缓存数据。
  2. 缓存不存在: 如果缓存不存在,则从数据库查询数据。
  3. 缓存数据: 使用 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_saveProduct 模型的对象保存时(增、改操作),调用 clear_product_cache 清除缓存。
  • post_deleteProduct 模型的对象删除时,清除缓存。

步骤五:缓存失效策略

如果你希望缓存的失效时间(TTL)自动更新,可以使用缓存的 "滑动过期时间"。例如,设置每次读取缓存时,都会刷新缓存的过期时间:

python 复制代码
cache.set(cache_key, product_data, timeout=settings.CACHE_TTL)

也可以选择不设置过期时间,依赖 Redis 默认的缓存过期策略。


总结

  1. 使用 django-redis 配置缓存,设置 Redis 作为缓存后端。
  2. 在 DRF 视图中使用 cache.getcache.set 存取缓存数据。
  3. 数据变动时清除或更新缓存,确保数据一致性。
  4. 使用 Django 信号 post_savepost_delete 来监听数据变化,自动清理缓存。

进阶:

  1. 缓存预热:可以使用定时任务(如 Celery)来定期刷新缓存,保持缓存数据的"新鲜度"。
  2. 分布式缓存:如果你有多个服务器实例,Redis 作为缓存后端可以帮助你实现缓存的共享和一致性。
相关推荐
昔时扬尘处2 小时前
【题外话】台式机配件选型与组装流程
python·电脑·台式机
小鸡吃米…2 小时前
带 Python 的人工智能——神经网络
人工智能·python·神经网络
谅望者2 小时前
数据分析笔记15:Python模块、包与异常处理
开发语言·人工智能·python
2301_781143562 小时前
python学习(一)
python·学习
lbb 小魔仙2 小时前
FP8魔力解锁:SD3.5 图像编辑、修复与增强全栈实战
人工智能·python·ai
爱学习的小道长2 小时前
Ubuntu Python 使用 Redis 缓存
python·ubuntu·缓存
徐先生 @_@|||2 小时前
三式掌握知识法
java·python
黎雁·泠崖2 小时前
C 语言联合体与枚举:共用内存 + 常量枚举 + 实战
c语言·开发语言·python
yousuotu2 小时前
基于Python实现亚马逊销售数据分析与预测
开发语言·python·数据分析