Redis List类型及操作

list类型及操作

list 是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。
Redis的list类型其实就是一个每个子元素都是string类型的双向链表。链表的最大长度是(2的32次方)。我们可以通过push,pop操作从链表的头部或尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
有意思的是list的pop操作还有阻塞版本的,当我们[lr]pop一个list对象时,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以阻塞,当然也可以加超时时间,超时后会返回nil。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子,如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。

1.lpush 在key对应list的头部 添加字符串元素

lpush mylist "hello"
lpush mylist "world"

2.rpush 在key对应list的尾部添加字符串元素

rpush mylist2 "hello"
rpush mylist2 "world"

3.linsert在key对应的特定位置之前或之后添加字符串元素

linsert mylist2 before "world" "my"
linsert mylist2 after "world" "you"

4.lset 设置list中指定下标元素值(下标从0开始)返回ok

lset mylist2 0 "wawa"
lset mylist2 -2 "fuck"

5.lrem
从key对应list中删除count个和value相同的元素。

count>0时,按从头到尾的顺序删除,具体如下:

redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist5 "foo" (integer) 3 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist5 2 "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist5 0 -1 
1) "foo" 
2) "hello" 
redis 127.0.0.1:6379>

count<0时,按从尾到头的顺序删除,具体如下:

redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist6 "foo" (integer) 3 redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist6 -2 "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo" redis 127.0.0.1:6379>

count=0时,删除全部,具体如下:

redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist7 "foo"
(integer) 3 
redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist7 0 "hello" (integer) 3 redis 127.0.0.1:6379> lrange mylist7 0 -1 
1) "foo" 
redis 127.0.0.1:6379>

6.ltrim 保留指定key的值范围内的数据

redis 127.0.0.1:6379> rpush mylist8 "one" (integer) 1 redis 127.0.0.1:6379> rpush mylist8 "two" (integer) 2 redis 127.0.0.1:6379> rpush mylist8 "three" (integer) 3 redis 127.0.0.1:6379> rpush mylist8 "four" (integer) 4 redis 127.0.0.1:6379> ltrim mylist8 1 -1 
OK 
redis 127.0.0.1:6379> lrange mylist8 0 -1 
1) "two" 
2) "three" 
3) "four" 
redis 127.0.0.1:6379>

7.lpop从list的头部删除元素,并返回删除元素

redis 127.0.0.1:6379> lrange mylist 0 -1 
1) "hello" 
2) "world" 
redis 127.0.0.1:6379> lpop mylist "hello" 
redis 127.0.0.1:6379> lrange mylist 0 -1 
1) "world" 
redis 127.0.0.1:6379>

8.rpop 从list的尾部删除元素,并返回删除元素

redis 127.0.0.1:6379> lrange mylist2 0 -1 
1) "hello" 
2) "world" 
redis 127.0.0.1:6379> rpop mylist2 "world" 
redis 127.0.0.1:6379> lrange mylist2 0 -1 
1) "hello" 
redis 127.0.0.1:6379>

9.rpoplpush 从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回nil.

redis 127.0.0.1:6379> lrange mylist5 0 -1 
1) "three" 
2) "foo" 
3) "hello" 
redis 127.0.0.1:6379> lrange mylist6 0 -1 
1) "hello" 
2) "foo" 
redis 127.0.0.1:6379> rpoplpush mylist5 mylist6 "hello" 
redis 127.0.0.1:6379> lrange mylist5 0 -1 
1) "three" 
2) "foo" 
redis 127.0.0.1:6379> lrange mylist6 0 -1 
1) "hello" 
2) "hello" 
3) "foo" 
redis 127.0.0.1:6379>

10.lindex返回名称为key的list中index位置的元素

redis 127.0.0.1:6379> lrange mylist5 0 -1 
1) "three" 
2) "foo" 
redis 127.0.0.1:6379> lindex mylist5 0 
"three"
redis 127.0.0.1:6379> lrange mylist5 0 -1 
1) "three" 
2) "foo" 
redis 127.0.0.1:6379> lindex mylist5 0 
"three"
redis 127.0.0.1:6379> lindex mylist5 1 "foo" 
redis 127.0.0.1:6379>

11.llen返回key对应list的长度

redis 127.0.0.1:6379> llen mylist5 
(integer) 2 
redis 127.0.0.1:6379>

本文链接:

https://heyzen.club/index.php/Coder/84.html
1 + 8 =
快来做第一个评论的人吧~