Python 客户端安装
pip install redis
存储简单键值对数据 - strings
类型
-
应用场景
-
缓存
: 如缓存关系数据库中的查询结果, 依此来避免重复查询 -
简单分布式锁
:SETNX
(set if not exist), 这条命令是原子操作, 成功返回 1, 否则返回 0, 因此可以实现简单分布式锁 -
简单计数器
:INCR
,INCRBY
可以对数值进行操作 -
设置
set
获取get
# 设置一个key r.set("test_key", "test_value") # 获取 r.get("test_key") # >>> test_value
-
设置过期时间
expire
r.expire("test_key", 1) # 单位 秒
-
数值操作
incrby
r.set("num", 3) r.incrby(name="num", amount=3) # >>> 6
-
存储哈希表数据 - hashs
类型
-
应用场景
-
存储一些绑定在一起的数据, 如
用户信息
这个数据类型类似
python
中的dict
类似, 但不能像python那样可以嵌套多层, 只能有 1 层,
而且每次操作都需要显式通过哈希表的名字来进行 -
写入
hset
读取所有hgetall
# 写入整个 哈希表 r.hset('user-session:123', mapping={ 'name': "walker", "surname": 'Smith', "company": 'Redis', "age": 29 }) # 读取整个 哈希表 O(n) r.hgetall("user-session:123") # >>> {'age': '29', 'company': 'Redis', 'name': 'walker', 'surname': 'Smith'}
-
读取单个属性
hget
, 设置属性hset
# 读取 r.hget("user-session:123", "name") # >>> walker # 设置单个也是 hset r.hset('user-session:123', mapping={ "name": "walker3" })
-
对 哈希表 中某个属性做数值操作
hincrby
r.hincrby("user-session:123", key="age", amount=2) # >>> 31 返回操作后的值 r.hincrby("user-session:123", key="age", amount=-3) # >>> 28
-
列举出 哈希表 中的所有的 key 或者 value
hkeys
r.hkeys('user-session:123') # >>> ['name', 'surname', 'company', 'age'] r.hvals('user-session:123') # >>> ['walker3', 'Smith', 'Redis', '29']
-
存储队列数据 - list 类型
-
应用场景
-
简单消息队列
: redis 中 list 数据类型是通过双向链表
实现的, 因此其支持并提供了一套操作方法 如头插
,尾插
,头出
,尾出
的方法, 可以支持消息队列
的实现 -
最新记录实现
: 可以通过LTRIM
来修剪list
的长度, 以此最新的记录 -
浏览足迹(事件/活动追踪)
: 借助其有序性, 可以将某用户的一系列操作活动/事件都记录其中
-
-
头插
lpush
尾插rpush
头出lpop
尾出rpop
查看lrange
# 头插 r.lpush("test_list0", 0) # >>> 1 返回目前 list 长度 # 尾插 r.rpush("test_list0", 1) # >>> 2 # 从头至尾查看数据 r.lrange("test_list0", 0, -1) # >>> ['0', '1'] # 头出 r.lpop("test_list0") # >>> '0' 返回 pop 的数据 # 尾出 r.rpop("test_list0") # >>> '1' # 查看 r.lrange("test_list", 0, -1) # >>> []
-
修剪 list 长度
ltrim
# 头插入 5 个数据 for i in range(5): r.lpush("test_list1", i + 1) # 查看 r.lrange("test_list1", 0, -1) # >>> ['5', '4', '3', '2', '1'] # 修建 list 大小 , 保留最新的 3 个, 由于我们是头插, 因此, index 设置 0 至 2 r.ltrim("test_list1", 0, 2) # >>> True # 查看 r.lrange("test_list1", 0, -1) # >>> ['5', '4', '3']
-
查看 list 长度
llen
r.llen("test_list1")
-
阻塞方式获取list 数据
blpop
brpop
其中
b
是blocking
的意思, 如果队列为空, 那么这两条命名会一直阻塞, 除非指定了 timeout# test_list2 不存在 r.blpop("test_list2", timeout=1) # >> 1 秒后, 返回 None
存储需要去重的数据 - Set 类型
这个一个是无序且不重复的数据结构类型, 可以在有去重需要的场景中使用, 如 所有在线用户
, 所有投票用户
这样的
-
添加
sadd
查看数量scard
查看成员smembers
SET_KEY = "test_set:online_users" # 添加 一个成员 r.sadd(SET_KEY, "user1") # 添加多个成员 r.sadd(SET_KEY, "user1", "user2", "user3") # 查看成员数量 r.scard(SET_KEY) # >>> 2 # 查看所有成员 r.smembers(SET_KEY) # >>> {'user3', 'user2', 'user1'}
-
检查成员是否在
sismember
移除成员srem
# 检查成员是否在集合中 r.sismember(SET_KEY, "user2") # >>> 1 在则返回 1, 否则返回 0 # 移除一个/多个成员 r.srem(SET_KEY, "user1", "user2") # 查看 r.smembers(SET_KEY) # >>> {'user3'}
存储有序去重数据 - Sorted Set 类型
这个类型相比 Set
, 不一样的是, 每个元素都都一个权重分数
属性, 因此可以实现有序
-
应用场景
适用于很多需要权重排名的场景, 如排行榜, 用户兴趣权重排行 之类的
-
添加
zadd
查看zrange
# 往有序集合中加入 5 个用户 以及他们的 权重 r.zadd(name="test_sorted_set", mapping={ "user1": 20, "user2": 60, "user3": 30, "user4": 70, "user5": 500, }) # 升序查看集合, 带权重分数 r.zrange("test_sorted_set", 0, -1, withscores=True) # >>> [('user1', 20.0), ('user3', 30.0), ('user2', 60.0), ('user4', 70.0), ('user5', 500.0)] # 降序查看集合, r.zrange("test_sorted_set", 0, -1, withscores=True, desc=True) # >>> [('user5', 500.0), ('user4', 70.0), ('user2', 60.0), ('user3', 30.0), ('user1', 20.0)]
-
增加用户权重
zincrby
获取用户权重zscore
# 增加用户 "user3" 的权重, +50 r.zincrby("test_sorted_set", amount=50, value="user3") # 获取用户 user3 的权重 r.zscore("test_sorted_set", "user3")
-
查看用户排名
zrank
删除用户zrem
# 查询用户的排名 r.zrank("test_sorted_set", "user3") # >>> 3 # 删除一个用户 r.zrem("test_sorted_set", "user3")
-
查询指定范围内的用户
zrangebyscore
# 查询分数范围在 负无穷 至 70 的用户 r.zrangebyscore("test_sorted_set", "-inf", 70, withscores=True) # >>> [('user1', 20.0), ('user2', 60.0), ('user4', 70.0)]