快速排序
20230515
R.I.P @haoel
来到上海的第 1000 天,是我在这座城市最难过的一天。
如引言所见,”左耳朵耗子“陈皓老师突然去世,MegaEase 变成灰色,池大大也发微博确认,看来是真事,惊讶程度直逼科比。技术大佬不缺钱,当然要把革命的本钱照顾好,没想到是心梗,没认真对待身体实锤。
正经说话的人有,阴阳怪气的也大有人在。我一直不理解,为什么互联网总充斥着各色各样的人和各种各样的奇怪言论。逝者安息和死者为大是基本常识吧!还有人用这件事开玩笑,也不知道居心何在。Peace & Love
16 年我在库尔勒,看了吴军老师的《AA 之 B》系列丛书,特别是《浪潮之巅》,下定决心今后投身互联网,遂回到石河子转入计科系。如果吴军老师是我的灯塔,那陈皓老师就是我的路标。《左耳听风之程序员练级攻略》是对我职业生涯影响最大的系列文章,我知道合格程序员要有自己的技术修养、技术积累到底到何种程度、软件设计究竟如何取舍等等。感谢他吧,我还是会加油的,同时要照顾好自己的身体。
组内今天有同事晋升,也让我非常苦恼。被晋升的同事比我优秀,也更值得被晋升。如果让我来想和他差在哪里?1. 为人和善,和每一位同事都能相处融洽;2. 处理问题能力强。针对与同事相处融洽这点,我好像只欣赏自己看上的人,对一些普通同事,太苛责。还有就是自己爱骂人,虽然不是恶意。针对处理问题能力强这点,倒不是说我不行,而是我能寻迅速解决一些完全是自己掌控下出现的问题,非自己掌握的情况下,就非常便秘。进一步来说,自己或许擅长从流程和软件完整生命周期内,思考和解决问题,而不擅长投入到细碎和具体的业务中。我总是希望用一些方式,预防问题发生,减少问题的发生,而不是修复问题。在我看来,这是“战术上的勤奋”掩盖“战略上的懒惰”。难道公司需要有战斗力的员工,而非我这种从研发效率方面解决问题的人?
刚和父亲打了电话,聊了我的想法。父亲说了一些不痛不痒的话后,转头又给生哥拨过去,他的事说完到我这儿,就要做饭了。匆匆挂了电话,我认真思考起来:商业才能让技术产生价值。我想用自己掌握的技术,为社会创造出一丁点儿的贡献也好。努力地成长为 T 型的人,学习软件工程,实践软件架构,接触 React、Vue 和 Flutter,都是为了让自己能一个人承担起完整商业产品。这都是沉没成本。
可惜,不能说给某人听了。
递归
消息队列
Redis 中的流是包含零个或任意多个流元素的有序队列,队列中的每个元素都包含一个 id 和任意多个键值对,这些元素会根据 id 的大小在流中有序地进行排列。
流中元素 id
基本命令
XADD
将一个带有指定 id 和键值对的元素追加到 stream 中,并返回插入的 id。
id 的限制:
同一个流中的不同元素是不允许使用相同ID的;
新元素的ID必须比流中所有已有元素的ID都要大;
1 | -- 将 id = 1100000000000-12345,k1 v1 的键值对添加到 s1 中 |
时间复杂度:O(logn)
XTRIM
将 streamn 修剪为最大长度,也是采用先进先出的方式,返回移除的个数。
1 | -- 1 |
时间复杂度:O(logn + m)
XDEL
根据 id 删除一个或多个元素,返回删除元素数量。
1 | XDEL s1 1683948051401-0 |
时间复杂度:O(logn * m)
XLEN
返回 stream 中元素个数,不合法就返回 0.
1 | XADD s1 * k1 v1 |
时间复杂度:O(1)
XRANGE
提供获取 stream 中元素的各种方式,如果不合法返回 nil。
1 | XADD s1 * k1 v1 |
时间复杂度:O(logn + m)
XREVRANGE
同 XRANGE,唯一不同的是 id 的逆序版本。
XREAD
提供获取 stream 中元素的各种方式,如果不合法返回 nil。
1 | XADD s1 * k1 v1 |
时间复杂度:O(logn + m)
XGROUP
管理消费者组,增删改。
id 用来限定消费者能够接收到消息范围。
1 | -- 在 s1 上创建一个名为 all-msg 的消费者组,可以接收 > 0-0 的消费者 时间复杂度:O(1) |
总结
- stream 用来支持消息队列;
- stream 中包含零个到多个元素的有序队列;
- stream 的 id 由“毫秒时间”和“顺序编号“组成;
- 消费者组允许将一个 stream 从逻辑上划分为多个不同的 stream,让 group 所属的 comsumer 消费;
- 消息的生命周期:不存在 -> 未递送 -> 待处理 -> 已确认