- 博客(44)
- 问答 (1)
- 收藏
- 关注
原创 记一次生产事故-消息积压分析
在5月20日这天,出了一个生产事故,导致消息队列中积压了大量消息,峰值时期达到 200w+。 下面主要就这个生产事故,顺带梳理一下消息积压问题以及常见的解决方案。
2022-06-08 08:45:54
329
1
原创 Redis持久化-RDB机制实现原理
Redis可以将数据库某一时刻的状态记录下来存入日志,后续数据恢复时只需要将日志中的数据载入内存即可,因此数据恢复效率更高,这一持久化技术就是指Redis的RDB持久化机制,本文主要讲述RDB的实现原理。
2022-05-15 10:58:42
353
原创 Redis持久化-AOF机制实现原理
Redis 本身提供了数据持久化技术,在服务器出现异常宕机之后,能快速恢复宕机前的数据。其中包含 RDB,AOF 持久化机制,本文将详细说明 AOF 机制的实现原理,揭秘其高可靠性,高性能的原理。
2022-05-14 09:07:05
662
原创 Redis高级功能-Lua脚本实现原理
Lua 是一个简洁、轻量、可扩展的脚本语言,它有着相对简单的API 因此很容易嵌入应用中,Redis 从 2.6 版本开始支持 Lua 脚本。
2022-05-07 13:18:55
1603
原创 还能更快吗?Redis的quicklist完美诠释“多快好省”
还能不能再快点?Redis 的 quicklist 快速列表完美诠释什么叫做“多快好省”,它既吸收了 ziplist 的内存压缩特性,又保持了 linkedlist 高效率增删节点的特性。
2022-04-23 09:32:22
271
原创 Redis-ziplist压缩列表底层实现
压缩列表 ziplist 作为 Redis 底层核心的数据结构,重点在于如何节省内存空间,以及提升内存操作效率。
2022-04-19 22:20:59
765
原创 Redis-dict字典底层实现
Redis 本质是 K-V 键值对数据库,底层通过字典 dict 存储键值映射关系,除此之外,dict 还作为 Redis hash 结构底层的实现之一。
2022-04-17 18:31:31
890
原创 Redis-有序集合之跳表实现
Redis 中有序集合 zset 的底层数据结构有 ziplist 和 skiplist 两种实现,当集合内节点相对简单时使用 ziplist 节省空间,当节点数量达到一定规模或节点长度超过了设定的阈值,则会转换成 skiplist 跳表。
2022-04-16 20:45:53
714
原创 堆排序不稳定性分析-“消失”的几条数据
本文通过排查生产数据同步问题,追溯到 mysql 基于 file-sort 排序不稳定问题,进而追溯到堆排序,topK 问题。
2022-04-01 21:43:33
1817
原创 Redis-字符串底层实现
SDS 是 Redis 字符串底层实现的数据结构,全称 Simple-Dynamic-String 简单动态字符串,对 C 语言的字符串进行了增强,增强主要体现在效率和安全性方面。
2022-03-20 10:13:47
1628
原创 系统了解Mysql-MVCC并发控制机制
大概两年前因为排查一个数据可见性的问题也了解过 Mysql 的 MVCC,当时觉得自己都懂了,但始终没有将这块知识串联起来,所以总感觉印象不深刻,其实本质上还是因为没有搞清楚这个东西的来龙去脉,没有真正地理解它。
2022-02-21 17:35:36
675
原创 分布式唯一ID-雪花算法
雪花算法满足分布式唯一ID对于唯一性,单调递增性,安全性的要求,无论在实现复杂度,还是性能方面都有很大的优势,且,能适用于大部分业务场景。
2022-02-10 22:35:40
1660
原创 一致性hash
概述一致性 hash 是传统 hash 算法的增强版。多用于分布式数据存储场景,在集群节点数量发生变化时,提升集群适应变化的能力。传统hash假设当前服务集群中存在 3 个节点:Node-A,Node-B, Node-C;而客户端存在 Key1,Key2,Key3 需要映射到对应的服务节点。传统 hash 算法思路:先计算 key 对应的 hash 值将 hash 值和服务节点的数量取模,算出对应节点的下标,即 Hash(Key) % NodeSize如下图,通过传统 hash 计算出的
2021-10-17 20:57:18
5442
1
原创 RocketMQ原理-消息消费流程
概述本文目的在于将消息消费的流程梳理完毕,使自己包括读者能够对 RocketMQ 的消息消费流程有清晰的认识。主要包含以下内容:相关概念介绍消费端的队列分配,即负载均衡机制消息拉取的实现机制并发消费,顺序消费的实现机制消费模式消费者类型注意:在最新发布的 RocketMQ 中,已将 DefaultMQPullConsumer 类标记为弃用,预计在 2022 会将这个类移除,对应的替代类为 DefaultLitePullConsumer。消费方式分为并发消费和顺序消费。并
2021-10-07 20:16:12
2404
原创 RocketMQ原理-消息发送流程
RocketMQ 源码版本 4.9.1概述整体架构各角色说明:NameServer,负责提供路由服务Producer,生产者,负责发送消息Broker,消息队列,负责存储消息并提供相关的API操作Consumer,消费者,负责消费消息生产-消费模型消息发送方式:同步,异步,单向消息类型:普通消息(包含延迟消息),顺序消息(全局顺序与局部顺序),事务消息本文通过同步发送普通消息的Demo,来了解消息发送的主要流程。生产者下面看到一个生产者发送消息的 demo主要做了几.
2021-09-19 14:06:35
244
原创 RocketMQ原理-自动创建Topic机制
背景RocketMQ 源码版本 4.0.0本地调试 RocketMQ 代码时碰到了问题,关于本地调试环境搭建的细节这边就不赘述了,主要描述一下问题发生的场景。下载了 RocketMQ 源码,在本地 IDE 中正常启动了 Broker 服务 和 NameServer 服务。生产者发送消息的 demo 如下:public class SyncProducer { public static void main(String[] args) throws Exception {
2021-09-04 16:51:43
9259
1
原创 mysql-事务隔离之可重复读
本文默认使用的 mysql 数据库引擎为 InnoDB,事务隔离级别为可重复读(repeatable read)问题起因最近在业务的开发过程中,碰到了一个问题。线程A对某一数据进行更新操作之后(存在事务),立即开启线程B处理异步任务,查询该数据发现它并没有更新,导致后续操作失败。分析问题后发现和数据库事务隔离级别相关,开发环境中 mysql 数据库的事务隔离级别设置的是可重复读(repeatable read)。问题分析:线程A对数据进行更新操作,此时存在事务A,并且还没有提交;.
2020-05-16 17:06:24
3531
3
原创 hashmap源码-扩容机制
前言注意,本系列文章都是基于 jdk 1.8这是 hashmap 源码系列文章的第三篇,前面文章讲解了 hash 算法,以及元素 put, get 的流程,相信大家对 hashmap 容器已经有了大体上的认识,今天要讲的内容可谓是 hashmap 的重头戏——扩容机制。内容主要涉及:容器扩容负载因子扩容机制容器扩容jdk 中很多容器的底层实现使用的是数组,比如 ArrayList,还有今天要说的 Hashmap。数组的容量是一开始指定好的,为一组连续的内存空间。在实际的开发过程中
2020-05-10 18:09:04
343
原创 hashmap源码-元素put,get
前言注意,本系列文章都是基于 jdk 1.8这是 hashmap 源码系列文章的第二篇,前面我们主要讲解了 hashmap 中 hash 算法的实现,本文则是带大家了解元素 get, put 的相关实现,这样一来 hashmap 的大体框架就描绘完毕了。内容主要涉及:hashmap 初始化时机元素 put 流程元素 get 流程初始化时机还记得前面我们提到 hashmap ...
2020-04-25 22:30:59
161
原创 hashmap源码-hash算法
前言注意,本系列文章都是基于 jdk 1.8这是 hashmap 源码系列文章的第一篇,主要带大家初步了解 hashmap 几个重要的知识点,在后续的文章中会深入讲解框架中各个部分的实现细节。内容主要涉及:基础结构hashmap 初始化hash 算法扰动函数基础结构hashmap 的基础结构涉及几部分:数组链表红黑树正常情况下 hashmap 元素存取的时间复...
2020-04-24 20:48:59
385
原创 小姐姐知道我用微信机器人和她聊天之后,把我拉黑了
前言事情是这样的,最近认识的一位小姐姐有每天早晨看天气预报的习惯。在我看来,很多人起床第一件事情就是看微信消息,既然这样,我就勉为其难每天早晨给小姐姐发送一则天气预报吧。开始几天,我是使用很原始的方法,自己去获取天气预报截图,再手动发送给小姐姐。连续几天之后我一想:不对呀,我怎么说也是一个程序猿,怎么能用这么 low 的方式呢。联想起之前看到的一个开源 python 库—— wxpy,一个...
2020-04-12 15:42:16
1486
1
原创 一则小坑:java.io.FileNotFoundException Too many open files
前言最近项目准备上线,在测试环境测试通过,准备把项目部署到『预发布环境』,可以把它理解为我们上线前的最后一个验证环境。在部署的过程中,发现涉及的几个项目都部署失败了,jenkins 集成平台上『一片报红』,把我给整懵逼了。这里再交代一下项目部署的方式:通过 jenkins 进行一系列 build 相关的操作之后,将构建产物(war包形式)传输到指定环境机器的 tomcat 容器中,启动运行。...
2020-04-12 08:42:26
3405
1
原创 redis-基础数据结构二
在前面的文章 redis-基础数据结构一 中介绍了 redis 基础数据结构中的两种,分别是字符串和哈希,今天我们来了解剩下的三种数据结构:列表,集合,有序集合。列表列表(list)类型是用来存储多个有序的字符串。在Redis中,可 以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等;另外列表中的元素可以是重复的。总之它是一种比较灵活的数据结...
2020-04-06 14:35:11
196
原创 redis-基础数据结构一
前言Redis 作为基于键值对的 NoSQL 数据库,具有高性能,丰富的数据结构,持久化,高可用,分布式等特性,这些特性使得 Redis 从同等竞品中脱颖而出,现如今已成为互联网公司软件架构的标配。因此作为一名后端开发人员,有必要也有责任去搞清楚 Redis 的正确使用方式,了解其底层原理有助于工作中问题的排查。基础数据结构Redis 与 Memcached 同为内存数据库,并且数据存储都...
2020-04-05 14:33:41
140
原创 jdk容器-安全失败机制
在上篇文章 jdk容器-快速失败机制中,我们提到 jdk 为非同步容器建立的一种安全警报机制,通过 fail-fast 通知用户可能存在线程安全问题,本质上是因为不同线程并发访问同一集合对象导致的。在主题开始前,我们先来看一段测试代码,和昨天模拟快速迭代失败的代码大体一致,只不过替换了容器。 public static void main(String[] args) { ...
2020-04-04 18:09:51
190
原创 jdk容器-快速失败机制
前两天小伙伴问我关于集合快速失败的问题,勾起了我对快速失败机制 fail-fast 的回忆,这两天也仔细看了一下相关内容,在此做一下总结。先放出小伙伴提的问题,以及对应的测试代码,我稍后会细讲这个话题——为什么没有快速迭代失败?fail-fast先来讲一下 fail-fast,它实际上是一种编程思想,即快速反馈系统错误,防止发生更严重的问题。我们在平时的开发中肯定写过类似的代码,提前判空也...
2020-04-03 22:13:30
195
原创 mysql-请求包大小限制
问题今天在开发环境测试即将要上线的一个功能,其中有一个步骤会往 mysql 数据库批量插入大量数据。在测试的过程发现流程失败了,查看日志发现了这么一个错误。### Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (6034195 > 4...
2020-04-02 22:43:27
1609
原创 leetcode刷题-重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7重建二叉树上午在学习广度遍历优先的算法...
2020-03-25 20:18:49
244
原创 leetcode刷题-反转链表
题目反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL题目链接:https://leetcode-cn.com/problems/reverse-linked-list/迭代迭代的思路比较简单,反转一个链表,只需要让每个节点指向上一个节点算法思路...
2020-03-25 20:16:00
110
原创 jvm探索之路-基于栈的方法执行机制
起因这周例会上,在进行 code review 时,有同事对其中一个方法变量的定义位置提出疑问 // 为了方便,对代码进行了简化 public static void main(String[] args) { for (int i = 0; i < 100; i++) { int a = 1; int b = 2...
2020-03-25 20:10:45
173
原创 线程池源码-异常处理
在线程池源码系列文章 线程池源码-线程被全部关闭了吗 中有提到,线程池在结束 worker 线程时会有一个标识 completedAbruptly,用来判断线程是否为异常退出。那什么时候线程会异常退出呢?答案很明显,在执行任务的过程中抛出了异常,且没有进行 try catch 处理。本篇文章主要探索下面的问题线程池默认的异常处理方式,存在的问题关于异常处理的解决方案默认处理想知道...
2020-03-25 09:23:28
154
原创 leetcode刷题-验证二叉搜索树
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ ...
2020-03-22 14:46:00
147
原创 单例模式-序列化问题
在前面文章 单例模式-双检锁就稳了?,提到了对象序列化会破坏单例模式,同时也做了试验,今天我们来借着这个问题了解一下序列化的过程。序列化的作用起源这里就不详细赘述了,本文主要解决序列化破坏单例的问题。如果想详细了解序列化,反序列化过程,推荐一篇文章,写得清清楚楚,包括底层实现流程。https://cloud.tencent.com/developer/article/1125165)问题...
2020-03-19 21:36:32
483
原创 单例模式-双检锁就稳了?
前言前两天和一位朋友聊到单例模式的双检锁,相信了解过线程并发的朋友对双检锁不陌生,也可以看我之前分享的文章 并发编程-可见性,原子性,有序性问题。这位朋友问我:双检锁能解决反射攻击和序列化问题吗?说实话,正好碰到我的知识盲区了,恰逢今天同事也提到单例,简单了解一下相关知识。双检锁我们先来回顾一下双检锁的经典写法。public class Singleton { private ...
2020-03-17 21:57:39
169
原创 并发编程-可见性,原子性,有序性问题
前言传统计算机以单核为主,多个调度任务通过『分时』策略共享同一个处理器的资源。在之后的时间里计算机设备快速发展,随着多核处理器的出现,计算机的运算能力得到了大幅度的提升,在程序的编写方面,出现了并发编程,为的是能够最大程度地提高对处理器的利用率,与此同时,也带来了众多程序并发相关的问题,大致可以概括为以下三个问题。可见性在计算机发展的过程中,面临的一个大问题就是——cpu,内存,外存之间的速...
2020-03-17 21:54:43
159
原创 并发编程-线程中断机制
在前面的线程池系列文章 线程池源码-线程全部被关闭了吗 ,提到了线程池 shutdown 过程会使用线程的中断机制去关闭线程,试着问自己一个问题——调用线程的中断方法 interrupt() 就能中断线程吗?起源试想一下,你的电脑开着杀毒软件正杀着毒呢,你不耐烦地点击停止按钮企图停止这一过程,本质上来说就是一个线程想终止另外一个线程,这就要求线程间提供一种中断机制,传递中断信号。而中断的...
2020-03-12 22:09:37
139
原创 线程池源码-线程全部关闭了吗
在前面的文章线程池源码-线程池状态,我们提到线程池的各种状态,以及线程池 shutdown 的流程,但始终有个疑问:shutdown 操作最终能否关闭所有线程?疑问起源为什么会有这个问题呢?回顾前面提到的 shutdown 流程。检查是否有终止线程池的权限,会挨个检查每个线程修改线程池状态为 SHUTDOWN终止空闲线程,怎么判断线程是否空闲,通过 tryLock() 尝试获取它的锁,...
2020-03-12 08:45:12
389
空空如也
安卓蓝牙通信 基于底层单片机蓝牙模块的通信
2016-05-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人