跳至主要內容
网络系统

1. 零拷贝

磁盘是计算机中最慢的硬件之一,零拷贝、直接I/O、异步I/O等技术的目的都是为了提高系统的吞吐量。此外,操作系统内核中的磁盘高速缓冲区可以有效减少磁盘的访问次数。

1.1 DMA


pptg小于 1 分钟
一致性哈希算法

1. 哈希算法

哈希算法用来将一系列的值映射到一个区间内,在负载均衡、HashMap、数据库分库分表等场景经常使用。

然而该算法的应用在数据库等系统扩容时,具有严重缺陷:如果节点的数量发生了变化,而节点持久化了响应的数据,则必须对进行数据迁移。如果数据量较大则会带来极高的迁移成本。

使用一致性哈希算法则可以有效的解决上述问题。

2. 一致性哈希算法

2.1 介绍

一致性哈希算法和哈希算法的不同是:一致性哈希算法对2^32取模,而非节点的个数。取模的结果即为哈希环。这样节点就是环上的一个点,而数据映射的结果只需要按照顺时针的顺序找到第一个节点进行映射即可。


pptg大约 2 分钟
调度算法

1. 进程调度算法

进程调度算法用来将空闲的CPU时间片分配到进程上执行,常见的进程调度算法有:

  1. 先来先服务调度算法:每次从就绪队列选择最先进入队列的进程,直到进程退出或被阻塞再重新选择,适用于CPU繁忙型作业

  2. 最短作业优先调度算法:每次从就绪队列选择运行时间最短的进程,直到进程退出或被阻塞再重新选择,有利于提高系统的吞吐量

  3. 高响应比优先调度算法:每次从就绪队列选择优先级 = (等待时间 + 要求服务时间)/要求服务时间最大的进程,权衡了短作业和长作业

  4. 时间片轮转调度算法:每个进程被分配时间片一般20ms-50ms,允许进程在时间片内运行,未运行完则会切换下一进程,时间片太长会导致短作业进程响应时间变长,太短会导致进程上下文切换频繁,降低CPU效率

  5. 最高优先级调度算法:每次从就绪队列选择优先级最高的进程,具有抢占式(出现高优先级进程立刻切换)和非抢占式(当前进程必须运行完)两种处理方法

    • 静态优先级:优先级分配后不会改变
    • 动态优先级:随着等待时间增加进程优先级
  6. 多级反馈队列调度算法时间片轮转算法最高优先级算法的结合,兼顾了长短作业,同时有较好的响应时间


pptg大约 5 分钟
Java设计模式

六大原则

  1. 单一职责原则
  2. 开闭原则: 开放扩展, 关闭修改(相同功能的if-else, 封装成接口)
  3. 里氏替换原则
  4. 依赖倒置: 抽象/接口不依赖实现类
  5. 接口隔离: 最小化接口
  6. 迪米特原则: 只和最直接的类通信

1. 创建型

1.1 单例模式

单例模式保证每次获取一个类的实例时,都是同一个实例,防止重复性的创建一些资源。单例模式的实现方式有很多,主要的区别体现在是否支持懒加载、是否线程安全等方面。

注意

需要注意反序列化、线程安全、clone、反射可以破坏单例


pptg大约 8 分钟
内存管理

最近在测试MySQL的性能时,遇到了有趣的问题

docker stats里面明明显示MySQL已经占用了16G的内存,但是top显示仅仅占用了1G的内存

最后找到了问题的原因:Buffer Pool的内存被分配在了Cache/Buff中,top显示的内存并不包括这一区域

使用free -h可以看到Cache/Buff的使用 于是就想着来梳理一下计算机的内存体系

1. 虚拟内存

1.1 介绍

对于单片机这类没有操作系统的硬件来说,运行的程序是直接跑在内存的物理地址上的,也就是说同时运行两个程序是不可能的,因为两个程序的地址很有可能冲突,进而导致相互覆盖


pptg大约 5 分钟
MySQL 事务

1. 事务的特性

MySQL实现事务的4个特性分别如下:

  • 原子性(Atomicity):一个事务的操作要么都成功要么都失败并回滚,通过 undo log(回滚日志) 保证
  • 隔离性(Isolation):允许多个并发事务同时对数据进行修改,通过 MVCC(多版本并发控制) 保证
  • 持久性(Durability):事务的修改是永久性的,通过 redo log(重做日志) 保证
  • 一致性(Consistency):事务操作前和操作后,满足完整性约束,数据库保持一致性状态(比如转账,要增加和减少同样的金额)。通过原子+持久+隔离保证

pptg大约 2 分钟
MySQL 锁

1. 锁的种类

MySQL中根据加锁的范围,分为:全局锁表级锁行锁三类

1.1 全局锁

在加锁后,数据库将变为只读状态,任何增删改或者对表结构进行调整的语句都会阻塞。需要手动释放或者断开会话才会解开锁,MySQL通过以下方式使用全局锁:

-- 加锁
flush tables with read lock
-- 释放锁
unlock tables

pptg大约 4 分钟
表设计及测试

1. 需求

项目需要存储对接的第三方接口数据。对应每个用户每天会产生50个分类的日、周、月、年三种统计,也就是每个用户每天会产生200条记录。如果是1w用户的话,那么每天就是150w条

项目原表如下,已经过脱敏处理:

create table record
(
    id                  bigint auto_increment primary key,
    user_id             varchar(100)     not null comment '用户id',
    type                varchar(30)      not null comment '分类的标签',
    cycle               int(8)           not null comment '统计周期日、周、月',
    value               int(8)           not null comment '统计值',
    -- 其他字段(创建、修改时间等)
)

pptg大约 5 分钟
MySQL 存储结构

1. MySQL数据的文件结构

MySQL的数据库文件存放在/var/lib/mysql中,每创建一个database就会在该目录中创建一个目录,并在该目录下保存对应的表结构和表数据。其中:

  • .opt:存储当前数据库的默认字符集和字符校验规则
  • .frm:存储表结构定义信息
  • .ibd:InnoDB的索引文件,存储表数据,称之为独占表空间文件

pptg大约 5 分钟
MySQL 执行流程

1. MySQL整体架构

MySQL整体架构

MySQL的整体分为两部分:

  • Server层:负责与客户端建立连接分析SQL语句,并执行SQL
  • 存储引擎:负责数据的存储和提取

2. 执行流程

根据上面的架构,MySQL的执行流程如下:


pptg大约 2 分钟