django_redis缓存
一,缓存的介绍
1,缓存是什么
缓存可以看做是访问数据时产生的临时文件或数据副本。
页面数据通常通过访问数据库取得并展示在页面上,同时访问页面的人数越多对数据库的压力越大,IO开销增大影响用户体验,因此我们保存该页面数据的副本到一个能快速访问到到容器内(通常是内存),以方便后续同样的页面请求使用,来降低数据库IO操作【注:内存里的IO通常快于磁盘IO】。
2,缓存的作用
3,Redis的应用
二,Django中Redis缓存的方案
1,页面缓存(cache_page装饰器)
优点:代码简单
@method_decorator(cache_page(30)) def myOrder(request): """ 我的订单页 :param request: :return: """ if request.method == 'GET': print('redisssss')
...
缺点:
1),无法控制内容权限,比如我有权去看这个页面你没有,那我访问后你再访问就有了缓存。
2),鉴权困难,得写专门的函数或者装饰器区分各种权限
3),删除缓存麻烦
2,局部缓存
视图函数myOrder通过取session的userid找到该用户并查找用户的订单信息,通过get_queryset函数判断是否存在订单信息的缓存,
如果有则取缓存数据返回到模板中,
如果没有则查询订单表后将QuerySet写入缓存中,再将其渲染到模板中。
如图所示(第一个红框是第一次访问视图函数myOrder,第二个红框是第二次视图函数myOrder,一次类推)
我们设置过期时间为20S,第一次访问时候Redis里没数据因此通过set将数据缓存下来,20S内访问了第二次和第三次,均取到了缓存中的数据,20S后缓存数据失效,因此重新查询到数据并返回给了缓存。
def get_queryset(currentUserId): key = "banners" orderQuerySet = cache.get(key) print('get+', orderQuerySet) if not orderQuerySet: orderQuerySet = Order.objects.filter(subscriber_id=currentUserId) cache.set(key, orderQuerySet, 20) print("set+", cache.get(key)) print("last+", orderQuerySet) print("+++++++++++++++++++++++") return orderQuerySet def myOrder(request): """ 我的订单页 :param request: :return: """ if request.method == 'GET': currentUserId = request.session.get('userid') orderQuerySet = get_queryset(currentUserId) # orderQuerySet = Order.objects.filter(subscriber_id=currentUserId) return render(request, 'introducer/introducerOrder.html', locals()) elif request.method == "POST": pass
优点:灵活(代码里编写缓存逻辑),存储成本最优
缺点:实现罗技较为复杂