翼度科技»论坛 编程开发 python 查看内容

Django笔记三十三之缓存操作

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
本文首发于公众号:Hunter后端
原文链接:Django笔记三十三之缓存操作
这一节介绍一下如何在 Django 中使用 redis 做缓存操作。
在 Django 中可以有很多种方式做缓存,比如数据库,比如服务器文件,或者内存,这里介绍用的比较多的使用 redis 作为缓存。
这篇笔记主要内容如下:

  • 依赖安装
  • settings.py 配置
  • 缓存操作用法
  • 缓存版本控制
  • cache 用作 session backend
  • 清除 redis 里全部数据
  • 批量查询与删除
其中,redis 的安装我们在 celery 系列笔记的第一篇已经介绍过了,可以直接使用 docker 来操作,这里不做赘述了。
1、依赖安装

Django 连接 redis 这里用到一个模块,django-redis,接下来我们用 pip 来安装:
  1. pip3 install django-redis
复制代码
2、settings.py 配置

然后在 settings.py 里设置 CACHES 参数即可使用:
  1. # hunter/settings.py
  2. CACHES = {
  3.     "default": {
  4.         "BACKEND": "django_redis.cache.RedisCache",
  5.         "LOCATION": "redis://:123456@127.0.0.1:6380/2",
  6.         "OPTIONS": {
  7.             "CLIENT_CLASS": "django_redis.client.DefaultClient",
  8.         }
  9.     }
  10. }
复制代码
在这里 redis 的端口我设置成了 6380,密码我设为了 123456。
如果没有密码,LOCATION 的参数为 redis://127.0.0.1:6380/2
当然,如果密码也可以和 url 分离配置,我们可以放到 OPTIONS 参数里:
  1. # hunter/settings.py
  2. CACHES = {
  3.     "default": {
  4.         "BACKEND": "django_redis.cache.RedisCache",
  5.         "LOCATION": "redis://127.0.0.1:6380/2",
  6.         "OPTIONS": {
  7.             "CLIENT_CLASS": "django_redis.client.DefaultClient",
  8.             "PASSWORD": "123456",
  9.         }
  10.     }
  11. }
复制代码
3、缓存操作用法

在上面的配置都设置好之后,可以正式开始我们的缓存操作了。
其实关于缓存,我们可以缓存视图,模板等,但是一般来说,都是缓存更细粒度的数据,比如某个需要经常被访问到的、或者需要经过一些时间进行计算得出结果的数据,可以将其存入缓存来提高接口的访问效率。
以下是缓存操作的一些用法介绍:
  1. #引入 cache 缓存模块
  2. from django.core.cache import cache
  3. #创建一条缓存信息
  4. cache.set("key", "value", 60)
  5. ###上述语句释义:Redis 是一种以 key-value 形式存储的非关系型数据库,
  6. ###所以上述语句表示的是向 Redis 中存入一条记录,到期时间是60秒后,以秒为单位
  7. #查看是否有某条缓存信息
  8. cache.has_key("key")
  9. ###返回的结果是布尔型 True or False
  10. #如果没有就创建一条缓存信息
  11. cache.get_or_set("k", 3, 60)
  12. ### 返回的是 k 这条记录的 value 值
  13. #查询某条缓存记录
  14. cache.get("k")
  15. ### 如果没有这条缓存信息 则不返回
  16. #查询某条记录,没有则返回特定值
  17. cache.get("k", False)
  18. #同时创建多条记录
  19. cache.set_many({"d":1, "e": 3, "f": 6})
  20. ### 输入参数为一个 字典
  21. #同时查询多条记录
  22. cache.get_many(["a", "v", "e"])
  23. ### 返回的结果是一个有序字典 OrderedDict
  24. #删除某条缓存记录
  25. cache.delete("a")
  26. ### 输入参数为该记录的 key
  27. #删除多条缓存记录
  28. cache.delete(["a", "b", "c"])
  29. #清除所有缓存记录
  30. cache.clear()
  31. #对缓存value为数字的记录进行操作
  32. cache.set("num", 1)
  33. #对缓存记录+1
  34. cache.incr("num")
  35. #对缓存记录 +n
  36. cache.incr("num", 5)
  37. #对缓存记录-1
  38. cache.decr("num")
  39. #对缓存记录-n
  40. cache.decr("num", 8)
  41. # 对 key 设置新的过期时间为 20s
  42. cache.touch("num", 20)
  43. # 除了 touch 还有 expire 函数可以设置过期时间
  44. cache.expire("num", 10)
  45. # 设置永不超时,timeout=None
  46. cache.set("a", 1, timeout=None)
  47. # 设置永不过期,还可以使用 persist
  48. cache.persist("a")
  49. # 获取 key 的剩余时间,返回的是0 表示已过期或者不存在key,否则返回的是剩余的秒数,如果返回的是 None 表示该数据永不过期
  50. cache.ttl("a")
复制代码
4、缓存版本控制

如果我们执行 cache.set("a", 1) 这条命令,再去 redis 的命令行通过 keys * 查看所有数据,可以看到一条 key 为 :1:a 的数据。
但是我们去通过 cache.get("a") 的时候,发现可以直接获取到数据,这就是后台为我们自动处理的版本控制,前面的 :1 就表示版本数是 1。
当我们执行 cache.set() 命令时,其实后面还有一个 version 参数,默认为 1,所以下面两个命令是等效的:
  1. cache.set("a", 1)
  2. cache.set("a", 1, version=1)
复制代码
所以如果有版本的需求我们可以通过这个参数来控制。
缓存版本递增或递减
比如对于一个 version=2 的数据,我们可以这样操作:
  1. cache.set("a", 1, version=2)
  2. # 版本数 +1
  3. cache.incr_version("a")
  4. # 版本数 -1
  5. cache.decr_version("a")
复制代码
但是注意,当 version 可以减少到 0,但是不能再往下减少了,再减少的话就会报错了。
5、cache 用作 session backend

在上一节中,我们介绍了默认使用数据库表作为 session 的存储形式,我们还可以使用 cache 来用作存储。
只需要在 settings.py 中加入下面这两条命令:
  1. SESSION_ENGINE = "django.contrib.sessions.backends.cache"
  2. SESSION_CACHE_ALIAS = "default"
复制代码
重新运行系统,使用前一篇笔记的代码,调用登录接口,然后就可以在 redis 的交互界面,通过 keys * ,就可以看到这条 session 记录在 redis 里已经有保存了。
6、清除 redis 里全部数据

删除 redis 中 cache 里全部 key-value 数据,可以使用下面的命令:
  1. from django_redis import get_redis_connection
  2. get_redis_connection("default").flushall()
复制代码
7、批量查询与删除

我们可以通过通配符的方式来查询或者删除指定的键。
比如我们创建下面几条数据:
  1. cache.set("a", 1)
  2. cache.set("a_1", 1)
  3. cache.set("a_2", 1)
复制代码
然后可以通过 a* 的方式来获取这几条数据的 key:
  1. cache.keys("a*")
  2. # 返回数组:["a", "a2", "a3"]
复制代码
但是官方文档不推荐这种方式,尤其是在 redis 数据量大的情况下,推荐的是 iter_keys() 函数,返回一个迭代器
  1. for key in cache.iter_keys("a*"):
  2.     print(key)
复制代码
删除 key
批量删除的话使用的是 delete_pattern() 函数。
  1. cache.delete_pattern("a*")
复制代码
以上就是本篇笔记全部内容,来源于两篇官方文档:
https://django-redis-chs.readthedocs.io/zh_CN/latest/#
https://docs.djangoproject.com/zh-hans/3.2/topics/cache/
如果想获取更多后端相关文章,可扫码关注阅读:


来源:https://www.cnblogs.com/hunterxiong/p/17364424.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具