django使用redis

安装模块

pip install django-redis

原生redis不能存储drf序列化的结果,因为其结果不是字符串类型,所以使用django_redis
可以将django_redis理解为是redis的辅助工具,可以将drf序列化后的结果存入redis库中

django使用django_redis缓存数据库是通过内存管理来操作,所以需要导入django的内存管理cache

django的内存管理模块

from django.core.cache import cache

# 内存中设置值
cache.set(key, value, exp)
# 取值
cache.get(key)

django_redis的使用

  • settings.py
# 缓存配置 - redis存储:依赖 django-redis
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",  # 告诉Django使用redis为存储引擎,不再使用memcache
        "LOCATION": "redis://127.0.0.1:6379/7",  # 连入指定数据库 这里连接的是7号数据库
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}  # 最大连接数
        }
    }
}
  • views.py
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))  # 
# 存入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))  # 

应用:缓存接口

当接口的访问量大,且数据比较固定,建议建立缓存接口

利用redis内存数据库,将数据存入带redis中,有缓存时走缓存,每缓存时走数据,并在redis中存一份.

案例:

from rest_framework.generics import ListAPIView
from . import models, serializers


# 访问量大,且数据较固定的接口,建议建立接口缓存
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')[:3]
    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)

补充:

使用django-redis可以将DRF序列化结果存入redis

若要将图片存入redis,可以利用witho pen将图片读成二进制的形式再存

前后端不分离可以局部缓存,全局缓存,页面缓存

前后端分离一般就是缓存接口

缓存的问题:

会出现数据更新滞后

解决: 一般采用celery异步更新缓存中的内容

python操作redis - 不会钓鱼的猫 - 博客园

你可能感兴趣的:(Redis,django,redis,python)