zoukankan      html  css  js  c++  java
  • redis 学习笔记三(队列功能)

    Redis队列功能介绍

    List

    常用命令:

    Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用

    Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用

    Brpoplpush

    Lindex获取一个元素,通过其索引列表

    Linsert在列表中的另一个元素之前或之后插入一个元素

    Llen获得队列(List)的长度

    Lpop从队列的左边出队一个元素

    Lpush从队列的左边入队一个或多个元素

    Lpushx当队列存在时,从队到左边入队一个元素

    Lrange从列表中获取指定返回的元素

    Lrem从列表中删除元素

    Lset设置队列里面一个元素的值

    Ltrim修剪到指定范围内的清单

    Rpop从队列的右边出队一个元素

    Rpoplpush删除列表中的最后一个元素,将其追加到另一个列表

    Rpush从队列的右边入队一个元素

    Rpushx从队列的右边入队一个元素,仅队列存在时有效

     

    Redis支持phppythonc等接口

     

     

     

     

     

     

     

     

    应用场景:

    Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redislist结构来实现。

    Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。

    Lists的另一个应用就是消息队列,

    可以利用ListsPUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

     

    如果需要还可以用redisSorted-Sets数据结构来做优先队列.可以给每条消息加上一个唯一的序号。这里就不详细介绍了。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    实现方式:

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

      

     

     

     

     

     

     

     

     

     

     

     

    示意图:

    1)入队

     

     

     

     

     

     

     

     

     

     

     

    2)出队(非阻塞模式)

     

     

    lpop弹出列表首元素(即最后入队的元素)

     

     

     

     

     

     

    Rpop弹出列表尾元素 (即入队的最开始的一个元素)

    注意:如果要当作队列功能,应该是用这个出队

     

     

    这里的出队都是非阻塞模式,就是你用pop出队的时候,如果队列是空的话,你得到的是一个NULL的值

     

     

     

     

     

     

     

     

     

     

     

    3)出队(阻塞模式)

    假如现在queue队列为空  我们用brpop命令

    BRPOP 是一个阻塞的列表弹出原语。 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接。 该命令会按照给出的 key 顺序查看 list,并在找到的第一个非空 list 的尾部弹出一个元素。

     

     

     

     

    A)

    我们执行brpop命令

    可以看到队列queue没有元素的时候  是阻塞的  即不返回值    

    其中0是超时时间 为0表示一直等待

     

    B)

    这个时候我们用lpush往队列里 入队一个数据“bbb

     

    C)

    阻塞的队列立马会弹出出队元素   显示队列名字  和 出队元素  已经等待了多少时间

     

    D)

    Brpop还能同时阻塞多个队列比如这样

     

     

     

     

    用redis的list当作队列可能存在的问题

    1)redis崩溃的时候队列功能失效

    2)如果入队端一直在塞数据,而出队端没有消费数据,或者是入队的频率大而多,出队端的消费频率慢会导致内存暴涨

    3)Redis的队列也可以像rabbitmq那样  即可以做消息的持久化,也可以不做消息的持久化。

    当做持久话的时候,需要启动redisdump数据的功能.暂时不建议开启持久化。

     

    Redis其实只适合作为缓存,而不是数据库或是存储。它的持久化方式适用于救救急啥的,不太适合当作一个普通功能来用。应为dump时候,会影响性能,数据量小的时候还看不出来,当数据量达到百万级别,内存10g左右的时候,非常影响性能。

     

    4)假如有多个消费者同时监听一个队列,其中一个出队了一个元素,另一个则获取不到该元素

    5)Redis的队列应用场景是一对多或者一对一的关系,即有多个入队端,但是只有一个消费端(出队)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    PHP的redis 简单操作示例

     

  • 相关阅读:
    SR-IOV(Single Root I/O Virtualization)
    DHCP&DHCPv6
    Linux 上的基础网络设备详解
    当Linux用尽内存-oom
    真爱了--网络工程师技能图谱
    程序员必备技能:如何画好架构图?
    Linux内存使用情况以及内存泄露情况
    Neutron 消息回调系统
    linux bridge
    OpenStack-Neutron-code
  • 原文地址:https://www.cnblogs.com/ztteng/p/4073211.html
Copyright © 2011-2022 走看看