专栏首页緣來來來Django使用redis缓存服务器

Django使用redis缓存服务器

redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,我在这里就不一一介绍了。关于和memcached具体可以看Django配置缓存机制

安装该数据库是为了做服务器缓存。以下两种情况都适合使用服务器缓存:

1)数据非经常更新。若每次都从硬盘读取一次,浪费服务器资源、拖慢响应速度。

2)数据更新频率较高,服务器负担比较大。

这些数据只需每天更新一次。而我每次都从数据库获取相应的数据,计算统计排行情况和阅读数。很明显浪费服务器资源,浪费时间。解决方法是定时统计一次数据,保存到数据库或文件中。每次读取数据从中获取。

若保存到数据库,还需要额外建立一张对应的表存储数据。在Django中建立表通常做法是建立一个模型。看似简单,问题调试麻烦、开发时长久。所以我一直拖着没处理该问题。毕竟一开始访问量不是很多。后来不少网友访客打开慢(当然服务器在国外也是个原因),查了资料发现Redis内存数据库。可以将数据写入到内存,再进行读写。减少计算量,可以有效提高服务器响应速度。

这么一来,我就不用创建新表创建模型。直接将数据写入缓存,定时更新。获取数据从服务器缓存获取即可。

下面我就来介绍如何在Django中配置使用redis数据库!

1、安装redis

在Ubuntu中执行下面这句命令:

sudo apt-get install redis-server

在Centos 中执行下面这句命令:

sudo yum install redis-server

读写数据之前,记得开启redis服务。否则会显示No connect未连接错误。

2、安装django-redis和settings配置

执行命令,即可安装:

pip install django-redis

这是一个开源的项目,github地址是 https://github.com/niwibe/django-redis。

目前django-redis已更新到4.10.0版本。安装完毕之后,给Django项目的settings.py文件添加如下配置。

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

LOCATION支持三种 URL scheme :

  • redis://: 普通的 TCP 套接字连接
  • rediss://: SSL 包裹的 TCP 套接字连接
  • unix://: Unix 域套接字连接

记住 LOCATION的配置不能是 127.0.0.1:6379 ,必须加上 Redis://,否则提示连接不上redis!

很多文章都是这样配置的:

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

这样是错误的,估计是老版本的原因,暂时不必深究!

作为 session backend 使用配置

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

3、测试redis缓存

该步骤非必须,只是为了测试看可否正常使用redis。

进入django的后台命令模式:

python manage.py shell

逐条输入如下命令测试:

from django.core.cache import cache #引入缓存模块
cache.set('key', 'value', 30*60)      #写入key为key,值为value的缓存,有效期30分钟
cache.has_key('key') #判断key为k是否存在
cache.get('key')     #获取key为k的缓存

测试没问题,则说明可正常使用。

4、redis缓存功能开发

这里需要考虑两个问题:

  • 写入redis的数据是什么形式?
  • 缓存时效多长?

redis支持字符串、列表、集合、字典等数据结构。经测试,可将Python的字典和列表直接存储。你也可以用json模块对字典和列表转化成字符串再存储。

至于缓存时效看具体情况,建议30分钟或者1小时更新一次。原本我考虑1天更新1次数据,但全球有很多个时区。不是每个时区都和我一样在0点的时候看到更新结果。我们是东八区,我们0点的时候,东九区是1点。所以,每1小时更新一次的频率较为合适,你可以直接设置60*60秒。而我需要整点的时候更新,需要再多一步计算到下一个整点还有多少秒。

读写redis缓存代码(这是重点):

def expire_view_cache(path, servername, serverport, key_prefix=None):
    '''
    刷新视图缓存
    :param path:url路径
    :param servername:host
    :param serverport:端口
    :param key_prefix:前缀
    :return:是否成功
    '''
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key

    request = HttpRequest()
    request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport}
    request.path = path

    key = get_cache_key(request, key_prefix=key_prefix, cache=cache)
    if key:
        logger.info('expire_view_cache:get key:{path}'.format(path=path))
        if cache.get(key):
            cache.delete(key)
        return True
    return False

若你想看看redis保存该数据的样子,可进入redis客户端查看。输入命令redis-cli进入客户端。

再分别输入keys * 查看有那些键,再输入get命令获取数据。结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL Server on Linux by Docker

    最开是测试连接是使用了 Navicat 和 SQL Server Management Studio 均无法比较正常的连接和使用,最后在网上查到了,使用VS c...

    李郑
  • 20W+喜爱的Pathview网页版 | 整合表达谱数据KEGG通路可视化

    前段时间介绍了一个R包 — Pathview。它可以整合表达谱数据并可视化KEGG通路,操作是先自动下载KEGG官网上的通路图,然后整合输入数据对通路图进行再次...

    生信宝典
  • MySQL数据库5事务、视图、触发器、函数、数据库的备份

    事务指一组操作要么成功要么失败,在成功修改数据前原来的数据不会受影响,如果修改成功则数据将被更改,如果失败,则原数据库数据不变。

    用户6817597
  • 用机器学习打造聊天机器人(三) 设计篇

    本项目基于chatterbot0.8.7来开发,但不仅于此。让我们先对chatterbot做一个简单的了解。

    程序员一一涤生
  • 在Kubernetes上运行有状态应用:从StatefulSet到Operator

    一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用。...

    SammyLiu
  • MySQL数据库2表的增删改查

    每个字段由若干按照某种界限划分的相同数据类型的数据项组成,这里指的数据表中的列,一列就是一个字段

    用户6817597
  • ANCWEB - 基于 ASP.NET CORE 2.0 的 WEB 开发

    VS code 中使用终端,并执行dotnet new webapi 指令创建 ASP.NET CORE WEB API 项目。

    李郑
  • MySQL数据库4Python操作mysql、索引、慢查询日志

    pymysql是通过python操作mysql的模块,需要先安装,方法:pip install pymysql

    用户6817597
  • 编程语言、IDE 与数据库市场如何?

    PYPL(PopularitY of Programming Language,编程语言流行指数)12 月份的榜单已经发布了。

    加米谷大数据
  • orm

    对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到...

    用户6817597

扫码关注云+社区

领取腾讯云代金券