Redis常见数据结构以及使用场景

String

  • 常用命令:set、get、decr、incr、mget 等。

SET key value
将字符串值value关联到key。
如果key已经持有其他值,SET就覆写旧值,无视类型。

GET key
返回key所关联的字符串值。

DECR key
将key中储存的数字值减一。
如果key不存在,以0为key的初始值,然后执行DECR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

INCR key
将key中储存的数字值增一。
如果key不存在,以0为key的初始值,然后执行INCR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

MGET key [key ...]
返回所有(一个或多个)给定key的值。
如果某个指定key不存在,那么返回特殊值nil。因此,该命令永不失败。

·····

String 数据结构是简单的 Key-Value 类型,Value 其实不仅可以是 String,也可以是数字。

常规 Key-Value 缓存应用;常规计数:微博数,粉丝数等。

Hash

  • 常用命令: hget、hset、hgetall 等。

HGET key field
返回哈希表key中给定域field的值。

HSET key field value
将哈希表key中的域field的值设为value。
如果key不存在,一个新的哈希表被创建并进行HSET操作。
如果域field已经存在于哈希表中,旧值将被覆盖。

HGETALL key
返回哈希表key中,所有的域和值。
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。

Hash 是一个 String 类型的 Field 和 Value 的映射表,Hash 特别适合用于存储对象。
后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。

比如我们可以 Hash 数据结构来存储用户信息,商品信息等等。

下面我就用 Hash 类型存放了我本人的一些信息:

key=user

user={

“id”: 1,

“name”: “Macho”,

“age”: 22,

“location”: “henan”

}

List

  • 常用命令:lpush、rpush、lpop、rpop、lrange 等。

LPUSH key value [value ...]   
将一个或多个值value插入到列表key的_表头_。
如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头:比如对一个空列表(mylist)执行LPUSH mylist a b c,则结果列表为c ba,等同于执行执行命令LPUSH mylist a、LPUSH mylist b、LPUSH mylistc。
如果key不存在,一个空列表会被创建并执行LPUSH操作。
当key存在但不是列表类型时,返回一个错误。

RPUSH key value [value ...] 
将一个或多个值value插入到列表key的_表尾_。
如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表(mylist)执行RPUSH mylist a b c,则结果列表为a bc,等同于执行命令RPUSH mylist a、RPUSH mylist b、RPUSH mylist c。
如果key不存在,一个空列表会被创建并执行RPUSH操作。
当key存在但不是列表类型时,返回一个错误。

LPOP key 
移除并返回列表key的头元素。

RPOP key
移除并返回列表key的尾元素。

LRANGE key start stop 
返回列表key中指定区间内的元素,区间以偏移量start和stop指定。
下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。
你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
超出范围的下标
超出范围的下标值不会引起错误。
如果start下标比列表的最大下标end(LLEN list减去1)还要大,或者start >stop,LRANGE返回一个空列表。
如果stop下标比end下标还要大,Redis将stop的值设置为end。

List 就是链表,Redis List 的应用场景非常多,也是 Redis 最重要的数据结构之一。

比如微博的关注列表,粉丝列表,消息列表等功能都可以用 Redis 的 List 结构来实现。

Redis List 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 List 实现分页查询。

这是很棒的一个功能,基于 Redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高。

Set

  • 常用命令:sadd、spop、smembers、sunion、sinter 等。

SADD key member [member ...] 
将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。
假如key不存在,则创建一个只包含member元素作成员的集合。
当key不是集合类型时,返回一个错误。

SPOP key 
移除并返回集合中的一个随机元素。

SMEMBERS key 
返回集合key中的所有成员。

SUNION key [key ...] 
返回一个集合的全部成员,该集合是所有给定集合的_并集_。
不存在的key被视为空集。

SINTER key [key ...] 
返回一个集合的全部成员,该集合是所有给定集合的_交集_。
不存在的key被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)

Set 对外提供的功能与 List 类似是一个列表的功能,特殊之处在于 Set 是可以自动排重的。

当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择。

并且 Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。你可以基于 Set 轻易实现交集、并集、差集的操作。

比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。

Sorted Set

  • 常用命令:zadd、zrange、zrem、zcard 等。

ZADD key score member [[score member] [score member] ...] 
将一个或多个member元素及其score值加入到有序集key当中。
如果某个member已经是有序集的成员,那么更新这个member的score值,并通过重新插入这个member元素,来保证该member在正确的位置上。
score值可以是整数值或双精度浮点数。
如果key不存在,则创建一个空的有序集并执行ZADD操作。
当key存在但不是有序集类型时,返回一个错误。

ZRANGE key start stop [WITHSCORES] 
返回有序集key中,指定区间内的成员。
其中成员的位置按score值递增(从小到大)来排序。
具有相同score值的成员按字典序来排列。
如果你需要成员按score值递减(从大到小)来排列,请使用ZREVRANGE命令。
下标参数start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当start的值比有序集的最大下标还要大,或是start > stop时,ZRANGE命令只是简单地返回一个空列表。
另一方面,假如stop参数的值比有序集的最大下标还要大,那么Redis将stop当作最大下标来处理。
可以通过使用WITHSCORES选项,来让成员和它的score值一并返回,返回列表以value1,score1, ..., valueN,scoreN的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。

ZREM key member [member ...] 
移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。

ZCARD key 
返回有序集key的基数(多少个)。

和 Set 相比,Sorted Set 增加了一个权重参数 Score,使得集合中的元素能够按 Score 进行有序排列。

举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。  

常用命令的介绍就到此为止。

附一个Redis常用命令的链接

Redis的常用命令地址 https://redis.readthedocs.io/en/2.4/index.html

Last modification:June 25th, 2019 at 02:30 pm
如果觉得我的文章对你有用,请随意赞赏