开发者学堂课程【Redis 数据库入门:Redis_列表_Hash 散列操作_2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/15/detail/50
Redis_列表_Hash 散列操作_2
内容介绍:
一、命令
二、Hash 散列
一、命令
举例:
⑴
RPUSH listkey c abc c ab 123 ab bj ab redis list
LTRIM listkey 0 -1
LTRIM listkey 1 -1
LTRIM listkey 1 10000
将 RPUSH listkey c abc c ab 123 ab bj ab redis list 粘贴进去,这里面有十个元素,然后输入 LTRIM listkey 0 -1,LTRIM 是去掉 0前面,-1后面的元素,所以在输入LRANGE listkey 0 -1之后所有元素都在;如果是 LRANGE listkey 1 -1,因为0在1和-1之间,所以“c”就没有了
输入 LTRIM listkey 1 10000,因为里面只有9个元素,10000以外没有元素,对结果的影响很小。
⑵微博的评论最后500条
LTRIM u1234:forumid:comments 0 499
如果我们按照0到499这样取值的话,可能会得到一个分页的数据。那么原来key本身改变了吗?
按照之前的数据看,我前面来做这个 LTRIM 操作,输入 LRANGE listkey 0 -1后,所有元素还在,所以 key 本身没有改变,LTRIM 改变 key 的值本身,所以我们可以根据 LTRIM 来做到类似于分页的效果。
1.在列表中某个存在的值(pivot)前或后插入元素
LINSERT key BEFOR/AFTER pivot value
Key 和 pivot 不存在,不进行任何操作
举例:
RPUSH lst Clojure C Lua
LINSERT lst AETER C Python
LINSERT lst BEFORE C Ruby
比如在 RPUSH lst Clojure C Lua 里面,创建一个新的 list,分别放入 Clojure 和Lua,RPUSH 是从左向右追加,所以“Lua”在最右边。
LINSERT lst AFTER C Python 是在“C”后面插入“Python”,LINSERT lst BEFORE C Ruby 是在“C”前面插入“Ruby”这个元素,就变成五个元素,
如下图
我们将这个例子操作一下,输入 RPUSH lst Clojure C Lua,相当于重新创建一个list,输入 LRANGE lst 0 -1,显示三个元素。
再输入 LINSERT lst AFERT C Python,最后输入 LINSERT lst BEFORE C Ruby
如果要插入的元素不在集合里面,那么就不进行操作。
我们输入 LINSERT lst BEFORE pivot Ruby,得到的是(integer)-1,表示没有插入进去,输入 LRANGE lst 0 -1,得到的还是五个元素
2.阻塞
⑴如果弹出的列表不存在或者为空,就会阻塞
⑵超时时间设置为0,就是永久阻塞,知道有数据可以弹出
⑶如果多个客户端阻塞在同一个列表上,使用 First In First Service 原则,先到先服务
⑷左右或者头尾阻塞弹出元素
BLPOP key [key…] timeout
BRPOP key [key…] timeout
⑸从一个列表尾部阻塞弹出元素压入另一个列表的头部
BRPOPLPUSH source destination timeout
如果 source 里面有元素,它会立刻弹出去并压到 destination 里面去;如果 source 里面没有元素,它会根据阻塞时间等待,有元素之后,压到另外一个destination 里面。
其实这个操作可以做很多事情,举个例子:假如你有个 list 列表,这个 list 列表是自己的微博,你的粉丝可以监控着阻塞你的微博列表,如果你有一条微博进来,就可以被他们拿走。
当然,这只是一种实验方式,也有不合理的地方,不太符合先到先服务的原则。
二、Hash散列
1.由 field 和关联的 value 组成的 map 键值对
2.Field 和 value 是字符串类型
3.一个 hash 中最多包含2^32-1键值对




