Django-缓存

缓存

  • 提升服务器响应速度
  • 将执行过的操作数据存储下来,在一定时间内,再次获取数据的时候,直接从缓存中获取
  • 比较理想的方案,缓存使用内存级缓存
  • Django内置了缓存框架,并提供了几种常用的缓存
使用数据库进行缓存

1、创建缓存表

>>>python manage.py createcachetable my_cache_table

会发现数据库中自动创建好了my_cache_table的表:
在这里插入图片描述
2、缓存配置
settings.py中设置CACHES:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': 60 * 5,
    }
}

造一个news页面,模拟新闻条,views.py文件如下:

def news(request):
    news_list = list()
    for i in range(10):
        news_list.append('最近发生了一件大事%d' % i)
    time.sleep(5)
    data = {
        'news_list': news_list,
    }
    return render(request, 'news.html', context=data)

数据太少,无法体现缓存优势,用time.sleep(5)假装耗时操作。

3、缓存使用

  • 在视图函数上增加装饰器
from django.views.decorators.cache import cache_page
@cache_page(30)
def news(request):
    news_list = list()
    for i in range(10):
        news_list.append('最近发生了一件大事%d' % i)
        time.sleep(0.5)
    data = {
        'news_list': news_list,
    }
    return render(request, 'news.html', context=data)

再次访问app/news网站,第一次会缓慢加载,第二次会立即显示出数据:
在这里插入图片描述
可以看到,数据库中增加了加密过的数据,并且制定了过期时间:
在这里插入图片描述
缓存流程图如下:
在这里插入图片描述
大致流程:

  • 请求从客户端处走向views,然后走向cache中查看是否有数据,
  • 发现没有数据,再经过models从db中获取数据
  • 将获取到的数据保存一份到cache中 再从views经response返回到客户端;
  • 如果从cache中发现数据,就直接将cache中的数据返回给客户端

依据这个流程,我们可以自行设计cache:


自己实现缓存

代码如下:

from django.core.cache import cache

# @cache_page(30)
def news(request):

    result = cache.get("news")
    if result:
        return HttpResponse(result)

    news_list = list()
    for i in range(10):
        news_list.append('最近发生了一件大事%d' % i)
        time.sleep(0.5)
    data = {
        'news_list': news_list,
    }

    response = render(request, 'news.html', context=data)
    cache.set("news", response.content, timeout=60)

    return response

首先查看cache中是否存在相关数据,如果存在,直接将查询到的结果返回;
如果不存在,在正常的获取数据后,将"news"作为键,response.content作为值,设置cache。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值