关于python:Django笔记三十三之缓存操作

5次阅读

共计 3311 个字符,预计需要花费 9 分钟才能阅读完成。

这一节介绍一下如何在 Django 中应用 redis 做缓存操作。

在 Django 中能够有很多种形式做缓存,比方数据库,比方服务器文件,或者内存,这里介绍用的比拟多的应用 redis 作为缓存。

这篇笔记次要内容如下:

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

其中,redis 的装置咱们在 celery 系列笔记的第一篇曾经介绍过了,能够间接应用 docker 来操作,这里不做赘述了。

1、依赖装置

Django 连贯 redis 这里用到一个模块,django-redis,接下来咱们用 pip 来装置:

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。

如果没有明码,LOCATION 的参数为 redis://127.0.0.1:6380/2

当然,如果明码也能够和 url 拆散配置,咱们能够放到 OPTIONS 参数里:

# 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)

所以如果有版本的需要咱们能够通过这个参数来管制。

缓存版本递增或递加

比方对于一个 version=2 的数据,咱们能够这样操作:

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

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

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

然而留神,当 version 能够缩小到 0,然而不能再往下缩小了,再缩小的话就会报错了。

5、cache 用作 session backend

在上一节中,咱们介绍了默认应用数据库表作为 session 的存储模式,咱们还能够应用 cache 来用作存储。

只须要在 settings.py 中退出上面这两条命令:

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

从新运行零碎,应用前一篇笔记的代码,调用登录接口,而后就能够在 redis 的交互界面,通过 keys *,就能够看到这条 session 记录在 redis 里曾经有保留了。

6、革除 redis 里全副数据

删除 redis 中 cache 里全副 key-value 数据,能够应用上面的命令:

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

批量删除的话应用的是 delete_pattern() 函数。

cache.delete_pattern("a*")

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

https://django-redis-chs.readthedocs.io/zh_CN/latest/#

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

本文首发于自己微信公众号:Django 笔记。

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

如果想获取更多相干文章,可扫码关注浏览:

正文完
 0