您的位置:首页 > 数据库 > Redis

NoSQL之Redis中的List消息队列

2016-01-03 00:00 661 查看
摘要: NoSQL之Redis中的List消息队列,说的是redis的第三种数据类型,list,现在看看Redis怎么操作消息队列

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的头部添加字符串元素:
 27.0.0.1:6379> lpush game angrybird
(integer) 1
127.0.0.1:6379> lpush game qqgame
(integer) 2
127.0.0.1:6379> lrange game 0 1
1) "qqgame"
2) "angrybird"
127.0.0.1:6379>

2,  rpush   

在key对应list的尾部添加字符串元素:
127.0.0.1:6379> rpush game lol
(integer) 3
127.0.0.1:6379> rpush game xml
(integer) 4
127.0.0.1:6379> lrange game 0 -1
1) "qqgame"
2) "angrybird"
3) "lol"
4) "xml"
127.0.0.1:6379>

3,  linsert

在key对应list的特定位置之前或之后添加字符串元素:
  
127.0.0.1:6379> linsert game before xml egg
(integer) 5
127.0.0.1:6379> linsert game after lol heheh
(integer) 6
127.0.0.1:6379> lrange game 0 -1
1) "qqgame"
2) "angrybird"
3) "lol"
4) "heheh"
5) "egg"
6) "xml"
127.0.0.1:6379>  

4, lset
 
 设置list中指定下标的元素值(下标从0开始):
 127.0.0.1:6379> lrange game 0 -1
1) "qqgame"
2) "angrybird"
3) "lol"
4) "heheh"
5) "egg"
6) "xml"
127.0.0.1:6379> lset game 1 haha
OK
127.0.0.1:6379> lset game 3 heinrich
OK
127.0.0.1:6379> lset game 14 hhhhhh
(error) ERR index out of range
127.0.0.1:6379> lrange game 0 -1
1) "qqgame"
2) "haha"
3) "lol"
4) "heinrich"
5) "egg"
6) "xml"
127.0.0.1:6379>
当超过list的长度的时候,就会index out of range lset只是修改了指定位置的value值

 5,  lrem
 
从key对应list中删除count个和value相同的元素。
   count>0时,按从头到尾的顺序删除,具体如下:
  
   127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "php"
7) "java"
8) "android"
9) "javascript"
10) "php"
11) "javascript"
127.0.0.1:6379> lrem book 1 php
(integer) 1
127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "java"
7) "android"
8) "javascript"
9) "php"
10) "javascript"
127.0.0.1:6379> lrem book 3 php
(integer) 3
127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "java"
4) "android"
5) "javascript"
6) "php"
7) "javascript"
127.0.0.1:6379>
lrem book  删除的个数, 删除那个元素  头到尾开始删除

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

127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "php"
7) "php"
8) "php"
9) "java"
10) "android"
11) "javascript"
12) "php"
13) "javascript"
14) "javascript"
15) "javascript"
16) "javascript"
17) "javascript"
18) "javascript"
19) "javascript"
20) "javascript"
21) "javascript"
127.0.0.1:6379> lrem book -2 javascript
(integer) 2
127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "php"
7) "php"
8) "php"
9) "java"
10) "android"
11) "javascript"
12) "php"
13) "javascript"
14) "javascript"
15) "javascript"
16) "javascript"
17) "javascript"
18) "javascript"
19) "javascript"
127.0.0.1:6379> lrem book -7 javascript
(integer) 7
127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "php"
7) "php"
8) "php"
9) "java"
10) "android"
11) "javascript"
12) "php"
127.0.0.1:6379>

lrem book  删除的个数, 删除那个元素  尾到头开始删除

 count=0时,删除全部,具体如下:
 127.0.0.1:6379> lrange book 0 -1
1) "php"
2) "php"
3) "php"
4) "php"
5) "php"
6) "php"
7) "php"
8) "php"
9) "java"
10) "android"
11) "javascript"
12) "php"
127.0.0.1:6379> lrem book 0 php
(integer) 9
127.0.0.1:6379> lrange book 0 -1
1) "java"
2) "android"
3) "javascript"
127.0.0.1:6379>

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

127.0.0.1:6379> lrange book 0 -1
1) "java"
2) "android"
3) "javascript"
127.0.0.1:6379> ltrim book 1 -1
OK
127.0.0.1:6379> lrange book 0 -1
1) "android"
2) "javascript"
127.0.0.1:6379>

 7、lpop
 
 从list的头部删除元素,并返回删除元素:
127.0.0.1:6379> lrange book 0 -1
1) "android"
2) "javascript"
3) "ali"
4) "amili"
127.0.0.1:6379> lpop book
"android"
127.0.0.1:6379>

7、rpop
 
从list的尾部删除元素,并返回删除元素:
127.0.0.1:6379> lrange book 0 -1
1) "android"
2) "javascript"
3) "ali"
4) "amili"
127.0.0.1:6379> lpop book
"android"
127.0.0.1:6379> rpop book
"amili"
127.0.0.1:6379>

9、rpoplpush

  从第一个list的尾部移除元素并添加到第二个list的头部,
最后返回被移除的元素值,
整个操作是原子的.如果第一个list是空或者不存在返回nil:
也就是把第一个元素的东西添加到另外一个list中,并删除该元素
127.0.0.1:6379> lrange book 0 -1
1) "html"
2) "python"
3) "android"
4) "c"
5) "php"
6) "java"
127.0.0.1:6379> lpush book1 c++
(integer) 1
127.0.0.1:6379> rpoplpush book book1
"java"
127.0.0.1:6379>

10、lindex   
返回名称为key的list中index位置的元素:返回索引所对应的值

127.0.0.1:6379> lrange book 0 -1
1) "html"
2) "python"
3) "android"
4) "c"
5) "php"
127.0.0.1:6379> lindex book 2
"android"
127.0.0.1:6379>

11、llen

  
返回key对应list的长度:

127.0.0.1:6379> lrange book 0 -1
1) "html"
2) "python"
3) "android"
4) "c"
5) "php"
127.0.0.1:6379> lindex book 2
"android"
127.0.0.1:6379> llen book
(integer) 5
127.0.0.1:6379>

  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis之List