这篇文章主要讲解了“Redis有哪些基本数据结构和操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis有哪些基本数据结构和操作”吧!
基本结构
一个String类型的key、value最大上限均是512M。其基本结构如下:基本语法
Redis中字符串的基本操作如下表所示。
使用场景-统计用户上线天数
Bitmap 对于一些特定类型的计算非常有效。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。
比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。
基本结构
操作 | 语法 | 说明 |
---|---|---|
BLPOP | BLPOP key [key …] timeout | BLPOP 是列表的阻塞式(blocking)弹出原语.它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞. |
BRPOP | BRPOP key [key …] timeout | 它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞. |
BRPOPLPUSH | BRPOPLPUSH source destination timeout | BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。 |
LINDEX | LINDEX key index | 返回列表 key 中,下标为 index 的元素。 |
LINSERT | LINSERT key BEFORE/AFTER pivot value | 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。 |
LLEN | LLEN key | 返回列表 key 的长度。 |
LPOP | LPOP key | 移除并返回列表 key 的头元素。 |
LPUSH | LPUSH key value [value …] | 将一个或多个值 value 插入到列表 key 的表头 |
LPUSHX | LPUSHX key value | 将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表 |
LRANGE | LRANGE key start stop | 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定 |
LREM | LREM key count value | 根据参数 count 的值,移除列表中与参数 value 相等的元素 |
LSET | LSET key index value | 将列表 key 下标为 index 的元素的值设置为 value |
LTRIM | LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。 |
RPOP | RPOP key | 移除并返回列表 key 的尾元素 |
RPOPLPUSH | RPOPLPUSH source destination | 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。 |
RPUSH | RPUSH key value [value …] | 将一个或多个值 value 插入到列表 key 的表尾(最右边) |
RPUSHX | RPUSHX key value | 将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。和 RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。 |
举一些例子:
-
栈
127.0.0.1:6379> lpush stack "a" "b" "c" (integer) 3 127.0.0.1:6379> rpop stack "a" 1 2 3 4
-
队列
127.0.0.1:6379> lpush queue "a" "b" "c" (integer) 3 127.0.0.1:6379> lpop queue "c" 1 2 3 4 5
-
BLPOP
127.0.0.1:6379> exists job (integer) 0 127.0.0.1:6379> blpop job 5 #一直阻塞到5s超时 (nil) (5.03s) 1 2 3 4 5
-
LINDEX
127.0.0.1:6379> lpush myjob "my" "job" "is" "iter" (integer) 4 127.0.0.1:6379> lindex myjob -1 "my" 1 2 3 4
3. 哈希表Hash
存储的是一个field与value的映射表,即存储的是一个Map,每一条数据可以看做是key-field-value的格式,field-value对应的是Map的一个键值对。
基本语法
使用场景-存储社交关系
比如新浪的关注列表, 粉丝列表都是由hash实现的。
基本结构
操作 | 语法 | 说明 |
---|---|---|
SADD | SADD key member [member …] | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略. |
SCARD | SCARD key | 返回集合 key 的基数(集合中元素的数量). |
SDIFF | SDIFF key [key …] | 返回一个集合的全部成员,该集合是所有给定集合之间的差集. |
SDIFFSTORE | SDIFFSTORE destination key [key …] | 这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集. |
SINTER | SINTER key [key …] | 返回一个集合的全部成员,该集合是所有给定集合的交集. |
SINTERSTORE | SINTERSTORE destination key [key …] | 这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集. |
SISMEMBER | SISMEMBER key member | 判断 member 元素是否集合 key 的成员. |
SMEMBERS | SMEMBERS key | 返回集合 key 中的所有成员. |
SMOVE | SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合. |
SPOP | SPOP key | 移除并返回集合中的一个随机元素. |
SRANDMEMBER | SRANDMEMBER key [count] | 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值. |
SREM | SREM key member [member …] | 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略. |
SUNION | SUNION key [key …] | 返回一个集合的全部成员,该集合是所有给定集合的并集. |
SUNIONSTORE | SUNIONSTORE destination key [key …] | 这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集. |
SSCAN | SSCAN key cursor [MATCH pattern] [COUNT count] | 详细信息请参考 SCAN 命令. |
举一些例子
-
差集
127.0.0.1:6379> sadd set1 "a1" "a2" "a3" (integer) 3 127.0.0.1:6379> sadd set2 "a1" "a3" "a4" (integer) 3 127.0.0.1:6379> sdiff set1 set2 1) "a2" 127.0.0.1:6379> sdiffstore set set1 set2 (integer) 1 127.0.0.1:6379> smembers set 1) "a2" 1 2 3 4 5 6 7 8 9 10 11
-
并集
127.0.0.1:6379> sadd set1 "a1" "a2" "a3" (integer) 3 127.0.0.1:6379> sadd set2 "a1" "a3" "a4" (integer) 3 127.0.0.1:6379> sunion set1 set2 1) "a4" 2) "a1" 3) "a3" 4) "a2" 1 2 3 4 5 6 7 8 9 10
-
交集
127.0.0.1:6379> sadd set1 "a1" "a2" "a3" (integer) 3 127.0.0.1:6379> sadd set2 "a1" "a3" "a4" (integer) 3 127.0.0.1:6379> smembers set 1) "a2" 127.0.0.1:6379> sinter set1 set2 1) "a3" 2) "a1" 127.0.0.1:6379> sinterstore set set1 set2 (integer) 2 127.0.0.1:6379> smembers set 1) "a1" 2) "a3" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
5. 有序集合SortedSet
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score,所以sorted set是一个有序的集合。
基本语法
使用场景-用户得分排行榜
和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。
带有权重的元素,比如一个游戏的用户得分排行榜
感谢各位的阅读,以上就是“Redis有哪些基本数据结构和操作”的内容了,经过本文的学习后,相信大家对Redis有哪些基本数据结构和操作这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/205551.html