目录
Redis中的List类型,是保证元素有序的,支持队列从两端进行插入删除和获取,并且元素时刻重复的。
LPUSH
将⼀个或者多个元素从左侧放⼊(头插)到 list 中。
语法
LPUSH key element [element ...]时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> LPUSH mylist "world" (integer) 1 redis> LPUSH mylist "hello" (integer) 2 redis> LRANGE mylist 0 -1 1) "hello" 2) "world"
LPUSHX
在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回。
语法
LPUSHX key element [element ...]时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> LPUSH mylist "World" (integer) 1 redis> LPUSHX mylist "Hello" (integer) 2 redis> LPUSHX myotherlist "Hello" (integer) 0 redis> LRANGE mylist 0 -1 1) "Hello" 2) "World" redis> LRANGE myotherlist 0 -1 (empty array)
RPUSH
将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。语法
RPUSH key element [element ...]时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> RPUSH mylist "hello" (integer) 1 redis> RPUSH mylist "world" (integer) 2 redis> LRANGE mylist 0 -1 1) "hello" 2) "world"
RPUSHX
在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。
语法
RPUSHX key element [element ...]时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数. 返回值:插⼊后 list 的⻓度。 举例
redis> RPUSH mylist "Hello" (integer) 1 redis> RPUSHX mylist "World" (integer) 2 redis> RPUSHX myotherlist "World" (integer) 0 redis> LRANGE mylist 0 -1 1) "Hello" 2) "World" redis> LRANGE myotherlist 0 -1 (empty array)
LRANGE
获取从 start 到 end 区间的所有元素,左闭右闭。语法
LRANGE key start stop时间复杂度:O(N) 返回值:指定区间的元素。 举例
redis> RPUSH mylist "one" (integer) 1 redis> RPUSH mylist "two" (integer) 2 redis> RPUSH mylist "three" (integer) 3 redis> LRANGE mylist 0 0 1) "one" redis> LRANGE mylist -3 2 1) "one" 2) "two" 3) "three" redis> LRANGE mylist -100 100 1) "one" 2) "two" 3) "three" redis> LRANGE mylist 5 10 (empty array)
LPOP
从 list 左侧取出元素(即头删)。语法
LPOP key时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> RPUSH mylist "one" "two" "three" "four" "five" (integer) 5 redis> LPOP mylist "one" redis> LPOP mylist 2 1) "two" 2) "three" redis> LRANGE mylist 0 -1 1) "four" 2) "five"
RPOP
从 list 右侧取出元素(即尾删)。语法
RPOP key时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> RPUSH mylist "one" "two" "three" "four" "five" (integer) 5 redis> RPOP mylist "five" redis> RPOP mylist 2 1) "four" 2) "three" redis> LRANGE mylist 0 -1 1) "one" 2) "two"
LINDEX
获取从左数第 index 位置的元素。
语法
LINDEX key index
时间复杂度:O(N)
返回值:取出的元素或者 nil。
举例
redis> LPUSH mylist "World" (integer) 1 redis> LPUSH mylist "Hello" (integer) 2 redis> LINDEX mylist 0 "Hello" redis> LINDEX mylist -1 "World" redis> LINDEX mylist 3 (nil)
LINSERT
在特定位置插⼊元素。
语法
LINSERT key <BEFORE | AFTER> pivot element时间复杂度:O(N) 返回值:插⼊后的 list ⻓度。 举例
redis> RPUSH mylist "Hello" (integer) 1 redis> RPUSH mylist "World" (integer) 2 redis> LINSERT mylist BEFORE "World" "There" (integer) 3 redis> LRANGE mylist 0 -1 1) "Hello" 2) "There" 3) "World"
LLEN
获取 list ⻓度。
语法
LLEN key时间复杂度:O(1) 返回值:list 的⻓度。 举例
redis> LPUSH mylist "World" (integer) 1 redis> LPUSH mylist "Hello" (integer) 2 redis> LLEN mylist (integer) 2
阻塞版本命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,除了:
• 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执⾏其他命令,但要求执⾏该命令的客⼾端会表现为阻塞状态。
• 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令⽴即返回。
• 如果多个客⼾端同时多⼀个键执⾏ pop,则最先执⾏命令的客⼾端会得到弹出的元素。
BLPOP
LPOP 的阻塞版本。
语法
BLPOP key [key ...] timeout时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> DEL list1 list2 (integer) 0 redis> RPUSH list1 a b c (integer) 3 redis> BLPOP list1 list2 0 1) "list1" 2) "a"
BRPOP
RPOP 的阻塞版本。
语法
BRPOP key [key ...] timeout时间复杂度:O(1) 返回值:取出的元素或者 nil。 举例
redis> DEL list1 list2 (integer) 0 redis> RPUSH list1 a b c (integer) 3 redis> BRPOP list1 list2 0 1) "list1" 2) "c"
内部编码
列表类型的内部编码有两种:
• ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤ziplist 来作为列表的内部编码实现来减少内存消耗。
• linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现。
1)当元素个数较少且没有⼤元素时,内部编码为 ziplist:
127.0.0.1:6379> rpush listkey e1 e2 e3
OK
127.0.0.1:6379> object encoding listkey
"ziplist"
2)当元素个数超过 512 时,内部编码为 linkedlist:
127.0.0.1:6379> rpush listkey e1 e2 e3 ... 省略 e512 e513
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"
3)当某个元素的⻓度超过 64 字节时,内部编码为 linkedlist:
127.0.0.1:6379> rpush listkey "one string is bigger than 64 bytes ... 省略 ..."
OK
127.0.0.1:6379> object encoding listkey
"linkedlist"
应用场景
1.消息队列
List类型可以用作一个先进先出(FIFO)的消息队列。生产者将消息添加到列表的右端(尾部),而消费者则从列表的左端(头部)读取消息。这种机制非常适合在生产者和消费者之间传递消息,实现异步通信。
2.数据分页
在处理大量数据时,可以使用List类型来实现数据的分页显示。将数据按照某种顺序存储在列表中,然后根据页码和每页显示的数据量来获取相应的数据子集。这种方法在处理需要分页显示的长列表时非常有效。
3.延时任务
标签:mylist,List,元素,redis,详解,LRANGE,key,integer,Redis From: https://blog.csdn.net/wmh_1234567/article/details/144488372List类型可以用于存储延时任务,如发送电子邮件、短信通知等。将任务添加到列表中,并使用定时任务系统(如Redis的键空间通知或外部定时任务调度器)检查列表中的任务,并在适当的时间执行它们。