-
- 1527849629172-0
-
- “name”
-
“xiaoyu”
-
“age”
-
“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 - +
-
- 1527849629172-0
-
- “name”
-
“xiaoyu”
-
“age”
-
“29”
-
- 1527849637634-0
-
- “name”
-
“xiaoqian”
-
“age”
-
“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
-
- “codehole”
-
-
- 1527851486781-0
-
-
- “name”
-
“laoqian”
-
“age”
-
“30”
-
- 1527851493405-0
-
- “name”
-
“yurui”
-
“age”
-
“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 $
-
- “codehole”
-
-
- 1527852774092-0
-
-
- “name”
-
“youming”
-
“age”
-
“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
-
length
-
(integer) 3 # 共 3 个消息
-
radix-tree-keys
-
(integer) 1
-
radix-tree-nodes
-
(integer) 2
-
groups
-
(integer) 2 # 两个消费组
-
first-entry # 第一个消息
-
- 1527851486781-0
-
- “name”
-
“laoqian”
-
“age”
-
“30”
-
last-entry # 最后一个消息
-
- 1527851498956-0
-
- “name”
-
“xiaoqian”
-
“age”
-
“1”
获取 Stream 的消费组信息
127.0.0.1:6379> xinfo groups codehole
-
- name
-
“cg1”
-
consumers
-
(integer) 0 # 该消费组还没有消费者
-
pending
-
(integer) 0 # 该消费组没有正在处理的消息
-
- name
-
“cg2”
-
consumers # 该消费组还没有消费者
-
(integer) 0
-
pending
-
(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 >
-
- “codehole”
-
-
- 1527851486781-0
-
-
- “name”
-
“laoqian”
-
“age”
-
“30”
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 1 streams codehole >
-
- “codehole”
-
-
- 1527851493405-0
-
-
- “name”
-
“yurui”
-
“age”
-
“29”
127.0.0.1:6379> xreadgroup GROUP cg1 c1 count 2 streams codehole >
-
- “codehole”
-
-
- 1527851498956-0
-
-
- “name”
-
“xiaoqian”
-
“age”
-
“1”
-
- 1527852774092-0
-
- “name”
-
“youming”
-
“age”
-
“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 >
-
- “codehole”
-
-
- 1527854062442-0
-
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
587103)]
《算法的乐趣》共有23个章节:
[外链图片转存中…(img-jiZK5fp9-1711032587104)]
[外链图片转存中…(img-vSoVooI8-1711032587104)]
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
[外链图片转存中…(img-IBaI4vEy-1711032587105)]
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
[外链图片转存中…(img-9WKRqOBf-1711032587105)]