初步了解Redis(三) | 青训营笔记

79 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第11天

List

List是简单的字符串列表, 按照插入顺序进行排序, 但是可以进行头插或尾插. 最大长度为2^32 - 1

实现

早期Redis的实现是由双向链表压缩链表完成的

  • 列表元素少于 512 个, 且每个元素的值都小于 64 Byte, Redis 使用压缩列表实现 List
  • 反之, Redis 使用双向链表实现 List

现在Redis中底层实现均由quickList实现.

使用场景

消息队列

消息队列实现时, 需要满足消息保序, 处理重复消息和保证消息的可靠性三点

  1. 消息保序

    由于redis很类似java中的双端对列, 在消息保序这一块, 可以像双端队列一样, 只采用一个方向, 即将其视为单向队列, 满足先进先出的要求.

  2. 处理重复消息

    我们需要为每一条消息都生成一个全局id, 在接收消息的一方收到消息时, 和已经处理过的消息ID比对, 判断有没有处理过该条消息

  3. 保证消息的可靠性

    当List中存在大量消息, 并且消费者读出但并未来得及处理时, 如果此时消费者断电宕机, 会丢失该条的消息

    为了避免此类情况的发生, Redis提供了BROPLPUSH命令, 即在消费者取出消息时, Redis同步将该消息写入另一个列表用作备份

消息队列这块很类似生产者消费者模型, 可以将消息发送方视为生产者, 接收方视为消费者, 而消息队列视为仓库, 只是这里的仓库没有指定长度.

既然很类似生产者消费者模型, 那么就 面临一个问题, 就是当仓库为空时, 消费者必须时刻盯着仓库, 以在生产者发来消息时可以即使取出.

为了避免此类性能消耗, Redis提供了BRPOP命令, 即阻塞式读取, 消费者在仓库为空时自动阻塞, 直至生产者向仓库发来数据.