Django笔记三十三之缓存操作

科技资讯 投稿 22200 0 评论

Django笔记三十三之缓存操作

原文链接:Django笔记三十三之缓存操作

在 Django 中可以有很多种方式做缓存,比如数据库,比如服务器文件,或者内存,这里介绍用的比较多的使用 redis 作为缓存。

    依赖安装
  1. settings.py 配置
  2. 缓存操作用法
  3. 缓存版本控制
  4. cache 用作 session backend
  5. 清除 redis 里全部数据
  6. 批量查询与删除

其中,redis 的安装我们在 celery 系列笔记的第一篇已经介绍过了,可以直接使用 docker 来操作,这里不做赘述了。

1、依赖安装

pip3 install django-redis

2、settings.py 配置

然后在 settings.py 里设置 CACHES 参数即可使用:

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:123456@127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

在这里 redis 的端口我设置成了 6380,密码我设为了 123456。

redis://127.0.0.1:6380/2

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "123456",
        }
    }
}

3、缓存操作用法

在上面的配置都设置好之后,可以正式开始我们的缓存操作了。

以下是缓存操作的一些用法介绍:

#引入 cache 缓存模块
from django.core.cache import cache

#创建一条缓存信息
cache.set("key", "value", 60
###上述语句释义:Redis 是一种以 key-value 形式存储的非关系型数据库,
###所以上述语句表示的是向 Redis 中存入一条记录,到期时间是60秒后,以秒为单位

#查看是否有某条缓存信息
cache.has_key("key"
###返回的结果是布尔型 True or False

#如果没有就创建一条缓存信息
cache.get_or_set("k", 3, 60
### 返回的是 k 这条记录的 value 值

#查询某条缓存记录
cache.get("k"
### 如果没有这条缓存信息 则不返回

#查询某条记录,没有则返回特定值
cache.get("k", False

#同时创建多条记录
cache.set_many({"d":1, "e": 3, "f": 6}
### 输入参数为一个 字典

#同时查询多条记录
cache.get_many(["a", "v", "e"]
### 返回的结果是一个有序字典 OrderedDict

#删除某条缓存记录
cache.delete("a"
### 输入参数为该记录的 key 

#删除多条缓存记录
cache.delete(["a", "b", "c"]

#清除所有缓存记录
cache.clear(

#对缓存value为数字的记录进行操作
cache.set("num", 1

#对缓存记录+1
cache.incr("num"

#对缓存记录 +n
cache.incr("num", 5

#对缓存记录-1
cache.decr("num"

#对缓存记录-n
cache.decr("num", 8

# 对 key 设置新的过期时间为 20s
cache.touch("num", 20

# 除了 touch 还有 expire 函数可以设置过期时间
cache.expire("num", 10

# 设置永不超时,timeout=None
cache.set("a", 1, timeout=None

# 设置永不过期,还可以使用 persist
cache.persist("a"

# 获取 key 的剩余时间,返回的是0 表示已过期或者不存在key,否则返回的是剩余的秒数,如果返回的是 None 表示该数据永不过期
cache.ttl("a"

4、缓存版本控制

如果我们执行 cache.set("a", 1 这条命令,再去 redis 的命令行通过 keys * 查看所有数据,可以看到一条 key 为 :1:a 的数据。

cache.get("a" 的时候,发现可以直接获取到数据,这就是后台为我们自动处理的版本控制,前面的 :1 就表示版本数是 1。

cache.set( 命令时,其实后面还有一个 version 参数,默认为 1,所以下面两个命令是等效的:

cache.set("a", 1
cache.set("a", 1, version=1

所以如果有版本的需求我们可以通过这个参数来控制。

缓存版本递增或递减

cache.set("a", 1, version=2

# 版本数 +1
cache.incr_version("a"

# 版本数 -1
cache.decr_version("a"

但是注意,当 version 可以减少到 0,但是不能再往下减少了,再减少的话就会报错了。

5、cache 用作 session backend

只需要在 settings.py 中加入下面这两条命令:

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

重新运行系统,使用前一篇笔记的代码,调用登录接口,然后就可以在 redis 的交互界面,通过 keys *,就可以看到这条 session 记录在 redis 里已经有保存了。

6、清除 redis 里全部数据

from django_redis import get_redis_connection
get_redis_connection("default".flushall(

7、批量查询与删除

我们可以通过通配符的方式来查询或者删除指定的键。

cache.set("a", 1
cache.set("a_1", 1
cache.set("a_2", 1

然后可以通过 a* 的方式来获取这几条数据的 key:

cache.keys("a*"
# 返回数组:["a", "a2", "a3"]

但是官方文档不推荐这种方式,尤其是在 redis 数据量大的情况下,推荐的是 iter_keys( 函数,返回一个迭代器

for key in cache.iter_keys("a*":
    print(key

删除 key

cache.delete_pattern("a*"

以上就是本篇笔记全部内容,来源于两篇官方文档:

https://docs.djangoproject.com/zh-hans/3.2/topics/cache/

编程笔记 » Django笔记三十三之缓存操作

赞同 (103) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽