django使用redis设置首页数据缓存

上一篇文章讲了静态化页面,在Django项目中,除了这个优化方法,还有经常被使用的缓存技术,也是十分给力的优化方法,之前也有分享过redis的缓存,这次带来的是一个实战案例

开始吧
第一步当然是设置缓存数据库的配置啦
settings.py文件中:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION':"redis://127.0.0.1:6379/3",
        'OPTIONS':{
            "CLIENT_CLASS":"django_redis.client.DefaultClient",
        }
    }
}

ok,前提是你先去装个redis啊,至于怎么装,我想你应该有办法
然后编辑首页视图:

from django.core.cache import cache  #导入缓存对象
def index(request):
    # user = request.user
    context = cache.get('index_data') ,使用缓存取值办法
    if not context:  #如果无,则向数据库查询数据
        print('未使用缓存')
        goods = Goods.objects.filter(goods_status=constants.GOODS_STATUS_SELL,is_valid=True)[:3]
        top_art = Article.objects.filter(is_top=True).first()
        art = Article.objects.filter(status=constants.ARTICLE_STATUS_PASS,is_valid=True,is_best=True)
        slider = Slider.objects.all()
        context = {   #选出要缓存的数据,使用字典构造数据格式
            'art': art,
            'goods': goods,
            'slider': slider,
            'top_art': top_art,
        }
        cache.set('index_data',context,3600)  #设置缓存

    return render(request,'index.html',context)

那么我就把我首页的数据缓存起来了
但是当数据更新了怎么办呢?
我用的是xadmin后台,于是乎,重写xadmin方法

    def save_models(self):
        cache.delete('index_data')  #删除缓存,这里删除后,用户进入首页后会查询数据库再进行缓存添加
        obj = self.new_obj  #获取对象
        obj.save()  #保存

    def delete_models(self):
        cache.delete('index_data')
        obj = self.new_obj
        obj.save()

好了,使用redis的数据缓存就完成了,其实还没有,因为,我的首页数据有一部分是调用restframework写的接口的数据,那么这一块数据怎么缓存呢?
因为这一块数据并没什么像登录状态那样需要时时保持更新的数据,于是乎,直接用其已经定义好的缓存机制就可!!

from rest_framework_extensions.cache.mixins import CacheResponseMixin #导入缓存类
class UserWriteViewSet(CacheResponseMixin,viewsets.ModelViewSet): #继承

    queryset = UserWrite.objects.order_by('-created_at')[:3]
    serializer_class = UserWriteSerializer

继承自viewset家族的接口可以使用CacheResponseMixin 进行缓存
像APIView等,则可以使用装饰器

from rest_framework_extensions.cache.decorators import cache_response #导入缓存的装饰器
class ArticleBestApi(APIView):

    @cache_response()  #使用装饰器
    def get(self,request):
        params = request.query_params
        status = params.get('status') if params else ''
        if status == 'art_best':
            art_best_list = Article.objects.filter(is_best=True,is_valid=True, status=constants.ARTICLE_STATUS_PASS)[:3]
            serializer = ArticleBestSerializer(art_best_list,many=True)
            return Response(serializer.data)
        elif status == 'art_list':
            art_rank_list = Article.objects.order_by('-view_count')[:6]
            serializer = ArticleBestSerializer(art_rank_list,many=True)
            return Response(serializer.data)

        elif status == 'art_new':
            art_new_list = Article.objects.order_by('-created_at')[:1]
            serializer = ArticleBestSerializer(art_new_list,many=True)
            return Response(serializer.data)
        elif status == 'article':
            art_list = Article.objects.all()[:12]
            serializer = ArticleBestSerializer(art_list,many=True)
            return Response(serializer.data)

好了,完美实现了接口数据的缓存!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值