List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。

列表通常用作异步队列来使用。

List中可以包含的最大元素数量是4294967295。

List类型:(双向链表)

lpush mykey a b  若key不存在,创建该键及与其关联的List,依次插入a ,b, 若List类型的key存在,则插入value中

lpushx mykey2 e  若key不存在,此命令无效, 若key存在,则插入value中

redis listener 多个 redis list key_redis listener 多个

wfy1 该key并不存在

linsert mykey before a a1  在 a 的前面插入新元素 a1

linsert mykey after e e2    在e 的后面插入新元素 e2

redis listener 多个 redis list key_python_02

linsert并不是通过指定位置来插入而是通过指定具体的值。这是因为在分布式环境中,列表的元素总是频繁变动的,意味着上一刻计算的元素下标在下一时刻可能你就不是所期望的下标了。

rpush mykey a b 在链表尾部先插入b,在插入a

rpushx mykey e  若key存在,在尾部插入e, 若key不存在,则无效
 
rpoplpush mykey mykey2   将mykey的尾部元素弹出,再插入到mykey2 的头部(原子性的操作)

redis listener 多个 redis list key_redis listener 多个_03

lpush 先进后出,rpush先进先出(和坐标一至)

del mykey  删除已有键

lrem mykey 2 a   从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除

ltrim mykey 0 2  从头开始,索引为0,1,2的3个元素,其余全部删除(保留0,1,2 三个元素)

ltrim 适合于定长列表(走马灯形式实时显示中奖用户列表,因为中奖用户实在太多,能显示的数量一般不超过100条,那么这里就会使用该指令) ltrim[strart end] 表示需要保留列表的下标范围,范围之外的所有元素都将被移除,如果end小于start,表示清空列表

lset mykey 1 e   从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息

rpoplpush mykey mykey  将 mykey 中的尾部元素移到其头部

lrange mykey 0 -1   取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。

lrange mykey 0 2    从头开始,取索引为0,1,2的元素

lrange mykey 0 0    从头开始,取第一个元素,从第0个开始,到第0个结束

lpop mykey          获取头部元素,并且弹出头部元素,出栈

lindex mykey 6      从头开始,获取索引为6的元素 若下标越界,则返回nil

llen key  获取链表的长度

redis listener 多个 redis list key_redis listener 多个_04

# 右进左出
> rpush ireader go
(integer) 1
> rpush ireader java python
(integer) 3
> lpop ireader
"go"
> lpop ireader
"java"
> lpop ireader
"python"
# 左进右出
> lpush ireader go java python
(integer) 3
> rpop ireader
"go"
...
# 右进右出
> rpush ireader go java python
(integer) 3
> rpop ireader 
"python"
...
# 左进左出
> lpush ireader go java python
(integer) 3
> lpop ireader
"python"

目前数据结构可以组合的业务场景如下:

  • lpush+lpop=栈
  • lpush+rpop=队列
  • lpush+ltrim=有限集合
  • lpush+brpop=消息队列