您的位置:

DjangoRedis详解

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数据库的渠道,并提供了方法和策略来管理缓存效率。希望这个简短的教程能够对你工作中有所帮助。