实战解析耳听八方的Redis拓展应用——Stream,java开发大厂面试经验

    1. 1527849629172-0
    1. “name”
  1. “xiaoyu”

  2. “age”

  3. “29”

127.0.0.1:6379> xdel codehole 1527849609889-0

(integer) 1

长度不受影响

127.0.0.1:6379> xlen codehole

(integer) 3

被删除的消息没了

127.0.0.1:6379> xrange codehole - +

    1. 1527849629172-0
    1. “name”
  1. “xiaoyu”

  2. “age”

  3. “29”

    1. 1527849637634-0
    1. “name”
  4. “xiaoqian”

  5. “age”

  6. “1”

删除整个 Stream

127.0.0.1:6379> del codehole

(integer) 1

独立消费

====

我们可以在不定义消费组的情况下进行 Stream 消息的独立消费,当 Stream 没有新消 息时,甚至可以阻塞等待。Redis 设计了一个单独的消费指令 xread,可以将 Stream 当成普通的消息队列 (list) 来使用。使用 xread 时,我们可以完全忽略消费组 (Consumer Group) 的存在,就好比 Stream 就是一个普通的列表 (list)。

从 Stream 头部读取两条消息

127.0.0.1:6379> xread count 2 streams codehole 0-0

    1. “codehole”
      1. 1527851486781-0
    1. “name”
  1. “laoqian”

  2. “age”

  3. “30”

    1. 1527851493405-0
    1. “name”
  4. “yurui”

  5. “age”

  6. “29”

从 Stream 尾部读取一条消息,毫无疑问,这里不会返回任何消息

127.0.0.1:6379> xread count 1 streams codehole $

(nil)

从尾部阻塞等待新消息到来,下面的指令会堵住,直到新消息到来

127.0.0.1:6379> xread block 0 count 1 streams codehole $

我们从新打开一个窗口,在这个窗口往 Stream 里塞消息

127.0.0.1:6379> xadd codehole * name youming age 60

1527852774092-0

再切换到前面的窗口,我们可以看到阻塞解除了,返回了新的消息内容

而且还显示了一个等待时间,这里我们等待了 93s

127.0.0.1:6379> xread block 0 count 1 streams codehole $

    1. “codehole”
      1. 1527852774092-0
    1. “name”
  1. “youming”

  2. “age”

  3. “60”

(93.11s)

客户端如果想要使用 xread 进行顺序消费,一定要记住当前消费到哪里了,也就是返回的消息 ID。下次继续调用 xread 时,将上次返回的最后一个消息 ID 作为参数传递进去, 就可以继续消费后续的消息。

block 0 表示永远阻塞,直到消息到来,block 1000 表示阻塞 1s,如果 1s 内没有任何消息到来,就返回 nil。

127.0.0.1:6379> xread block 1000 count 1 streams codehole $ (nil) (1.07s)

创建消费组

=====

​Stream 通过 xgroup create 指令创建消费组 (Consumer Group),需要传递起始消息 ID 参数用 来初始化 last_delivered_id 变量。

表示从头开始消费

127.0.0.1:6379> xgroup create codehole cg1 0-0

OK

$ 表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略

127.0.0.1:6379> xgroup create codehole cg2 $

OK

获取 Stream 信息

127.0.0.1:6379> xinfo stream codehole

  1. length

  2. (integer) 3 # 共 3 个消息

  3. radix-tree-keys

  4. (integer) 1

  5. radix-tree-nodes

  6. (integer) 2

  7. groups

  8. (integer) 2 # 两个消费组

  9. first-entry # 第一个消息

    1. 1527851486781-0
    1. “name”
  10. “laoqian”

  11. “age”

  12. “30”

  13. last-entry # 最后一个消息

    1. 1527851498956-0
    1. “name”
  14. “xiaoqian”

  15. “age”

  16. “1”

获取 Stream 的消费组信息

127.0.0.1:6379> xinfo groups codehole

    1. name
  1. “cg1”

  2. consumers

  3. (integer) 0 # 该消费组还没有消费者

  4. pending

  5. (integer) 0 # 该消费组没有正在处理的消息

    1. name
  6. “cg2”

  7. consumers # 该消费组还没有消费者

  8. (integer) 0

  9. pending

  10. (integer) 0 # 该消费组没有正在处理的消息

消费

==

Stream 提供了 xreadgroup 指令可以进行消费组的组内消费,需要提供消费组名称、消费者名称和起始消息 ID。它同 xread 一样,也可以阻塞等待新消息。读到新消息后,对应的消息 ID 就会进入消费者的 PEL(正在处理的消息) 结构里,客户端处理完毕后使用 xack 指令通知服务器,本条消息已经处理完毕,该消息 ID 就会从 PEL 中移除。

> 号表示从当前消费组的 last_delivered_id 后面开始读

每当消费者读取一条消息,last_delivered_id 变量就会前进

127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >

    1. “codehole”
      1. 1527851486781-0
    1. “name”
  1. “laoqian”

  2. “age”

  3. “30”

127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >

    1. “codehole”
      1. 1527851493405-0
    1. “name”
  1. “yurui”

  2. “age”

  3. “29”

127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 2 streams codehole >

    1. “codehole”
      1. 1527851498956-0
    1. “name”
  1. “xiaoqian”

  2. “age”

  3. “1”

    1. 1527852774092-0
    1. “name”
  4. “youming”

  5. “age”

  6. “60”

再继续读取,就没有新消息了

127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >

(nil)

那就阻塞等待吧

127.0.0.1:6379> xreadgroup GROUP cg1 c1 block 0 count 1 streams codehole >

开启另一个窗口,往里塞消息

127.0.0.1:6379> xadd codehole * name lanying age 61

1527854062442-0

回到前一个窗口,发现阻塞解除,收到新消息了

127.0.0.1:6379> xreadgroup GROUP cg1 c1 block 0 count 1 streams codehole >

    1. “codehole”
      1. 1527854062442-0

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

  • 第一个是算法

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本

《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

587103)]

《算法的乐趣》共有23个章节:

[外链图片转存中…(img-jiZK5fp9-1711032587104)]

[外链图片转存中…(img-vSoVooI8-1711032587104)]

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

[外链图片转存中…(img-IBaI4vEy-1711032587105)]

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

[外链图片转存中…(img-9WKRqOBf-1711032587105)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值