Django 设置 Redis 作为缓存


# Django 设置 Redis 作为缓存

# 背景

如果是工具类小项目,一般用不到缓存。因为在项目设计的过程中应当尽量减少依赖,不过度设计,以实现需求为目标,尽量让项目简单,这样协作的小伙伴看起代码来不费劲,出了问题还容易查找原因。所以正常情况下一个数据库(MySQL)就足够了。

但很多时候随着使用频率的增加,出于性能优化的考虑,数据库已无法满足需求,增加缓存就很有必要了。

所谓的缓存,就是把数据库中不常变化的数据提取出来,临时存放到一个第三方存储介质中。在一定的时间内有用户来访问这些数据时,不需要再去执行数据库操作,直接从缓存中取得数据,这样将大大降低对数据库的消耗,且缓存大都使用内存来存储,读写效率极高。

Django 支持的缓存类型有:

  • Memcached:它是 Django 原生支持的缓存系统,不过 Memcached 不是 Django 自带的软件,而是一个独立的软件,需要另外安装、配置和启动服务。
  • 数据库缓存:我们使用缓存的很大原因就是要减少数据库的操作,如果将缓存又存到数据库,就有点奇怪了。但也有特例:比如你有一个高速、高效索引的数据库。
  • 文件系统缓存:连数据库我们都觉得慢,那么基于文件系统显然更慢。不过在没有 Redis、Memcached 和数据库的时候,可以凑活着用一下。
  • 本地内存缓存:如果本地主机内存够大够快,也可以直接使用它作为缓存,并且这也是 Django 默认使用的缓存后端。
  • 开发用的虚拟缓存:仅用于开发模式,只是实现缓存接口,并不做其他操作,等正式部署的时候不会用这种缓存,但开发好的 API 就不用做什么大的修改了。
  • 自定义的缓存后台,自己写一个缓存后端,或者接入 Redis 第三方缓存。

这里不多介绍,配置和使用示例可以看官方文档

因为正常情况下我们的环境中肯定会安装 Redis(就算不是当前服务用,也会有别的模块用),所以就采用 Redis 来做缓存了。

# 安装配置

Redis 的安装参考 Redis 的安装与卸载,另外要想在 Django 中使用 Redis 缓存,则需要先安装依赖:

pip install django-redis
1

接着在 settings.py 配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:密码@127.0.0.1:6379/1",
        "TIMEOUT": 60,  # 缓存的默认过期时间,默认是 300s,None 表示永不过期
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "SOCKET_CONNECT_TIMEOUT": 5,
            "SOCKET_TIMEOUT": 5,
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "IGNORE_EXCEPTIONS": True,
            "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
            # "PASSWORD": "密码",
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

配置完后就可以使用缓存了。

# 全站/视图/模板缓存

Django 提供不同级别的缓存粒度:可以缓存特定的视图,也可以只缓存部分模板片段,还可以缓存整个网站。

但现在一般都是前后端分离项目,所以这几类都不是目前我想要的,需要了解以上几类缓存的话可以参考官网,里面写的很详细。

这里我需要的是 Django 提供的底层缓存 API,可以使用这些 API 来读写缓存的数据。

# 缓存 API

开启 Django Cache 配置后,就可以使用缓存服务了,基本用法如下

from django.core.cache import cache
1

获取到 cache 实例后,就可以使用 Redis 命令来操作缓存了,例如:

>>> from django.core.cache import cache
>>> cache.set("foo", "value", timeout=25)
>>> cache.ttl("foo")
25
1
2
3
4

其它 API 其实可以参考 Redis 的操作命令,因为 django-redis (opens new window) 这个模块提供了对 Redis 客户端的原始访问,它重写了文件缓存类中的所有方法。

也可以通过拿到 Redis 的链接操作 Redis 数据库,跟直接操作 Redis 数据库的语法一样:

>>> from django_redis import get_redis_connection
>>> con = get_redis_connection("default")
>>> con
<redis.client.Redis object at 0x2dc4510>
1
2
3
4

(完)