前言
drf框架缓存,可以使用数据库缓存,也可以使用redis缓存,用以对更新不是特别频繁的大批量数据进行缓存,
加快接口响应时间,不建议使用全局缓存,因为全局缓存不够灵活,数据不能正确响应。
本例使用redis缓存,因为redis为内存型数据库,性能更佳
一、依赖
pip install django-redis
pip install drf-extensions
二、配置使用redis
在settings中配置如下:
CACHES = {
'default': {
# 指定缓存使⽤的引擎为redis
'BACKEND': 'django_redis.cache.RedisCache',
# 缓存地址,有密码
# 'LOCATION':'redis://:123456@127.0.0.1:6379/2',
# 缓存地址,无密码
'LOCATION': 'redis://127.0.0.1:6379/2',
}
}
三、封装使用
1.封装缓存类
新建文件django-cache.py, 加入下方代码
# coding=utf-8
"""
用来缓存django接口数据,解决接口响应过慢问题
"""
from django.core.cache import cache
class DjangoCache(object):
def save_cache(self, key, value, timeout):
"""
保存缓存
"""
cache.set(key, value, timeout)
def get_cache(self, key):
"""
获取缓存
"""
return cache.get(key)
def delete_cache(self, key):
"""
清除缓存
"""
cache.delete(key)
def delete_cache_func(self, key):
"""
清除缓存的装饰器
"""
def f1(func):
def f2(*args, **kwargs):
print(f'清除缓存,key:{key}')
# 再方法调用之前清除掉缓存
self.delete_cache(key)
res = func(*args, **kwargs)
return res
return f2
return f1
django_cache = DjangoCache()
2.接口中数据使用缓存
在接口中开始的地方加入如下代码,从缓存中获取数据
@action(detail=False, methods=['GET'])
def query_step(self, request, *args, **kwargs):
key = request.path
data = django_cache.get_cache(key) # 首先从缓存中去找,如果找不到再去生成
if data:
print('使用缓存')
return Response(data=data)
...
在结束的地方加入如下代码将接口数据添加至缓存,
key是唯一键,res_dict为需要缓存的数据,5代表5秒钟过期时间
# 加入缓存
...
django_cache.save_cache(key, res_dict, 5) # 5秒钟过期时间
return Response(data=res_dict)
3.在修改删除等影响数据更新的地方加上装饰器,删除掉缓存中的数据
这里如果用到request中的参数,也可以调整装饰器,通过装饰器中的args, kwargs获取request中的参数,
从而获取指定key值
![在这里插入图片描述](https://img-blog.csdnimg.cn/ebf664df41974580a437939817d379c0.png
总结
个人感觉django框架缓存,对于动态变化的数据,应该有更好的封装,本例只是用了一个笨方法来清除缓存,达到动态刷新数据的目的,有更好的方法,请大家指教