1. 零拷贝
磁盘是计算机中最慢的硬件之一,零拷贝、直接I/O、异步I/O等技术的目的都是为了提高系统的吞吐量。此外,操作系统内核中的磁盘高速缓冲区可以有效减少磁盘的访问次数。
磁盘是计算机中最慢的硬件之一,零拷贝、直接I/O、异步I/O等技术的目的都是为了提高系统的吞吐量。此外,操作系统内核中的磁盘高速缓冲区可以有效减少磁盘的访问次数。
哈希算法用来将一系列的值映射到一个区间内,在负载均衡、HashMap、数据库分库分表等场景经常使用。
然而该算法的应用在数据库等系统扩容时,具有严重缺陷:如果节点的数量发生了变化,而节点持久化了响应的数据,则必须对进行数据迁移。如果数据量较大则会带来极高的迁移成本。
使用一致性哈希算法则可以有效的解决上述问题。
一致性哈希算法和哈希算法的不同是:一致性哈希算法对2^32
取模,而非节点的个数。取模的结果即为哈希环。这样节点就是环上的一个点,而数据映射的结果只需要按照顺时针的顺序找到第一个节点进行映射即可。
进程调度算法用来将空闲的CPU时间片分配到进程上执行,常见的进程调度算法有:
先来先服务调度算法:每次从就绪队列选择最先进入队列的进程,直到进程退出或被阻塞再重新选择,适用于CPU繁忙型作业
最短作业优先调度算法:每次从就绪队列选择运行时间最短的进程,直到进程退出或被阻塞再重新选择,有利于提高系统的吞吐量
高响应比优先调度算法:每次从就绪队列选择优先级 = (等待时间 + 要求服务时间)/要求服务时间
最大的进程,权衡了短作业和长作业
时间片轮转调度算法:每个进程被分配时间片一般20ms-50ms
,允许进程在时间片内运行,未运行完则会切换下一进程,时间片太长会导致短作业进程响应时间变长,太短会导致进程上下文切换频繁,降低CPU效率
最高优先级调度算法:每次从就绪队列选择优先级最高的进程,具有抢占式(出现高优先级进程立刻切换)和非抢占式(当前进程必须运行完)两种处理方法
多级反馈队列调度算法:时间片轮转算法和最高优先级算法的结合,兼顾了长短作业,同时有较好的响应时间
单例模式保证每次获取一个类的实例时,都是同一个实例,防止重复性的创建一些资源。单例模式的实现方式有很多,主要的区别体现在是否支持懒加载、是否线程安全等方面。
注意
需要注意反序列化、线程安全、clone、反射可以破坏单例
最近在测试MySQL的性能时,遇到了有趣的问题
docker stats里面明明显示MySQL已经占用了16G的内存,但是top显示仅仅占用了1G的内存
最后找到了问题的原因:Buffer Pool的内存被分配在了Cache/Buff中,top显示的内存并不包括这一区域
使用free -h可以看到Cache/Buff的使用 于是就想着来梳理一下计算机的内存体系
对于单片机这类没有操作系统的硬件来说,运行的程序是直接跑在内存的物理地址上的,也就是说同时运行两个程序是不可能的,因为两个程序的地址很有可能冲突,进而导致相互覆盖
MySQL实现事务的4个特性分别如下:
MySQL中根据加锁的范围,分为:全局锁、表级锁和行锁三类
在加锁后,数据库将变为只读状态,任何增删改或者对表结构进行调整的语句都会阻塞。需要手动释放或者断开会话才会解开锁,MySQL通过以下方式使用全局锁:
-- 加锁
flush tables with read lock
-- 释放锁
unlock tables
项目需要存储对接的第三方接口数据。对应每个用户每天会产生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 '统计值',
-- 其他字段(创建、修改时间等)
)
MySQL的数据库文件存放在/var/lib/mysql
中,每创建一个database
就会在该目录中创建一个目录,并在该目录下保存对应的表结构和表数据。其中:
.opt
:存储当前数据库的默认字符集和字符校验规则.frm
:存储表结构定义信息.ibd
:InnoDB的索引文件,存储表数据,称之为独占表空间文件MySQL的整体分为两部分:
根据上面的架构,MySQL的执行流程如下: