用Django全栈开发(进阶篇)——04. 在Django中加入Redis

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版

在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com

从进阶篇开始,每一篇文章都是干货满满。这一节,我们来继续说,在Django中,如何使用Redis来做缓存处理

皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_04”。

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第1张图片

CentOs安装Redis

在我们的CentOS服务器安装Redis非常的简单,遵照以下命令一行一行执行就可以:

# 添加EPEL仓库,并且更新yum
$ sudo yum install epel-release
$ sudo yum update

# 直接安装redis
$ sudo yum install redis

# 启动redis
$ sudo systemctl start redis

# 如果想要redis随着系统启动而启动,则使用以下命令
$ sudo systemctl enable redis

这样就安装完成了。想要检测Redis是否启动成功,直接输入以下命令:

$ redis-cli ping

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第2张图片

这样就说明已经成功了。

Redis在CentOS里面的配置文件叫redis.conf,它的路径为/etc/redis.conf

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第3张图片

你可以根据自己的需求,去修改配置文件当中的配置,这里给大家找了一篇不错的文章,可以参考:

《redis最全配置讲解》:https://www.cnblogs.com/metu/p/9609604.html

获取整套教程源码唯一途径,可以关注『皮爷撸码』,回复『peekpa.com』

本地安装Redis

虽然我们要使用Redis在CentOS服务器上,但是我们的日常开发还是在我们本地的机器上面,所以,我们需要在本地安装Redis。

Windows安装

Windows版本的Redis,只需要从github上下载下来源码即可,具体步骤如下:

  1. 下载Redis,文件名为Redis-x64-3.0.504.zip,或者其他版本也可以。下载地址:https://github.com/MicrosoftArchive/redis/releases
  2. 将下载的压缩包解压到一个文件夹中,路径最好不要有中文;
  3. 打开cmd指令窗口
  4. 输入你刚才解压的文件路径
  5. 然后输入redis-server redis.windows.conf 命令
  6. redis就启动了。
Linux,Mac安装

Linux和Mac安装也是一样的:

  1. 从官网下载Redis文件,下载地址:https://redis.io/download
  2. 将下载的文件解压缩;
  3. 打开终端;
  4. 进入到刚才解压缩的文件当中;
  5. 输入命令:src/redis-server;
  6. Redis在本地启动成功。

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第4张图片

当你出现这个画面,就代表你的Redis已经安装成功了。

Redis简单操作

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

所以,这里给大家罗列一下Redis的简单操作,操作命令都是在redis-cli里面输入的:

# 设置key-value:
> set key value

# 读取key-value:
> get key

# 罗列系统里的key:
> keys *

# 删除key-value:
> del key

# 删除所有的key-value:
> flushall

# 设置过期时间:
> expire key timeout(单位为秒)
# 也可以在设置值的时候,一同指定过期时间:
> set key value EX timeout

# 查看过期时间:
> ttl key

# 查看当前redis中的所有key:
> keys *

# 列表操作:
# 在列表左边添加元素:
> lpush key value

# 在列表右边添加元素:
> rpush key value

# 查看列表中的元素:
> lrange key start stop

# 移除并返回列表key的头元素:
> lpop key

# 移除并返回列表的尾元素:
> rpop key

# 移除并返回列表key的中间元素:
> lrem key count value

# 指定返回第几个元素:
> lindex key index

# 获取列表中的元素个数:
> llen key

# 删除指定的元素:
> lrem key count value

# set集合的操作:
# 添加元素:
> sadd set value1 value2....

# 查看元素:
> smembeers set

# 移除元素:
> srem set member...

# 查看集合中的元素个数:
> scard set

# 获取多个集合的交集:
> sinter set1 set2

# 获取多个集合的并集:
> sunion set1 set2

# 获取多个集合的差集:
> sdiff set1 set2

# hash哈希操作:
# 添加一个新值:
> hset key field value

# 获取哈希中的field对应的值:
> hget key field

# 删除field中的某个field:
> hdel key field

# 获取某个哈希中所有的field和value:
> hgetall key

# 获取某个哈希中所有的field:
> hkeys key

# 获取某个哈希中所有的值:
> hvals key

# 判断哈希中是否存在某个field:
> hexists key field

# 获取哈希中总共的键值对:
> hlen field

Python使用Redis

Python使用Redis,我们首先需要通过pip来安装python-redis:

$ pip install redis

然后,通过Python使用Redis也非常的简单,这里给大家简单罗列一下:

# 从redis包中导入Redis类
 from redis import Redis
 # 初始化redis实例变量
 xtredis = Redis(host='127.0.0.1',port=6379)
 
 # 添加一个值进去,并且设置过期时间为60秒,如果不设置,则永远不会过期
 xtredis.set('username','xiaotuo',ex=60)
 # 获取一个值
 xtredis.get('username')
 # 删除一个值
 xtredis.delete('username')
 
 # 给languages这个列表往左边添加一个python
 xtredis.lpush('languages','python')
 # 给languages这个列表往左边添加一个php
 xtredis.lpush('languages','php')
 # 给languages这个列表往左边添加一个javascript
 xtredis.lpush('languages','javascript')
 
 # 给集合team添加一个元素xiaotuo
 xtredis.sadd('team','xiaotuo')
 # 给集合team添加一个元素datuo
 xtredis.sadd('team','datuo')
 # 给集合team添加一个元素slice
 xtredis.sadd('team','slice')
 
 # 给website这个哈希中添加baidu
 xtredis.hset('website','baidu','baidu.com')
 # 给website这个哈希中添加google
 xtredis.hset('website','google','google.com')

这里面有些东西,我们会在后面结合Celery一起说。今天的内容是要用Redis来给我们的Django做缓存,所以,我们赶紧进入今天的正题。

Django使用Redis做缓存

Django使用Redis做缓存,其实非常的简单。

我们首先安装django-redis

$ pip install django-redis

接下来,我们需要在Peekpa/settings.py文件里面配置CACHES:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",    #redis的地址
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}  #池的个数
        }
    }
}

接下来,我们就可以在我们的系统之中使用缓存了。使用缓存需要从django.core.cache包里面导入cache,然后:

  • 设置缓存:cache.set(redis_key, data, expire_time)
  • 读取缓存:cache.get(redis_key)

这里我们就拿我们之前的地震信息来做一下对比。

我们之前数据中心的日本地震信息,当用户点击了网页,我们的后端服务器接收到用户的请求,然后开始执行代码,其中执行到需要读取远端MongoDB服务器获取数据的时候,这里我们的服务器其实一直都是在阻塞的状态,直到成功从MongoDB获取到数据,然后将结果返回我们前端。

可以看到上述过程中,最费时的就是从数据库读取数据。这里我们就可以考虑,将数据库的数据可以放到缓存当中,反正数据也不常常更新,缓存一段时间也是可以的。

我们来看一下没有缓存,我们的网络请求需要消耗多久:

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第5张图片

总共用时342毫秒,这个其实已经很耗时间了。当然,这其中的时间消耗,不仅仅只是读取数据,还和数据库的读取方式有关系,以及网络传输也是需要消耗时间的。

但是,如果我们这里将我们的读取数据库的代码加上缓存,再来试一试:

def get_data_from_db(self, handle_type, search_key):
    if handle_type == self.TYPE_ALL:
    result = cache.get("jpEarth")
        if not result:
            result = list(self.collection.find())
            cache.set("jpEarth", result, 60)
    return result

这回我们再刷新两下,就会发现第二次的请求:

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第6张图片

时间只消耗了27ms,速度提升了10倍。

我们上面设置的过期时间是60秒,当一分钟之后我们再刷新,我们就能看到:

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第7张图片

可以发现,当时间超过的时候,我们的请求时间又上去了,但是当一次读取数据,然后将数据放入到缓存中,我们再次读取的时候,数据就又出来了。

这个时候,我们再去我们的redis-cli里面,通过命令keys *来看一下我们的数据是否真正的存储在了Redis中:

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第8张图片

可以看到,里面有一个key为":1:jpEarth"的键值对,这里面存储的就是我们刚才放入Redis中的数据库的内容。

是不是非常的简单。

Session使用Redis做缓存

在Django中,每一个Session也是可以在Redis中做缓存的。默认的Session缓存会在你系统的数据库中,记不记得我们的数据库中就有一张名为session的表,里面存储的就是session的关系。

在需要使用Session的地方,如果每次都调用数据库,将会非常的耗时。

这里我们可以把Session放到Redis中,放置的方法非常简单,只需要在Peekpa/settings.py文件中添加如下两行就可以:

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

这个时候,我们在访问网站之后,我们再去Redis-cli里面查看keys的情况:

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第9张图片

多了一个名字非常长的key。从名字我们就能看出来,这个key其实就是我们的session。

是不是非常的方便而且快捷?

我将会在正式的代码里面封装一下这个Cache,让他变得更加好用,想要知道最终这个长什么样子的?可以去代码当中,获取方法在文末,代码则是需要查看Tag为Advanced_04的代码。

最终页面成为了这个样子,可以显示数据来源(如果数据来自数据库,则会显示Database;来自缓存,则会显示Cache):

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第10张图片

技术总结

最后总结一下,

如何在Django中使用Redis做缓存:

  1. 通过pip安装django-redis
  2. settings.py文件中,设置CACHES变量;
  3. 通过调用django.core.cache中的cache.get(key)cache.set(key,value,expire_time)方法来实现读取缓存和设置缓存;
  4. 进阶篇的在Django中加入Redis总结完毕。

获取整套教程源码唯一途径,可以关注『皮爷撸码』,回复『peekpa.com』

长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞在看转发三连走一发,这是对我原创内容输出的最大肯定。

用Django全栈开发(进阶篇)——04. 在Django中加入Redis_第11张图片

你可能感兴趣的:(Django,Peekpa.com,Python)