首页  >  文章  >  数据库  >  redis什么时候用list

redis什么时候用list

藏色散人
藏色散人原创
2019-06-11 09:50:014121浏览

Redis 列表(list)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。(推荐:《redis视频教程》)

redis什么时候用list

list

常用命令:  

    lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。  

  

应用场景:  

    Redis list的应用场景非常多,也是Redis最重要的数据结构之一。  

    我们可以轻松地实现最新消息排行等功能。  

    Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。  

  

实现方式:  

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。  

  

RPOPLPUSH source destination  

  

    命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:  

    将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。  

    将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。  

    如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。  

    一个典型的例子就是服务器的监控程序:它们需要在尽可能短的时间内,并行地检查一组网站,确保它们的可访问性。  

    redis.lpush "downstream_ips", "192.168.0.10"  
    redis.lpush "downstream_ips", "192.168.0.11"  
    redis.lpush "downstream_ips", "192.168.0.12"  
    redis.lpush "downstream_ips", "192.168.0.13"  
    Then:  
    next_ip = redis.rpoplpush "downstream_ips", "downstream_ips"

  

BLPOP  

  

  假设现在有 job 、 command 和 request 三个列表,其中 job 不存在, command 和 request 都持有非空列表。考虑以下命令:  

  BLPOP job command request 30  #阻塞30秒,0的话就是无限期阻塞,job列表为空,被跳过,紧接着command 列表的第一个元素被弹出。  

  1) "command"                             # 弹出元素所属的列表  

  2) "update system..."                    # 弹出元素所属的值   

  为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。  

以上是redis什么时候用list的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn