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

优点:灵活(代码里编写缓存逻辑),存储成本最优

缺点:实现罗技较为复杂

 

posted @ 2022-01-12 00:17  puppet洛洛  阅读(385)  评论(1编辑  收藏  举报