大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版。
在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com
从进阶篇开始,每一篇文章都是干货满满。这一节,我们来继续说,在Django中,如何使用Redis来做缓存处理
皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_04”。
在我们的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
这样就说明已经成功了。
Redis在CentOS里面的配置文件叫redis.conf
,它的路径为/etc/redis.conf
:
你可以根据自己的需求,去修改配置文件当中的配置,这里给大家找了一篇不错的文章,可以参考:
《redis最全配置讲解》:https://www.cnblogs.com/metu/p/9609604.html
获取整套教程源码唯一途径,可以关注『皮爷撸码』,回复『peekpa.com』
虽然我们要使用Redis在CentOS服务器上,但是我们的日常开发还是在我们本地的机器上面,所以,我们需要在本地安装Redis。
Windows版本的Redis,只需要从github上下载下来源码即可,具体步骤如下:
Redis-x64-3.0.504.zip
,或者其他版本也可以。下载地址:https://github.com/MicrosoftArchive/redis/releasesLinux和Mac安装也是一样的:
src/redis-server
;当你出现这个画面,就代表你的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,我们首先需要通过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
:
$ 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获取到数据,然后将结果返回我们前端。
可以看到上述过程中,最费时的就是从数据库读取数据。这里我们就可以考虑,将数据库的数据可以放到缓存当中,反正数据也不常常更新,缓存一段时间也是可以的。
我们来看一下没有缓存,我们的网络请求需要消耗多久:
总共用时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
这回我们再刷新两下,就会发现第二次的请求:
时间只消耗了27ms,速度提升了10倍。
我们上面设置的过期时间是60秒,当一分钟之后我们再刷新,我们就能看到:
可以发现,当时间超过的时候,我们的请求时间又上去了,但是当一次读取数据,然后将数据放入到缓存中,我们再次读取的时候,数据就又出来了。
这个时候,我们再去我们的redis-cli
里面,通过命令keys *
来看一下我们的数据是否真正的存储在了Redis中:
可以看到,里面有一个key为":1:jpEarth"
的键值对,这里面存储的就是我们刚才放入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
的情况:
多了一个名字非常长的key。从名字我们就能看出来,这个key其实就是我们的session。
是不是非常的方便而且快捷?
我将会在正式的代码里面封装一下这个Cache,让他变得更加好用,想要知道最终这个长什么样子的?可以去代码当中,获取方法在文末,代码则是需要查看Tag为Advanced_04
的代码。
最终页面成为了这个样子,可以显示数据来源(如果数据来自数据库,则会显示Database;来自缓存,则会显示Cache):
最后总结一下,
如何在Django中使用Redis做缓存:
django-redis
;settings.py
文件中,设置CACHES
变量;django.core.cache
中的cache.get(key)
和cache.set(key,value,expire_time)
方法来实现读取缓存和设置缓存;获取整套教程源码唯一途径,可以关注『皮爷撸码』,回复『peekpa.com』
长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞,在看,转发三连走一发,这是对我原创内容输出的最大肯定。