在Django中使用Redis数据库做缓存

何为Redis?

redis是一个key-value存储系统。
首先我们需要了解redis能够做什么?
redis不单单可以做缓存,还可以做:排行榜、计算器、限速器、好友关系、简单消息队列、session服务器


在日常的项目开发中,当我们的数据库大起来之后,后台向数据库查找速度会变得很慢,这时候我们需要缓存来帮助我们提高浏览器的工作效率

动态网站存在一个基本权衡是——它们是动态的。每次用户请求一个页面,web 服务器需要提供各种各样的计算——从数据库查询到模板渲染再到业务逻辑——最后建立页面呈现给用户。从处理开销的角度来看,这比标准读取文件系统服务安排的开销要高得多。

我们可以缓存一些经过大量费事的计算结果

Django 带有一个强大的缓存系统,你可以将动态页面保存,这样不用每次请求页面时都计算。

Memcached

Memcached 是一个完全基于内存的缓存服务器,是 Django 原生支持的最快、最高效的缓存类型

  • 缓存也可以存储在数据库中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': '60' * 5    #缓存过期时间
    }
}

我们在setting配置文件输入这几行代码,location就是我们的缓存数据库名
在使用这个my_cache_table缓存数据库之前,必须先创建缓存表

python manage.py createcachetable

在terminal数据上面这个
然后可以写一个这样的代码验证一下

def news(request):
    result = cache.get('news')
    print(result)
    #如果cache中有缓存数据,则直接返回
    if result:
        return HttpResponse(result)
    else:
        news_list = []
        for i in range(10):
            news_list.append('你好你好%d' % i)
        sleep(5)
        data = {
            'news_list': news_list
        }
        response = render(request,'news.html',context=data)
        #如果cache中没有缓存数据,则存数据
        cache.set('news',response.content,timeout=60)
    return response

我们把cache命名为news,当我们进入这个执行这个方法时,先判断result是否存在,如果存在则说明cache存在,如果不存在,就把数据存入到news.html中,然后把页面的content设置为cache
如果我们有一个高效的数据库,我们就可以这样做,但是一般情况下,普通数据库并没有办法有效地应对真实情景才会出现的一些服务器崩溃之类的问题,如果我们服务器突然崩溃了,那这些缓存肯定就没了
所以我们需要一个高效的缓存数据库来提升服务器性能

Redis的使用:

其实redis在使用上跟普通数据库是差不多的,毕竟都是数据库,但是在使用redis之前我们还需要下载redis
https://www.cnblogs.com/xing-nb/p/12146449.html

这个地址完美地讲述了如何安装和使用redis,并提供了网盘法下载redis(我在github下载了好久下载不了…)
安装启动好之后,就开始配置啦

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379',  #缓存位置
        'OPTION': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',  #客户端类
        }
    }
}

记得要启动redis服务,配置好之后,测试代码跟上面的一样,不用改动


使用双数据库缓存机制:

我们还可以使用多缓存机制来继续提高运行效率:
首先在settings.py页面添加如下代码:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',  #缓存位置
        'TIMEOUT': 60
    },
    'redis_backend': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379',  #缓存位置
        'OPTION': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',  #客户端类
        }
    }
}

第一个default是普通数据库缓存,第二个redis_backends是redis数据库缓存

#@cache_page(60, cache='redis_backend')
def renews(request):
    cache = caches['redis_backend']
    result = cache.get('renew')
    if result:
        return HttpResponse(result)
    renews_list = []
    for i in range(10):
        renews_list.append('halouhalou%d' % i)
    sleep(5)
    data = {
        'renews_list': renews_list
    }
    response = render(request, 'renew.html', context=data)
    cache.set('renew', response.content, timeout=60)
    return response

这个代码的意思是既可以使用装饰器的方式,也可以使用cache = caches['redis_backend']的方式

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值