由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。
缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
Django提供了6种缓存方式:
这里不多介绍,有兴趣的可以去看看官方文档:
Django’s cache framework | Django documentation | Django
安装:pip install django-redis
1、到settings文件中进行配置
#配置redis缓存,使用django-redis模块,重写文件缓存类中的所有方法
CACHES={
"default":{
"BACKEND":"django_redis.cache.RedisCache",
#使用的redis数据
"LOCATION":"redis://192.168.137.10:6379",
"OPTIONS":{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
#连接池最大数值
"CONNECTION_KWARGS":{"max_connection":100},
#"PASSWORD":'12334'redis的密码
}
}
}
2、使用方法:在视图类中或序列化器中使用
2.1、直接通过cache来使用redis数据库
# 使用cache不需要考虑数据类型,导入cache
from django.core.cache import cache
#使用通过cache操作到redis,通过cache操作redis数据库
cache.set('name','lqz1')
2.2、通过拿到redis的链接操作redis数据库,跟直接操作redis数据库的语法一样,要考虑数据类型
from django_redis import get_redis_connection
con = get_redis_connection('default')
con.set('name','lhz',ex=5*60)
Python在于Redis交互,存进去的是字符串类型的数据,取出来却是字节类型(Byte)的,这是由于python3的与Redis交互的驱动问题,Python2取出来的就是字符串类型的。那么针对这种情况,我们常常需要对取出的数据进行decode操作,如下:
conn = get_redis_connection()
code = conn.get(phone)
if not code:
raise ValidationError('验证码过期')
# 配置"decode_responses": True 后就不需要每次都decode('utf-8)
if value != code.decode('utf-8'):
raise ValidationError('验证码错误')
通过decode将Byte转换为字符串类型,但是每次都这么做比较繁琐。因此,在用django-redis时,可以对其进行配置,使得自动转换。
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {
"decode_responses": True,
"max_connections": 100
},
# "PASSWORD": "密码",
}
}
}
我们通过对连接池参数 decode_responses进行配置为True,从而实现自动转换。