【Django】Django 使用 Redis

Posted by 西维蜀黍 on 2019-10-28, Last Modified on 2021-09-21

安装 Dependency

$ pip install django-redis

作为 cache backend 使用配置

为了使用 django-redis , 在你项目下的setting.py中添加如下代码:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

为了更好的互操作性并使连接字符串更加 “标准”, 从 3.8.0 开始 django-redis 使用 redis-py native url notation 作为连接字符串.

在 Django 中访问 Redis

通过django-redis访问 Redis

以搜索 keys 过期为例:

>>> from django.core.cache import cache
>>> cache.set("foo", "value", timeout=25)
>>> cache.ttl("foo")
25
>>> cache.ttl("not-existent")
0

Basic usage

The basic interface is:

>>> cache.set('my_key', 'hello, world!', 30)

>>> cache.get('my_key')
>>> 'hello, world!'

key should be a str, and value can be any picklable Python object.

The timeout argument is optional and defaults to the timeout argument of the appropriate backend in the CACHES setting (explained above). It’s the number of seconds the value should be stored in the cache. Passing in None for timeout will cache the value forever. A timeout of 0 won’t cache the value.

If the object doesn’t exist in the cache, cache.get() returns None:

>>> # Wait 30 seconds for 'my_key' to expire...
>>> cache.get('my_key')
None

We advise against storing the literal value None in the cache, because you won’t be able to distinguish between your stored None value and a cache miss signified by a return value of None.

cache.get() can take a default argument. This specifies which value to return if the object doesn’t exist in the cache:

>>> cache.get('my_key', 'has expired')
'has expired'

To add a key only if it doesn’t already exist, use the add() method. It takes the same parameters as set(), but it will not attempt to update the cache if the key specified is already present:

>>> cache.set('add_key', 'Initial value')
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'

原生客户端使用

在某些情况下你的应用需要进入原生 Redis 客户端,以使用一些 django cache 接口没有暴露出来的进阶特性。

为了避免储存新的原生连接所产生的另一份设置, django-redis 提供了方法 get_redis_connection(alias) 使你获得可重用的连接字符串:

$ python manager.py shell
>>> from django_redis import get_redis_connection
>>> con = get_redis_connection("default")
>>> con
<redis.client.StrictRedis object at 0x2dc4510>
>>> con.hset("hash1","key1","value1")

接下来,你就可以像在 redis-cli中那样,在Python 中进行 Redis 读写操作。

以下列举了对于在 Redis 中几种不同的数据结构常用的操作命令。

基本操作

命令 含义
del key 删除key
keys * 所有键
TTL key 查看还有多久过期
del name 删除name
select 2 表示切换到2库,注:Django的cache是存在1库的(上面设置的),进入redis的时候默认是0库的
expire key 100 设置过期时间100秒
EXPIRE name 300 设置name的300秒后自动过期
type name 查看name的属性(总共:string, list, hash, set,zset)

String

操作 字符
set name “wuanger” 创建“wuanger”,键为name
get key 获取key这个键的值
append key aa 给一个值后面加aa,类似字符串相加
DERC key 给key的值-1,仅限数字
DERCBY key 4 给key的值-4,仅限数字

List

操作 含义
lpush list_name a b c d e f f e d c b a (依次从左边插入,如果该 list_name 不存在,就创建)
rpush list_name g 从右边插入
lrange list_name 0 -1 显示所有内容(根据下表来的)
lpop list_name 从左边删除第一个数,返回值是删除的那个数
rpop list_name 从右边删除一个数,返回值是删除的那个数



操作 含义
hset hash_name key1 val1 hash_name = {key1: val1}
hmset hash_name key1 val1 key2 val2 hash_name = {key1: val1, key2: val2}
hget hash_name key1 获取key1
hmget hash_name key1 key2 获取多个key
hgetall hash_name 获取所有key
hkeys hash_name 获取所有的key
hvals hash_name 获取所有的val
hdel hash_name key 删除hash_name中的key

Set

操作 含义
sadd set1 val1 val2 添加一个set1集合里的值val1,val2
srem set1 val1 从set1中移除val1
smembers set1 set1的成员
sismember set1 val1 查看val1是否在set1里,是返回1,否返回0
sinter set1 set2 求交集
sunion set1 set2 求并集
sdiff set1 set2 求差集

zset(有序集合)

操作 含义
zadd zset1 score member 创建、添加一个zset1,member的分数是score(int)
zrangebyscore zset1 0 100 withscores 得出zset1中分数score在0-100的member,score从小到大,后面的withscores是带score输出
zrevrangebyscore zset1 100 0 从大到小输出
zrange zset1 2 4 获取zset1中序号为3,4的member
zrank zset1 a zset1中成员a的序号
zrem zset1 a 移除zset1中的a
zcount zset1 1 6 获取score为1-6之间的member数量

Reference