redis列表操作
lpush:将元素推入列表左端
127.0.0.1:6379> LPUSH list item [item ...]
在推入操作完成后lpush命令会返回列表当前包含的元素数量作为返回值
127.0.0.1:6379> LPUSH todo "buy some milk" (integer) 1 127.0.0.1:6379> LPUSH todo "watch tv" (integer) 2 127.0.0.1:6379> LPUSH todo "finish homework" (integer) 3
执行流程,在操作之前todo列表为空。既不存在与数据库中。执行第一个lpush命令,将元素“buy some milk”推入列表左端,执行完后列表包含了一个元素,执行第二个lpush命令,将元素“watch tv”推入列表左端,执行完成后列表就2个元素了,以此下去
一次推入多个元素;lpush命令允许一次将多个元素推入列表左端
127.0.0.1:6379> LPUSH another-todo "buy some milk" "watch tv" "finish homework" (integer) 3
rpush :将元素推入列表右端
rpush命令与lpush命令类似。两个命令执行的都是元素推入操作,唯一区别在于lpush命令会将元素推入列表左端,而rpush会将元素推入列表右端
127.0.0.1:6379> RPUSH list item [item ....] [value .
在推入操作完成后rpush命令会返回列表当前包含的元素数量作为返回值,操作前使用del todo 删除这个列表
127.0.0.1:6379> RPUSH todo "buy some milk" (integer) 1 127.0.0.1:6379> RPUSH todo "watch tv" (integer) 2 127.0.0.1:6379> RPUSH todo "finish homework" (integer) 3
执行过程在操作之前todo列表为空。既不存在与数据库中。执行第一个lpush命令,将元素“buy some milk”推入列表右端,执行完后列表包含了一个元素,执行第二个lpush命令,将元素“watch tv”推入列表右端,执行完成后列表就2个元素了,以此下去
一次推入多个元素,rpush命令允许一次将多个元素推入列表左端
127.0.0.1:6379> RPUSH another-todo "buy some milk" "watch tv" "finish homework" (integer) 3
lpushx rpushx只对以存在的列表执行推入操作
lpushx命令只会在列表存在的情况下,将元素推入列表左端;rpushx命令只会在列表存在的情况下,将元素推入列表右端;如果给定列表不存在那么将放弃执行推入操作。命令操作成功后。将返回列表当前额长度作为返回值。如操作失败,则返回0
127.0.0.1:6379> RPUSHX list3 "itme-x" (integer) 0 127.0.0.1:6379> LPUSHX list3 "itme-y" (integer) 0
使用lpush命令将一个元素推入ltst3列表中。使list3变得非空列表,那么lpushx和roushx命令就可以执行了
127.0.0.1:6379> LPUSH list3 "item1" (integer) 1 127.0.0.1:6379> LPUSHX list3 "itme-x" (integer) 2 127.0.0.1:6379> RPUSHX list3 "itme-y" (integer) 3
执行流程;在最初lpushx和rpushx命令,list3仍是一个空列表。执行lpush命令后,将元素itme1推入列表中,使之变成非空列表执行lpushx命令,将元素“item-x”推入列表,是列表包含两个元素,执行rpushx命令,将元素“item-y”推入列表。使得表包含3个元素
每次只能推入单个元素,与lpush和rpush命令不同。如果尝试推入多个元素就会报错
127.0.0.1:6379> RPUSHX list3 "itme-t" "itme-p" (error) ERR wrong number of arguments for 'rpushx' command 127.0.0.1:6379> LPUSHX list3 "itme-t" "itme-p" (error) ERR wrong number of arguments for 'lpushx' command
LPOP弹出列表最左端元素 并将被移除元素
127.0.0.1:6379> LPOP list
用户可以通过lpop命令一出位于列表最左端的元素。并将一出的元素返回给用户
127.0.0.1:6379> LPOP todo "buy some milk" 127.0.0.1:6379> LPOP todo "watch tv" 127.0.0.1:6379> LPOP todo "finish homework"
执行过程,在执行lpop命令之前,todo列表3个元素,执行第一个LPOP时候从列表弹出buy some milk元素,执行第二个的时候弹出“watch tv” 执行第三个移除“finish homework”元素,如果给定一个空列表则返回空
127.0.0.1:6379> LPOP todi (nil)
rpop弹出列表最右端的元素
127.0.0.1:6379> RPOP list
使用rpop命令弹出todo列表
127.0.0.1:6379> RPUSH todo "buy some milk" "watch tv" "finish homework" (integer) 3 127.0.0.1:6379> RPOP todo "finish homework" 127.0.0.1:6379> RPOP todo "watch tv" 127.0.0.1:6379> RPOP todo "buy some milk"
如果给定的列表不存在就报空
127.0.0.1:6379> RPOP to (nil)
rpoplpush:将右端弹出的元素推入左端
rpoplpush命令行为和名字一样,首先使用rpop命令将源列表最右端元素弹出,然后使用lpopsh命令将被弹出的元素推入目标列表最左端,使之成为目标列表的最左端元素
127.0.0.1:6379> RPOPLPUSH source target
rpoplpush命令会返回被弹出的元素作为结果
127.0.0.1:6379> RPUSH list1 "a" "b" "c" (integer) 3 127.0.0.1:6379> RPUSH list2 "d" "e" "f" (integer) 3 127.0.0.1:6379> RPOPLPUSH list1 list2 "c" 127.0.0.1:6379> RPOPLPUSH list1 list2 "b" 127.0.0.1:6379> RPOPLPUSH list1 list2 "a"
rpoplpush元和目标可以相同
127.0.0.1:6379> RPOPLPUSH rotate-list rotate-list "c" 127.0.0.1:6379> RPOPLPUSH rotate-list rotate-list "b" 127.0.0.1:6379> RPOPLPUSH rotate-list rotate-list "a" 127.0.0.1:6379> RPOPLPUSH rotate-list rotate-list "c"
处理空列表。如果传给源列表不存在,那么就会放弃弹出和推入操作只返回空执行失败
127.0.0.1:6379> RPOPLPUSH list-x list-z (nil)
如果源非空,但目标为空
127.0.0.1:6379> rpush list-k "a" "b" "c" "d" (integer) 4 127.0.0.1:6379> RPOPLPUSH list-k list-z "d"
llen 获取列表长度
127.0.0.1:6379> RPUSH todo "g" "l" "o" (integer) 3 127.0.0.1:6379> RPUSH alph "g" "l" "o" (integer) 3 127.0.0.1:6379> RPUSH jenkins "j" "m" "y" (integer) 3 127.0.0.1:6379> LLEN todo (integer) 3 127.0.0.1:6379> LLEN alph (integer) 3 127.0.0.1:6379> LLEN jenkins (integer) 3
对于不存在列表则返回0
127.0.0.1:6379> LLEN tomcat (integer) 0
lindex 获取指定所有上元素;
127.0.0.1:6379> LINDEX list index
正数索引从列表的左端开始计算,依次向右递增最左端元素为0,左端第二个为1,做大的正数索引就是列表长度减一;负数索引从列表的右端开始计算,依次向左递增,最右侧的元素所有为-1
获取test 列表会获取指定索引元素
127.0.0.1:6379> RPUSH test "a" "b" "c" "d" "e" "f" "g" "h" (integer) 8 127.0.0.1:6379> LINDEX test 0 "a" 127.0.0.1:6379> LINDEX test -1 "h" 127.0.0.1:6379> LINDEX test -3 "f" 127.0.0.1:6379> LINDEX test 3 "d" 127.0.0.1:6379> LINDEX test 6 "g" 127.0.0.1:6379> LINDEX test -7 "b"
超出范围的索引报空
127.0.0.1:6379> LINDEX test -10 (nil) 127.0.0.1:6379> LINDEX test 10 (nil)
lrange:获取指定范围上的元素
127.0.0.1:6379> LRANGE list start end
获取test列表指定索引元素
127.0.0.1:6379> LRANGE test 0 3 1) "a" 2) "b" 3) "c" 4) "d" 127.0.0.1:6379> LRANGE test 2 6 1) "c" 2) "d" 3) "e" 4) "f" 5) "g" 127.0.0.1:6379> LRANGE test -5 -1 1) "d" 2) "e" 3) "f" 4) "g" 5) "h"
获取列表所有元素
127.0.0.1:6379> LRANGE test 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "f" 7) "g" 8) "h"
如果用户给定起始索引和结束索引都超出范围,那么Lrange命令就会返回空作为结果;如果用户给定的其中一个索引超出了范围,那么Lrange命令将会对,超出范围的索引进行修正,然后执行实际范围获取操作,其中超出范围起始索引会修正为0,而超出范围的结束索引则会被修正为-1
127.0.0.1:6379> LRANGE test 50 100 (empty list or set)
有一个超出索引范围
127.0.0.1:6379> LRANGE test 0 50 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "f" 7) "g" 8) "h"
lset:为指定索引设置新元素
用户可以通过lset为指定索引设置新元素
127.0.0.1:6379> LSET list index new_element
修改todo列表的新元素
127.0.0.1:6379> LRANGE todo 0 -1 1) "g" 2) "l" 3) "o" 127.0.0.1:6379> lset todo 1 "hava lunch" OK 127.0.0.1:6379> LRANGE todo 0 -1 1) "g" 2) "hava lunch" 3) "o"
处理产出范围的索引只能报错
127.0.0.1:6379> lset todo 6 "hava lunch" (error) ERR index out of range
linsert :将元素插入列表
127.0.0.1:6379> LINSERT list before|after pive new_element
第二个参数的值可以是before或者after。他们分别表示指令将新元素插入目标元素前面或者后面。操作完成返回列表长度;通过linsert命令,将元素“10086”插入tset列表元素b前面
127.0.0.1:6379> LRANGE test 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "f" 7) "g" 8) "h" 127.0.0.1:6379> LINSERT test before "b" "10086" (integer) 9 127.0.0.1:6379> LRANGE test 0 -1 1) "a" 2) "10086" 3) "b" 4) "c" 5) "d" 6) "e" 7) "f" 8) "g" 9) "h"
将12345元素插入元素c后面
127.0.0.1:6379> LINSERT test after "c" "12345" (integer) 10 127.0.0.1:6379> LRANGE test 0 -1 1) "a" 2) "10086" 3) "b" 4) "c" 5) "12345" 6) "d" 7) "e" 8) "f" 9) "g" 10) "h"
处理用户给定不存在元素时,命令返回-1
127.0.0.1:6379> LINSERT test after "s" "1" (integer) -1
ltrim :修剪列表,命令接受和一个索引范围作为参数,并移除列表中位于给定索引范围的所有元素。只保留给定范围的元素
127.0.0.1:6379> ltrim list start end
对于test列表而言,只保留索引2-9的值
127.0.0.1:6379> LRANGE test 0 -1 1) "b" 2) "c" 3) "12345" 4) "d" 5) "e" 6) "f" 7) "g" 8) "h"
处理负数索引
127.0.0.1:6379> RPUSH yy "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" (integer) 10 127.0.0.1:6379> LTRIM yy -5 -1 OK 127.0.0.1:6379> LRANGE yy 0 -1 1) "5" 2) "6" 3) "7" 4) "8" 5) "9"
lrem :从列表中移除指定元素
127.0.0.1:6379> LREM list count element
count参数的值决定了lrem命令移除元素的方式。如果count参数值等于0 ,那么lrem命令会清空列表里所有指定的元素;如果大于0那么命令将从列表的左端开始检查并移除最先发现的count个指定的元素;如果count小于0,那么lrem命令将从列表是我右端开始向左检查,并移除最先发现count个指定的元素
127.0.0.1:6379> RPUSH cx-1 "a" "b" "b" "a" "c" "c" "a" (integer) 7 127.0.0.1:6379> RPUSH cx-2 "a" "b" "b" "a" "c" "c" "a" (integer) 7 127.0.0.1:6379> RPUSH cx-3 "a" "b" "b" "a" "c" "c" "a" (integer) 7
移除cx-1 列表所有a
127.0.0.1:6379> LREM cx-1 0 "a" (integer) 3 127.0.0.1:6379> LRANGE cx-1 0 -1 1) "b" 2) "b" 3) "c" 4) "c"
移除cx-2列表最靠近左端的两个a
127.0.0.1:6379> LREM cx-2 2 "a" (integer) 2 127.0.0.1:6379> LRANGE cx-2 0 -1 1) "b" 2) "b" 3) "c" 4) "c" 5) "a"
移除cx-3列表里最靠近右端的两个a
127.0.0.1:6379> LREM cx-3 -2 "a" (integer) 2 127.0.0.1:6379> LRANGE cx-3 0 -1 1) "a" 2) "b" 3) "b" 4) "c" 5) "c"
blpop:阻塞式左端弹出操作
blpop命令是带有阻塞功能的左端弹出操作,他接受任意多个列表以及一个秒级精度时间作为时间限制
127.0.0.1:6379> BLPOP list [list ...] timeout
blpop命令会按照从左到右的顺序依次检查用户给定的列表,并对最先遇到的非空列表执行左端弹出操作,如果blpop命令在检查了用户给定的所有列表后并没有发现可以执行弹出操作的非空列表,那么它将阻塞执行该命令的客户端并等待,直到某个给定列表变为非空,又或者等待时间超出给定时限为止;
127.0.0.1:6379> BLPOP test 5 1) "test" 2) "b" 127.0.0.1:6379> BLPOP test 5 1) "test" 2) "c" 127.0.0.1:6379> BLPOP test 5 1) "test" 2) "12345" 127.0.0.1:6379> BLPOP test 5 1) "test" 2) "d" 127.0.0.1:6379> 127.0.0.1:6379> BLPOP test 1 1) "test" 2) "e"