NoSQL之Redis中的List消息队列

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> 


   
    



 


转载于:https://my.oschina.net/heinrichchen/blog/596455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值