django使用redis
django_redis
下载
>: pip install django-redis
说明
django连接django_redis后会顶替原memcache数据库
django使用django_redis缓存数据库是通过内存管理来操作,所以需要导入django的内存管理cache
补充:
原生redis不能存储drf序列化的结果,因为其结果不是字符串类型,所以使用django_redis
可以将django_redis理解为是redis的辅助工具,可以将drf序列化后的结果存入redis库中
补充知识: django内存管理
from django.core.cache import cache # 内存中设置值 cache.set(key, value, exp) # 取值 cache.get(key)
注:默认操作的是django的memcache内存数据库
使用
配置: settings/dev.py
# 缓存配置 - redis存储:依赖 django-redis CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/7", # 连入指定数据库 这里连接的是7号数据库 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # 最大连接数 } } }
案例:
import os, django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev") django.setup() from django.core.cache import cache from user.models import User from rest_framework.serializers import ModelSerializer class UserModelSerializer(ModelSerializer): class Meta: model = User fields = ['username', 'password'] # 获取用户对象 user_obj = User.objects.all().first() # 序列化 user_data = UserModelSerializer(user_obj).data print(user_data) # {'username': 'admin', 'password': 'pbkdf2_sha256$0oIWjJbH98M$tbYJl1ja25oSXOxv8WW8I8fxsb3/tZgbtgcDhUbTyuQ='} print(type(user_data)) # <class 'rest_framework.utils.serializer_helpers.ReturnDict'> # 存入redis内存数据库 cache.set(user_obj.username, user_data , 10) # 参数: key, value, 过期时间/秒 # 取出
res = cache.get(user_obj.username) print(res) # {'username': 'admin', 'password': 'pbkdf2_sha256$IWjJbH98M$tbYJl1ja25oSXOxv8WW8I8fxsb3/tZgbtgcDhUbTyuQ='} print(type(res)) # <class 'dict'>
缓存接口
当接口的访问量大,且数据比较固定,建议建立缓存接口
利用redis内存数据库,将数据存入带redis中,有缓存时走缓存,每缓存时走数据,并在redis中存一份.
案例:
from rest_framework.generics import ListAPIView from . import models, serializers from settings.const import BANNER_COUNT # 访问量大,且数据较固定的接口,建议建立接口缓存 from django.core.cache import cache from rest_framework.response import Response class BannerListAPIView(ListAPIView): queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders')[:BANNER_COUNT] serializer_class = serializers.BannerModelSerializer # 缓存有,走缓存,缓存没有走数据库 def list(self, request, *args, **kwargs): banner_data = cache.get('banner_list') if not banner_data: print('走数据库') response = super().list(request, *args, **kwargs) banner_data = response.data # 建立缓存,不建议设置缓存过期时间,用celery等框架后台异步更新缓存即可 cache.set('banner_list', banner_data) return Response(banner_data)