如果python版本是3.6+,可以使用hiredis库对redis进行优化。
hiredis官方介绍是:
[翻译]:Python扩展,将协议解析代码包装在hiredis中。它主要加快了多批量回复的解析速度。
django4.0新增了对redis的官方支持,建议开发者用redis库而不是django-redis库轻松配置缓存功能。
官网上对redis 和 hiredis 的描述:
Redis is an in-memory database that can be used for caching. To begin you’ll need a Redis server running either locally or on a remote machine.
After setting up the Redis server, you’ll need to install Python bindings for Redis. redis-py is the binding supported natively by Django. Installing the additional hiredis-py package is also recommended.
官网上建议使用reids库,并使用hiredis库优化,这里介绍hiredis库的使用方法
python -m pip install hiredis
到此,django对redis的优化就结束了,简单吧!惊喜吧!
其实题主也挺惊喜的,但是为了确保hiredis确实在工作,又跑去翻了半天的官方文档,最后刨出一个手动配置hiredis 的方法:
在settings.py中配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://192.168.252.123:6379',
'OPTIONS': {
'db': '1',
'parser_class': 'redis.connection.HiredisParser',
'pool_class': 'redis.ConnectionPool',
}
}
}
也就是将parser_class解析对象改成hiredis库中的就可以了。如果你不手动配置,django4.0会默认配置成这样。
这里是为了测试django确实在使用hiredis,所以手动配置了下,并将hiredis卸载掉。
接着我们直接测试,编写一个使用了缓存的视图函数并运行。
from django.core.cache import caches # 新版本这么用
caches.set('testkey', '12342342',120)
报错
redis.exceptions.RedisError: Hiredis is not installed
这下说明hiredis确实在起作用了。有条件的小伙伴可以进一步性能测试,在同一个视图函数中,使用两次或两次以上的缓存方法,看看响应时间是否有所提升。
为了验证hiredis对redis的性能提升,这里编写一个一次性向远程redis数据库写入1w个键值对,并获取1w个键值对的视图函数。(题主这里偷个懒不写测试脚本了,直接手动点postman直接看效果)
from django.core.cache import caches
# caches= caches['verify_code'] # 可选操作,选择数据库
caches.set_many({f'imgvrf-{codeuid}{i}':code for i in range(10000)},120)
caches.get_many([f'imgvrf-{codeuid}{i}' for i in range(10000)])
相同的视图函数下,我们在settings.py中手动配置禁用/启用hiredis的情况下,响应时间在800ms以内(题主的电脑价位5k,如果是服务器会更快),启用hiredis时响应时间缩短了100ms左右,而这只是一次请求的响应时间,如果是动辄几万并发的项目,相信这个性能提升会非常明显。
由于题主之前是用redis3测试的,版本比较老旧,所以优化效果不是很明显,后来用了最新的redis6.2.6版本的redis又进行了一次测试,这次的优化效果非常明显,在启用hiredis的情况下,比不启用的情况访问效率要快40%!
原创不易,觉得好的小伙伴请动动手点个赞吧,有问题可以留言哈
本例测试源码 ↩︎
redis-6.2.6windows版压缩包 ↩︎