MySQL中的悲观锁与常见的死锁场景

在MySQL中, 锁机制是并发条件下保护数据一致性与稳定性的一个非常重要的机制, 并且事务的实现也依赖于于锁机制。 其锁定的数据不单包括数据行记录, 同时也包括缓冲池中的LRU列表数据、日志数据等。 悲观锁(FOR UPDATE)则是日常开发中使用最多的一种锁, 但是, 由于事务隔离级别的多样性导致了悲观锁在使用时常常会有不同的表现, 死锁在程序员稍不注意时就会发生。 »

MySQL中的联合索引与覆盖索引

在上一篇文章中, 通过解析InnoDB存储引擎的.ibd数据存储文件得到了数据与索引的真实组织方式: 数据通过聚集索引在逻辑上连续存放, 二级索引保存数据主键ID(Row ID), 多棵B+Tree组合起来提供高效的索引数据查询。 除辅助索引(二级索引)外, 联合索引与覆盖索引在日常中也会经常用到。 »

MySQL物理存储方式

MySQL是基于磁盘进行数据存储的关系型数据库, 所有的数据、索引等数据均以磁盘文件的方式存储, 在有需要时载入内存读取。 为了加快数据查询的效率, 通常会在一些字段上添加索引, 但是许多文档都会告诉我们, 不要添加太多的索引, 索引不要太长, 使用数字或者空字符串来代替NULL值, 为什么会有这些建议? 这些建议又是否正确? 答案都能够从MySQL数据的物理存储方式中找到。 »

数据变更操作日志设计

当系统的某些行为涉及到资金与资产的数据变更时,常常会为其增加操作日志, 便于后续的问题排查。 例如红包的使用明细, 银行转账的详细记录等等。 操作日志记录这个需求看起来很简单, 但是深挖下去, 依然能找到很有趣的东西。 »

那些有趣的数据结构与算法(04)--B-Tree与B+Tree

树型结构由于其良好的递归特性, 高效的查询效率, 在软件系统设计中有着非常广泛的使用。 IO多路复用的epoll实现采用红黑树组织和管理sockfd, 以支持快速的增删改查; Golang中的Timer采用多叉堆实现; Java中的TreeMap以及TreeSet同样采用红黑树实现…而在MySQL中, 索引的构建同样采用树结构实现。 »

DevOps基础(1)--Shell脚本编程

由于Docker容器以及Kubernetes容器编排服务的蓬勃发展, 服务器以及业务服务的运维不再是运维工程师的专属, 业务的开发工程师也必须加入到运维的领域之中, 与运维工程师合作, 形成一套完整、高效的自动化运维与部署的系统。 而在我看来, 传统的运维工程师将会逐渐被应用开发工程师所取代, 因为Kubernetes赋予了开发人员强大的负载均衡、自动横向拓展以及高效管理的相关功能。 而在这些宏大的系统建设之前, Shell编程是无论如何都离不开的话题。 »

操作系统原理(01)-I/O

在写了许多代码, 搭建了一些分布式服务之后, 越发觉得一个大型的高并发系统就是一个操作系统。 在分布式系统中, 我们会讲数据一致性, 如何做到缓存和DB的一致性, 这也是操作系统需要解决的问题: 内核高速页缓存如何与磁盘文件数据一致。 又比如对于一些耗时且非必需的任务, 在分布式系统中很有可能采用消息队列来进行异步处理, 例如邮件的发送, 而在操作系统中, I/O也是一个非常耗时的任务, 同样采用了异步处理的方式来最大化的利用系统资源, 只不过并不是采用消息队列而已。 »