- 博客(12)
- 收藏
- 关注
原创 排序算法:堆排序
本文介绍了堆排序算法,主要分为三部分:首先定义堆的概念,包括完全二叉树、大顶堆和小顶堆的结构特性;其次详细讲解堆排序的实现过程,包括建大顶堆和排序输出的核心步骤;最后给出Java代码实现并分析时间复杂度为O(NlogN)和空间复杂度为O(1)。堆排序通过下沉调整操作实现稳定的原地排序,适合升序采用大顶堆、降序采用小顶堆的策略。
2026-04-14 17:26:30
461
原创 美团点评开源分布式ID方案:Leaf
本文介绍了美团Leaf分布式ID生成器的两种实现方案。Leaf-segment方案基于数据库自增主键,通过分段缓存提升性能,支持多业务隔离和扩展,但存在ID不够随机和依赖数据库的问题。Leaf-snowflake方案基于雪花算法,通过Zookeeper解决服务ID分配问题,采用时间戳比对机制处理时钟回拨问题。两种方案各有优缺点,Leaf-segment适合趋势递增场景,Leaf-snowflake则提供更随机的ID。文章详细分析了两种方案的技术原理、优缺点及相应的优化措施。
2026-04-06 16:34:43
3834
原创 HTTP和RPC刨析
摘要: HTTP和RPC是微服务通信的两种主要方式。HTTP基于文本传输,兼容性强,适合对外暴露接口(如RESTful API),但性能较低;RPC采用二进制协议,性能高效,适合内部高频服务调用(如gRPC、Dubbo)。HTTP优势在于跨语言支持和易调试,而RPC在服务治理、长连接复用等方面更优。实际场景中,对外交互(如前端调用)多用HTTP,内部服务通信(如订单与库存)优先RPC。选择时需权衡性能、兼容性及治理需求。
2026-04-02 23:45:00
577
原创 分布式ID的演进
分布式唯一ID生成方案在分布式系统中至关重要,传统的自增主键在分库分表场景下会导致ID冲突。本文分析了两种递增ID实现方式:单调递增(Redis和MySQL方案)存在数据丢失或性能瓶颈问题;趋势递增方案(数据库分库分表和雪花算法)更具扩展性。重点介绍了雪花算法的位分配原理及实例ID生成方法,并指出其时钟回拨问题及解决方案。通过比较不同方案的优缺点,为分布式系统ID生成提供了可行的技术选型参考。
2026-03-31 17:54:00
637
原创 力扣系列-206.反转链表,92.反转链表|| 从反转整个链表 -> 反转前N个节点 -> 反转一个范围的节点( 迭代 Or 递归?)
本文系统讲解了反转链表的三种情况及其实现方法: 反转整个链表:通过迭代(双指针)和递归两种方式实现,核心思路是逐个反转节点指向 反转前N个节点:在完整反转基础上调整边界处理,重点解决断开重连问题 反转指定区间节点:通过定位区间、切断连接、反转后重新拼接的方式实现 文章提供了每种情况的详细思路图解和Java代码实现(包括迭代和递归两种解法),帮助读者深入理解链表反转的核心逻辑。从基础到进阶,层层递进地讲解了链表操作的关键技术点。
2026-03-17 10:52:31
972
原创 布隆过滤器和布谷鸟过滤器详细解读
本文对比介绍了布隆过滤器和布谷鸟过滤器两种数据结构。布隆过滤器由二进制数组和多个哈希函数组成,支持快速查询但存在误判且不支持删除。布谷鸟过滤器改进为使用桶数组和指纹机制,支持删除操作且误判率更低。两者都适用于缓存穿透防护、去重和黑白名单等场景。布隆过滤器简单但功能有限,布谷鸟过滤器功能更全面但实现复杂。根据误判容忍度和删除需求可选择合适的过滤器类型。
2026-03-14 23:45:00
3323
原创 力扣系列-hot100的两个滑动窗口 3.无重复字符的最长字串,438.找到字符串中所有字母异位词
本文介绍了两个字符串处理问题。3.无重复字符的最长子串使用滑动窗口和HashSet维护无重复子串,通过双指针动态调整窗口边界,时间复杂度O(n)。438.找到字符串中所有字母异位词通过固定长度滑动窗口和数组计数统计字符频率,高效匹配异位词。两题均利用滑动窗口优化暴力解法,分别达到了O(n)和O(n)的时间复杂度。
2026-03-14 23:30:00
655
原创 Cookie,Session,Token,JWT都是些什么?什么情况下用什么?
本文系统介绍了三种主流Token认证方案。Session+Cookie方案简单易用但存在跨域和集群问题;Opaque Token+Redis解决了集群问题但依赖Redis高可用;JWT实现无状态认证但存在令牌不可失效问题。重点分析了JWT的结构、生成验证流程,并提出双令牌+Redis黑名单的改进方案。最后通过对比表格总结各方案特点:Session适合简单单体项目,Opaque Token适用于集群环境,JWT则更适合微服务架构。三种方案各有优劣,企业可根据具体场景选择最合适的认证机制。
2026-03-08 23:45:00
5708
原创 键盘上敲字如飞,开口却“阿巴阿巴”?是你吗,程序员?
摘要:程序员群体普遍面临表达能力退化的困境,关键在于打破"知识诅咒"。文章提出三种实用技巧:1)运用费曼学习法进行生活化类比(如用餐厅比喻前后端);2)采用ELI5分层表达法,根据听众调整讲解深度;3)善用可视化工具和金字塔表达结构。强调表达能力如同肌肉需要持续锻炼,建议通过复盘思路、朗读技术文章等方式保持语言活力。良好的沟通能力能让技术价值得到更充分展现。(149字)
2026-03-05 20:36:09
348
原创 压缩列表(ziplist),quicklist,listpack,跳表傻傻分不清?带你超详细解读ziplist和listpack
Redis中Zset底层数据结构在不同版本有所变化:Redis7之前使用压缩列表(ziplist)和跳表,之后改用listpack和跳表。压缩列表和listpack适用于元素少且小的情况,否则使用跳表以提高查询效率。压缩列表通过prevlen、encoding、data顺序存储实现双向遍历,但存在连锁更新问题。listpack优化了结构,将prevlen改为len并移至尾部,彻底解决了连锁更新问题。跳表通过多级索引实现O(logN)查询,适合大数据量场景。这些结构设计充分考虑了内存利用率和查询效率的平衡。
2026-03-05 17:19:55
3935
原创 力扣系列-深度理解146.LRU缓存 为什么哈希表的值是节点?为什么采用双向链表而不是单向链表?
本文介绍了力扣第146题LRU缓存的实现思路与解法。通过哈希表与双向链表的结合,实现O(1)时间复杂度的get和put操作。哈希表存储键值对,双向链表维护使用顺序,头部存放最新访问节点,尾部存放最久未使用节点。当容量超限时自动删除尾部节点。文章还讨论了采用双向链表而非单向链表的原因(便于快速操作节点前后指针),并给出了完整的Java实现代码。最后提出扩展思考:若加入TTL(生存时间),可采用惰性删除策略,仅在访问时检查节点是否过期。
2026-03-03 01:36:30
2197
原创 HashMap八股文一看见就头痛?别急,一文带你彻底搞懂HashMap
HashMap是一个java中存储键值对的集合,底层基于哈希表实现。以下是HashMap的一些特性:键值对形式存储:键是唯一的,可以为null,但只能有一个。值可以重复,可以为null。线程不安全:HashMap不是线程安全的。无序性:HashMap不保证遍历顺序和插入顺序一致基于哈希表实现:查找性能为O(1)构造函数:当无参构造时,底层构建一个16大小的数组;当有参构造时,底层构建一个大于该数字的最小的2的平方数。
2026-03-01 01:38:20
3420
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅