Redis 列表处理
刚开始学Redis,听说用的最多的就是这个列表操作了。
一个列表可以处理2^32 - 1个元素,虽然都是简单的字符串类型。
Redis的列表究竟有多强大,学习学习就知道了。
1、BLPOP 命令
用于移出获取列表首个元素(后进先出),如果列表为空会阻塞列表直到等待超时或发现有元素可弹出为止。
跟LPOP对应,可以同时操作多个列表,使用空格隔开。
127.0.0.1:6379> BLPOP KEY [key ...] TIMEOUT
例如,
127.0.0.1:6379> LPUSH LIST 1 (integer) 1 127.0.0.1:6379> LPUSH LIST 2 (integer) 2 127.0.0.1:6379> LPUSH LIST 3 (integer) 3 127.0.0.1:6379> LPUSH LIST 4 (integer) 4 127.0.0.1:6379> LPUSH LIST 5 (integer) 5 127.0.0.1:6379> LPUSH LIST 6 (integer) 6 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "6" 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "5" 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "4" 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "3" 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "2" 127.0.0.1:6379> BLPOP LIST 1 1) "LIST" 2) "1" 127.0.0.1:6379> BLPOP LIST 1 (nil) (1.00s)
2、BRPOP 命令
用于移出获取列表末个元素(先进先出),如果列表为空会阻塞列表直到等待超时或发现有元素可弹出为止。
跟RPOP对应,可以同时操作多个列表,使用空格隔开。
127.0.0.1:6379> BRPOP KEY [key ...] TIMEOUT
例如,
127.0.0.1:6379> LPUSH LIST 1 (integer) 1 127.0.0.1:6379> LPUSH LIST 2 (integer) 2 127.0.0.1:6379> LPUSH LIST 3 (integer) 3 127.0.0.1:6379> LPUSH LIST 4 (integer) 4 127.0.0.1:6379> LPUSH LIST 5 (integer) 5 127.0.0.1:6379> LPUSH LIST 6 (integer) 6 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "1" 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "2" 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "3" 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "4" 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "5" 127.0.0.1:6379> BRPOP LIST 1 1) "LIST" 2) "6" 127.0.0.1:6379> BRPOP LIST 1 (nil) (1.11s)
3、BRPOPLPUSH 命令
用于移出获取列表末个元素(先进先出),将获取的元素放入另外一个列表中。
如果列表为空会阻塞列表直到等待超时或发现有元素可弹出为止。
可以拆分为:BRPOP -> LPUSH操作。
127.0.0.1:6379> BRPOPLPUSH SOURCE DESTINATION TIMEOUT
例如,
127.0.0.1:6379> LPUSH LIST1 1 (integer) 1 127.0.0.1:6379> LPUSH LIST1 2 (integer) 2 127.0.0.1:6379> LPUSH LIST1 3 (integer) 3 127.0.0.1:6379> LPUSH LIST1 4 (integer) 4 127.0.0.1:6379> LPUSH LIST1 5 (integer) 5 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 "1" 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 "2" 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 "3" 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 "4" 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 "5" 127.0.0.1:6379> BRPOPLPUSH LIST1 LIST2 10 (nil) (10.10s)
4、LINDEX 命令
通过索引来获取列表中元素的值(后进先出、先进后出)。INDEX可以是正数也可以是负数。
-1表示最后一个元素,-2表示倒数第二个元素,以此类推。
如果给定的索引位置不存在,则返回nil。
127.0.0.1:6379> LINDEX KEY INDEX
例如,
127.0.0.1:6379> LPUSH LIST 1 (integer) 1 127.0.0.1:6379> LPUSH LIST 2 (integer) 2 127.0.0.1:6379> LPUSH LIST 3 (integer) 3 127.0.0.1:6379> LPUSH LIST 4 (integer) 4 127.0.0.1:6379> LPUSH LIST 5 (integer) 5 127.0.0.1:6379> LPUSH LIST 6 (integer) 6 127.0.0.1:6379> LINDEX LIST 1 "5" 127.0.0.1:6379> LINDEX LIST 0 "6" 127.0.0.1:6379> LINDEX LIST -1 "1" 127.0.0.1:6379> LINDEX LIST 10 (nil)
5、LINSERT 命令
用于在指定的列表中相关元素的前后插入新的元素。
当指定的元素不存在时,不做任何操作;当该列表不存在时,不做任何操作;
使用此命令注意,查找元素的顺序是逆序的,也就是从队尾开始找起。
127.0.0.1:6379> LINSERT LIST BEFORE|AFTER PIVOT VALUE
例如,
127.0.0.1:6379> LRANGE LIST 0 -1 1) "2" 2) "3" 3) "4" 4) "3" 5) "2" 6) "1" 127.0.0.1:6379> LINSERT LIST BEFORE 2 5 (integer) 7 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "2" 3) "3" 4) "4" 5) "3" 6) "2" 7) "1"
6、LLEN 命令
用于返回一个列表的长度,如果列表不存在或者为空,则返回0,如果不是列表类型,则返回错误说明。
127.0.0.1:6379> LLEN KEY
例如,
127.0.0.1:6379> LLEN LIST (integer) 7 127.0.0.1:6379> LLEN LIST1 (integer) 0 127.0.0.1:6379> SET KEY 1 OK 127.0.0.1:6379> LLEN KEY (error) WRONGTYPE Operation against a key holding the wrong kind of value
7、LPOP 命令
用于移出获取列表首个元素(后进先出)。
127.0.0.1:6379> LPOP KEY
例如,
127.0.0.1:6379> LPOP LIST "5" 127.0.0.1:6379> LPOP LIST "2" 127.0.0.1:6379> LPOP LIST "3" 127.0.0.1:6379> LPOP LIST "4" 127.0.0.1:6379> LPOP LIST "3" 127.0.0.1:6379> LPOP LIST "2" 127.0.0.1:6379> LPOP LIST "1" 127.0.0.1:6379> LPOP LIST (nil)
8、LPUSH 命令
用于将一个或多个值插入指定的列表中。如果指定的列表不存在,则创建一个新的列表。
如果指定的KEY不是一个列表类型时,则返回一个错误说明。
127.0.0.1:6379> LPUSH KEY VALUE [value ...]
例如,
127.0.0.1:6379> LPUSH KEY 1 2 3 4 5 (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> LPUSH LIST 1 2 3 4 5 (integer) 5 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1"
9、LPUSHX 命令
用于将一个值插入指定的列表中 。
如果指定的列表不存在,则不进行任何操作。
127.0.0.1:6379> LPUSHX KEY VALUE
例如,
127.0.0.1:6379> lpush LIST 1 (integer) 1 127.0.0.1:6379> lpush LIST2 1 (integer) 1 127.0.0.1:6379> lpushX LIST3 1 (integer) 0 127.0.0.1:6379> lpushX LIST3 1 (integer) 0
10、LRANGE 命令
用于返回列表中指定区间内的元素值。区间通过START与STOP指定。
启动0表示列表的第一个元素,以此类推。-1表示最后一个元素,-2表示倒数第二个元素。
127.0.0.1:6379> LRANGE KEY START STOP
例如,
127.0.0.1:6379> LRANGE LIST 0 -1 1) "1" 127.0.0.1:6379> lpush LIST 2 (integer) 2 127.0.0.1:6379> lpush LIST 3 (integer) 3 127.0.0.1:6379> lpush LIST 4 (integer) 4 127.0.0.1:6379> LRANGE LIST 0 -1 1) "4" 2) "3" 3) "2" 4) "1"
11、LREM 命令
用于删除列表中与指定元素相同的元素,数量由COUNT指定。
127.0.0.1:6379> LREM KEY COUNT VALUE
例如,当COUNT为正数时:从队头向队尾的方向查找。
127.0.0.1:6379> LPUSH LIST 1 2 3 1 4 1 5 (integer) 7 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "1" 3) "4" 4) "1" 5) "3" 6) "2" 7) "1" 127.0.0.1:6379> LREM LIST 1 1 (integer) 1 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "4" 3) "1" 4) "3" 5) "2" 6) "1"
例如,当COUNT为负数时:从队尾向队头查找。
127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "4" 3) "1" 4) "3" 5) "2" 6) "1" 127.0.0.1:6379> LREM LIST -1 1 (integer) 1 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "4" 3) "1" 4) "3" 5) "2" 127.0.0.1:6379>
12、LSET 命令
用于通过索引,设置列表中相应位置上的元素值。
如果索引超出范围或者列表为空时,则返回一个错误说明。
127.0.0.1:6379> LSET KEY INDEX VALUE
例如,
127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "4" 3) "1" 4) "3" 5) "2" 127.0.0.1:6379> LSET LIST 1 0 OK 127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "0" 3) "1" 4) "3" 5) "2" 127.0.0.1:6379> LSET LIST 10 0 (error) ERR index out of range
13、LTRIM 命令
用于对一个列表进行修剪(TRIM)操作,列表中只保留指定区间内的元素,不在区间内的元素都被删除。
区间通过START与STOP进行指定,0表示第一个元素,-1表示最后一个元素。
127.0.0.1:6379> LTRIM KEY START STOP
例如,
127.0.0.1:6379> LRANGE LIST 0 -1 1) "5" 2) "0" 3) "1" 4) "3" 5) "2" 127.0.0.1:6379> LTRIM LIST 1 -2 OK 127.0.0.1:6379> LRANGE LIST 0 -1 1) "0" 2) "1" 3) "3" 127.0.0.1:6379>
14、RPOP 命令
用于移出并返回列表的最后一个元素。如果为空,则返回nil。
127.0.0.1:6379> RPOP KEY
例如,
127.0.0.1:6379> LRANGE LIST 0 -1 1) "0" 2) "1" 3) "3" 127.0.0.1:6379> RPOP LIST "3" 127.0.0.1:6379> RPOP LIST "1" 127.0.0.1:6379> RPOP LIST "0" 127.0.0.1:6379> RPOP LIST (nil)
15、RPOPLPUSH 命令
用于移出获取队列表头元素(先进先出),将获取的元素放入另外一个列表中。
可以拆分为:RPOP -> LPUSH操作。
127.0.0.1:6379> RPOPLPUSH SOURCE DESTINATION
例如,
127.0.0.1:6379> LPUSH LIST 1 2 3 4 5 6 7 8 9 10 (integer) 10 127.0.0.1:6379> Lrange LIST 0 -1 1) "10" 2) "9" 3) "8" 4) "7" 5) "6" 6) "5" 7) "4" 8) "3" 9) "2" 10) "1" 127.0.0.1:6379> RPOPLPUSH LIST LIST1 "1" 127.0.0.1:6379> RPOPLPUSH LIST LIST1 "2" 127.0.0.1:6379> RPOPLPUSH LIST LIST1 "3" 127.0.0.1:6379> RPOPLPUSH LIST LIST1 "4" 127.0.0.1:6379> RPOPLPUSH LIST LIST1 "5"
16、RPUSH 命令
用于将一个或多个值插入指定列表的尾部。如果指定的列表不存在,则创建一个新的列表。
如果指定的KEY不是一个列表类型时,则返回一个错误说明。
127.0.0.1:6379> RPUSH LIST VALUE [value ...]
例如,
127.0.0.1:6379> RPUSH LIST 5 4 3 2 1 (integer) 10 127.0.0.1:6379> LRANGE LIST 0 -1 1) "10" 2) "9" 3) "8" 4) "7" 5) "6" 6) "5" 7) "4" 8) "3" 9) "2" 10) "1"
17、RPUSHX 命令
用于将一个值插入指定列表的尾部,如果指定的列表不存在,则不进行任何操作。
127.0.0.1:6379> RPUSHX KEY VALUE
例如,
127.0.0.1:6379> RPUSHX LIST 11 (integer) 11 127.0.0.1:6379> LRANGE LIST 0 -1 1) "10" 2) "9" 3) "8" 4) "7" 5) "6" 6) "5" 7) "4" 8) "3" 9) "2" 10) "1" 11) "11" 127.0.0.1:6379> RPUSHX LIST2 11 (integer) 0 127.0.0.1:6379> RPUSHX LIST2 11 (integer) 0