技术随笔
文章平均质量分 85
JellyfishMIX
qunar -- java 开发
展开
-
由 mysql 中的一次慢查询,来看 order by 的文件排序和索引排序
在 mysql 中 filesort 的实现算法有两种:双路排序:根据查询条件取出排序字段,和可以直接定位行数据的行指针信息,这也是第一次 IO。然后在 sort buffer 中进行排序。把行指针排序好后,要再进行一次 IO 将具体的行查询字段读出,才能返回结果。单路排序:根据查询条件取出排序字段和需要查询的行字段(一次 IO),然后在 sort buffer 中进行排序。排序后就可以返回结果了。原创 2022-10-29 11:52:41 · 782 阅读 · 0 评论 -
Class.forName() 与 ClassLoader.loadClass() 的区别
Class.forName() 的方式加载类时,默认会执行类的初始化。ClassLoader.loadClass() 的方式加载类时,类不会被初始化,只有显式调用加载的类时才会进行初始化。采用 ClassLoader 进行懒加载,不会调用类的 static 代码块,实现延迟加载。原创 2022-10-28 23:09:11 · 669 阅读 · 0 评论 -
redis 的渐进式 rehash,为什么 java 不采用渐进式 rehash
渐进式 rehash 只适合用在作为共享变量的哈希表中,且多次方法调用(特别是多次请求)都会去操作这个共享变量。这样才能发挥其 rehash 耗时每次调用均分的优势。比如 redis 的 dict 就是很好的例子。原创 2022-10-28 22:49:33 · 457 阅读 · 0 评论 -
JVM safe point 安全点和 counted loop 可数循环
图中主线程在进入 safe point 后,发现 STW 标志位为 true(为什么 STW 标志位为 true 后面再分析),阻塞在安全点,需要等待一次 GC 执行后才能离开安全点。而且由于 counted loop 花费的时间更长了,导致主线程要在安全点等更久,其他线程才能完成 counted loop,进入安全点。Thread.sleep() 方法是一个 native 方法,在从 native 方法返回后,JVM 会在当前线程设置一个安全点,让线程进入这个安全点。原创 2022-10-28 22:48:00 · 1165 阅读 · 0 评论 -
各种开源许可 Lincense
Apache Licence 2.0 是著名的非盈利开源组织 Apache 采用的协议。鼓励代码共享和尊重原作者的著作权,允许修改代码、发布 (作为开源或商业软件均可)。原创 2022-10-28 22:46:58 · 4208 阅读 · 0 评论 -
redis cluster 集群模式存在的问题
如果用子线程去执行 migrate,那么 redis 就是多线程操作数据,这样会引入线程之间的锁竞争和并发控制,这就违背了最初的设计。此外,RDB 的生成是 fork 了主进程,生成快照,不是子线程。咨询了 DBA 同事,解决方案是用 DBA 自己的工具(这个工具可以根据具体情况去开发),将数据拆分迁移到其他分片,并没有使用 redis 官方的命令 migrate。migrate 命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。原创 2022-10-28 22:45:07 · 2366 阅读 · 0 评论