Redis 有 5 种基础数据结构,分别为:String (字符串)、Hash (哈希)、List (列表)、Set (集合) 和 Sorted Set (有序集合)
String (字符串)
String 数据结构是简单的 key-value 类型。
最常见的用途就是缓存信息。我们可以将需要缓存结构体使用 JSON 序列化成字符串来缓存,取出来的时候再反序列化一下。
常用命令 |
说明 |
示例 |
set |
设置指定 key 的值 |
set name zubin |
get |
获取指定 key 的值 |
get name |
del |
删除指定 key |
del key |
mset |
批量设置指定 key 的值 |
mset name zubin age 18 |
mget |
批量获取指定 key 的值 |
mget name age |
setex |
如果设置指定 key 的值和过期时间(秒) |
setex name 5 zubin |
setnx |
只有 key 不存在时设置 key 的值 |
setnx name zubin |
incr |
将 key 中存储的数字值增 1 |
incr age |
incyby |
将 key 所储存的值加上给定的增量值 |
incrby age 5 |
decr |
将 key 中存储的数字值减 1 |
decr age |
strlen |
返回指定 key 中 value 的长度 |
strlen name |
append |
将字符串追加到指定 key 中值的末尾。 |
append name 1 |
Hash (哈希)
Redis hash 是一个 string 类型的 field 和 value 的映射表,是无序字典, 特别适合用于存储对象。每个 hash 可以存储2^32 - 1
(4294967295) 键值对。
常用命令 |
说明 |
示例 |
hset |
设置 hash 表中 field 的值 |
hset user name zubin |
hmset |
设置 hash 表中多个 field 的值 |
hmset user name zubin age 18 |
hsetnx |
field 不存在时设置哈希表字段的值 |
hsetnx user name zubin |
hget |
获取指定字段的值 |
hget user name |
hmget |
获取多个字段的值 |
hmget user age name |
hgetall |
获取 hash 表中所有字段的值 |
hgetall user |
hdel |
删除一个或多个 hash 字段 |
hdel user age |
hexists |
判断 hash 表中指定的字段是否存在 |
hexists user age |
hincrby |
为 hash 表中指定的整数值字段加上增量 |
hincrby user age 5 |
hkeys |
获取 hash 表中所有的字段 |
hkeys user |
hvals |
获取 hash 表中所有的值 |
hvals user |
hlen |
获取 hash 表中字段的数量 |
hlen user |
List (列表)
Redis 列表是简单的字符串列表,按照插入顺序排序,注意它是链表而不是数组,一个列表最多可以包含 2^32 - 1
个元素 (4294967295, 每个列表超过 40 亿个元素)。
list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。
list 常用来做异步队列使用,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常用命令 |
说明 |
示例 |
lpush |
将一个或多个值插入到列表头部 |
lpush skills Node Golang Java |
lpushx |
将一个或多个值插入到已存在的列表头部 |
lpushx skills Node Golang Java |
lpop |
移除列表第一个元素 |
lpop skills |
blpop |
移除列表第一个元素, 列表为空会阻塞,直到超时或者有可移除的元素 |
blpop skills 100 |
rpush |
将一个或多个值插入到列表尾部 |
rpush skills Node Golang Java |
rpushx |
将一个或多个值插入到已存在的列表尾部 |
rpushx skills Node Golang Java |
rpop |
移除列表最后一个个元素 |
rpop skills |
brpop |
移除列表最后一个个元素, 列表为空会阻塞,直到超时或者有可移除的元素 |
brpop skills 100 |
brpoplpush |
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它 |
brpoplpush skills list1 500 |
lindex |
通过索引获取列表中的元素 |
lindex skills 1 |
lset |
通过索引来设置元素的值 |
lset skills 0 Python |
llen |
获取列表长度 |
llen skills |
lrange |
获取列表指定范围内的元素 |
lrange skills 1 2 |
lrem |
根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 |
lrem skills 0 node |
ltrim |
修剪列表,只保留指定区间内的元素 |
ltrim skills 1 2 |
Set (集合)
Redis 的 Set 是 String 类型的无序集合。它内部的键值对是无序的唯一的,这就意味着集合中不能出现重复的数据,集合中最大的成员数为 2^32 - 1
(4294967295)。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用命令 |
说明 |
示例 |
sadd |
向集合添加一个或多个元素 |
sadd skills python go java go |
scard |
获取集合的成员数 |
scard skills |
sismember |
判断是否集合中的成员 |
sismember skills go |
smembers |
返回集合中的所有成员 |
smembers skills |
spop |
随机移除并返回集合中的一个元素 |
spop skills |
sinter |
返回指定集合的交集 |
sinter key1 key2 |
sunion |
返回指定集合的并集 |
sunion key1 key2 |
sdiff |
返回指定集合的差集 |
sdiff key2 key2 |
Sorted Set (有序集合)
Redis 有序集合和集合一样也是 string 类型元素的集合,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score(分数),代表这个 value 的排序权重。集合中最大的成员数为 2^32 - 1
(4294967295)。
Redis 正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用命令 |
说明 |
示例 |
zadd |
添加一个或多个成员或者更新已存在成员的分数 |
zadd userscore zubin 1 |
zcard |
获取有序集合的成员数 |
zcard userscore |
zcount |
获取有序集合指定区间分数的成员数 |
zcount userscore 1 3 |
zincrby |
给指定成员的分数加上增量 |
zincrby userscore 1 zubin |
zrange |
返回指定区间内的成员 |
zrange userscore 0 -1 |
zrangebyscore |
返回 score 区间内的成员 |
zrangebyscore userscore -inf +inf |
zrem |
移除一个或多个元素 |
zrem userscore 0 -1 |
zrevrange |
返回指定分数区间内的成员,按分数递减 |
zrevrange userscore 0 -1 |
zrevrank |
返回成员 member 的排名 |
zrevrank userscore zubin |
zscore |
返回 score 的 score 值 |
zscore userscore zubin |