DjangoRedis是在Django Web框架下的Redis数据库连接工具,它封装了Redis数据库对于Django的调用操作,是在Python3下的一个成熟、可靠、易用的Django扩展工具包。下面从DjangoRedis的配置、使用和缓存选取三个方面详细介绍。
一、配置DjangoRedis
DjangoRedis的配置主要涉及Redis服务器地址和端口号、Redis用户密码等参数设置。一般情况下,可以将这些参数保存在一个单独的配置文件中,例如settings.py,放在您的项目应用程序的根目录下,代码如下:
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } }
其中, ‘default’是缓存名(也是缓存配置唯一的标识符,如果要使用多个缓存配置的话,这里就不一样了);‘BACKEND’是缓存的后端,Django自带的cache后端为‘django.core.cache.backends.locmem.LocMemCache’,而我们要使用Redis,则设置为‘django_redis.cache.RedisCache’;‘LOCATION’是Redis的数据库地址,格式为“redis://address:post/db_number”,这里我们设置为‘redis://localhost:6379/0’,表示连接到默认Redis数据库(0号数据库);‘OPTIONS’是适用于缓存后端的参数和选项,这里我们设置为使用DefaultClient,其中还有其他可选的参数和选项。
二、使用DjangoRedis
DjangoRedis常见的使用场景是在缓存、队列、锁等方面,下面我们以JavaScript Object Notation(JSON)作为数据交换格式的缓存机制为例子讲解使用方法。
1.添加缓存记录
将一个键值对存入缓存中,并设置有效时间time,代码如下:
from django.core.cache import cache cache.set(key, value, time)
其中,key是一个字符串或者一个参数化的键值对字典,value可以是任意可序列化物体(可以将value序列化Python的str或者用JSON序列化)。time是缓存的有效时间,可以是浮点型,整数型,或者None(缓存永久有效)
2.获取缓存记录
通过key来获取缓存记录,如果缓存记录不存在则返回None,代码如下:
cache.get(key)
如果你要获取缓存值的同时,返回一个默认值,可以使用get()方法中的‘default’参数参数,代码如下:
cache.get(key, default='cachemiss')
3.删除缓存记录
删除一个缓存键值,如果键值对不存在则不执行操作,代码如下:
cache.delete(key)
三、DjangoRedis缓存选取
在DjangoRedis中,我们可以使用多种缓存方式,常用的包括:内存存储、持久化存储,以及缓存策略。
1.内存存储
内存存储使用 DjangoRedis(或Django)提供的RAM缓存后端,在内存中缓存数据,访问速度快(读取延时通常在微秒级),缓存较小(内存容量的限制),适用于一些无需过期的缓存,或者需要较快速读取的数据。
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', }, 'TIMEOUT': 1, # 缓存的默认过期时间 } }
2.持久化存储
持久化存储使用 DjangoRedis(或Django)提供的redis缓存后端,在Redis数据库中进行数据的缓存,可支持多种Redis数据结构(如set、list、hash等),可以在缓存服务器重启后继续存在。闪存速度较快,但相对于内存存储读取延时要大一些(在单位时间内,通常需要比内存存储多一倍的时间来访问近似数量的记录)。
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6380/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', }, 'TIMEOUT': 1, # 缓存的默认过期时间 } }
3.缓存策略
DjangoRedis提供了多种缓存策略,根据实际情况选择适当的策略可以提高缓存效率,常用的策略有以下几种:
3.1 LRU
最近最少使用(LRU)策略是将最近最少使用的元素从缓存中除去。以空闲空间供新缓存。在DjangoRedis中,这一策略通过为缓存赋予一个max_entries值来实现。
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, }, 'TIMEOUT': 1, # 缓存的默认过期时间 }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6380/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, }, 'TIMEOUT': 1, # 缓存的默认过期时间 } }
3.2 LFU
最少使用(LFU)策略是在缓存达到固定大小之后,从缓存中删掉使用最少的元素。请注意,这种方法不常用。
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, 'CULL_FREQUENCY': 5, }, 'TIMEOUT': 1, # 缓存的默认过期时间 }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6380/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, 'CULL_FREQUENCY': 10, }, 'TIMEOUT': 1, # 缓存的默认过期时间 } }
3.3 TTL
ttl 指缓存的最大生存时间,即从创建缓存对象开始,到指定的时间过期并被移除。 在DjangoRedis中,这个时间的设置方法与我们配置缓存记录中的time参数一样。
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, 'CULL_FREQUENCY': 5, }, 'TIMEOUT': 60*5, # 缓存的过期时间设置为5分钟 }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6380/0', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 10000, 'CULL_FREQUENCY': 10, }, 'TIMEOUT': 60*10, # 缓存的过期时间设置为10分钟 } }
总结
正如您所看到的,DjangoRedis为Django Web框架的用户提供了一个便于连接Redis数据库的渠道,并提供了方法和策略来管理缓存效率。希望这个简短的教程能够对你工作中有所帮助。