LeeYzero的博客

业精于勤,行成于思

0%

写在前面

跳跃表是一种可以替代平衡树的数据结构。跳跃表采用概率上的平衡而不是强制要求节点的平衡,使得其在插入和删除时更容易实现,而且具有更好的效率。由于跳跃表具有良好的性能和算法实现的简单性,被广泛应用于工程实践中,如redisleveldb等。

本文是对William Pugh的论文Skip Lists: A Probabilistic Alternative to Balanced Trees的解读,主要介绍算法核心思想和算法实现,对于算法的时间和空间复杂度分析并不是本文的重点,这部分内容在论文中有详细介绍。

Read more »

写在前面

MySQL是一款开源的关系型数据库,广泛应用于Web后端的数据存储。索引是MySQL非常重要技术组成部分,深入理解MySQL的索引原理,有助于我们建立高性能的索引以及对索引进行调优。

MySQL支持多种索引类型,如B-Tree索引、哈希索引、全文索引等。索引是在存储引擎中实现的,在实际环境中,应用比较多的是InnoDB存储引擎和MyISAM存储引擎,这两个存储引擎底层都是使用的B-Tree索引。所以,为了不引起歧义,本文讨论的MySQL索引,没有特殊说明,都是指的B-Tree索引。

Read more »

背景

最近由于组织架构调整,团队引入不少新成员。这些成员来自不同的团队和背景,每个人的日志打印风格难免也有所差异,十分有必要制定一个统一的日志打印规范。

规范日志打印主要有以下作用:

  • 让系统运行状态更透明,提高线上故障排查效率。
  • 减少代码风格差异,利于代码阅读和维护。
  • 统一日志格式,利于外围工具(日志监控报警工具等)处理。

团队成员在研发过程中应该遵守该规范,文档内容可能会与你的喜好冲突,请尽量用包容的心态接受。如果有不合理之处,请先在组内提出建议,组内一致表决通过后修改规范。

Read more »

最近换了一台mac,配置了一下终端(terminal)环境,在此记录一下,以便后续查阅,同时给分享给网友作为参考。本文不会细无具细,只会列举出主要步骤和相关配置参考资料。主要包括以下四个部分:

终端效果:

Read more »

最近读了《如何阅读一本书》,很遗憾自己没有早点读到这本书,同时也庆幸自己现在读到这本书。阅读的目标有两种,一种是为了获取资讯,另一种是为了增进理解。《如何阅读一本书》便是一本教你如何通常阅读以增进理解的实用书籍。

打开你的手机,看看你一周的花在各大手机APP上的时间。抖音、快手、知乎、B站、微信公众号…,这些time killer是不是占用了大量的时间?看起来你每天(被)输入了大量信息,但这些信息是否真能增进我们对自己世界的了解呢。很遗憾,并没有。发生这一现象的原因主要有两点:

  • 这些媒体经过精心的设计,对资讯进行精美的包装,让受众根本用不着自己做结论。他们直接将包装后的观点装进自己的脑海中,缺乏对事物的思考。
  • 这些媒体提供的绝大部分是资讯类信息,而且比较零碎,缺乏逻辑性。太多的资讯如同太少的资讯一样,都是对理解力的阻碍。现代媒体正以压倒性的泛滥资讯阻碍了我们的理解力。

诚然,互联网上的确有很多非常不错的知识。但书籍(也包括电子书)仍然是获取知识最重要的信息来源。如何通过阅读以增进理解力本身是一种艺术,《如何阅读一本书》提供了很多值得参考的规则,值得花时间投入学习。但诚如作者所说,对于一本实用性的书,当你读完并赞同作为的观点后,作者的任务就完成了,但作为读者,你的任务才刚刚开始。作者在书中所建议的方法对你是不是有效,需要你在实践中寻找答案。

Read more »

从个人经历过的多个团队中,发现有一个共性是:极少有团队注重单元测试。甚至当我想在团队中倡导单元测试时,有个研发经理跟我表达单元测试没有任何意义的结论。我不知道这是个人的不幸呢,还是整个中国互联网公司的现状如此?

本文算是给单元测试”正名”,介绍单元测试的意义以及编写可测试代码的一些原则和思考。

什么是单元测试

单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能够快速运行。单元测试可靠、可读、并且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。

——The Art of Unit Testing

工作单元是指从调用系统的一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为总称为一个工作单元。一个单元可以小到只包含一个方法,也可以大到包括实现某个功能的多个类和函数。

Read more »

Code Server是一个基于VSCode实现的开源的云端IDE,只要能联网,就可以通过浏览器进行访问,无需安装,十分方便。本文主要介绍如何在CentOS 8中安装Code Server。

依赖环境

  • 2GB RAM
  • 需要root权限,对于非root账号,需要sudo权限
  • 需要安装nginx
Read more »

写在前面

之前写过一篇Go并发编程模式,相对比较片面。最近系统看了下Concurrency in Go, 结合自身的一些实践,形成本文,算是一个读书笔记吧。

为什么需要并发

Concurrency is the next major revolution in how we write software.

—— The Free Lunch Is Over

摘自 Herb Sutter 2005年在Dr. Dobb’s 发表的文章:The Free Lunch Is Over。核心思想是说摩尔定律逐渐失效,但数据规模却在不断增长,我们需要充分挖掘多核计算机性能,而并发编程是编写软件方式的重大革命。

那什么是并发呢?并发跟并行有什么区别?

并发与并行

并发(concurrency)和并行(parallelism)有相关性但却是截然不同的概念。Rob PikeConcurrency is not parallelism主题演讲中总结的非常好:

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

—— Concurrency is not parallelism

并发是指同时处理(dealing with)多件事,并行是指同时去做(doing)多件事;并发强调在逻辑上(logically)同时发生;并行强调在物理上(physically)同时发生。

举个例子:单核CPU是可以并发的,但不能并行;多核CPU即可以并发,也可以并行。

但是,编写正确的并发程序是困难的!

Read more »