Redis类型之List
1.介绍List
列表(List)相当于数组或者顺序表,但是list的内部编码方式并非是一个简单的数组,而是更接近于“双端队列”(deque)
列表中的元素是有序的,这里的有序并不是指升序或者降序,而是列表 a b c 不等价于列表 a c b的有序。因为List的头和尾都能高效的插入删除元素,就可以将List当作一个栈/队列来使用,且redis的一个典型应用场景作为消息队列使用,就是通过List类型来实现的。
2.List的常用操作
2.1 lpush和rpush
lpush:向指定的key中头插元素,如果key不存在那么就会创建key
rpush:向指定的key中尾插元素
这两个指令的时间复杂度都是O(1),并且返回值是list的长度
如果操作的key已经存在并且value的类型并不是list,此时lpush和rpush将会报错
2.2 lrange
lrange:用于查看list中指定范围的元素
LRANGE key start stop //这里的区间是闭区间
在redis中如果下标越界,它的做法并不是像C++一样程序直接崩溃或得到一个不合法的数据或得到一个看似合法的数据,但是redis的做法是尽可能多的获取对应的数据。
2.3 lpushx
lpushx:当key存在时才进行头插
2.4 rpop和lpop
rpop和lpop:顾名思义就是头删和尾删,注意在redis6.2版本以前并没有count参数描述一次和删除几个元素
这里就可以发现redis中的list搭配rpush和lpop就相当于队列了,搭配rpush和rpop使用就相当于栈了。
2.5 linsert
linsert:根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的位置,然后根据选择的参数在找到的位置前或者后进行插入。返回值是插入之后,得到的新的list的长度。
注意这里的基准值并不是位置(pos),而是一个值
LINSERT key <BEFORE | AFTER> pivot element // BEFORE代表前 AFTER代表后
2.6 lindex
lindex:给定下标,获取对应位置的元素,如果给的是非法的下标那么会返回nil
2.7 llen
llen:获取对应的list的长度
2.8 lrem
lrem:删除count个element,如果count为负值那么会从右往左开始删,为正值就会从右往左开始删,如果count为0就会删除所有的element
LREM key count element
2.9 ltrim
ltrim:保留start和stop之间区间的元素(区间外的元素直接删除)
LTRIM key start stop
2.10 lset
lset:根据下标修改元素,如果下标越界直接返回nil
2.11 brpop 和 blpop
blpop相对于lpop的区别在于如果list为空,blpop就会产生阻塞,一直阻塞到队列不为空为止,如果队列不为空则行为完全一致
我这里先起来一个终端来运行blpop key3 1000。
再开一个窗口进行插入数据,这个时候就会发现第一个窗口返回了。返回的信息有从哪个key中弹出的数据,这个数据是什么,以及等待的时间。