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 作为缓存后端可以帮助你实现缓存的共享和一致性。
相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
陌上丨9 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
ValhallaCoder9 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话10 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽51212 小时前
Scrapy框架入门指南
python·scrapy
时艰.12 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
MZ_ZXD00112 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石13 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python