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 |