【源码阅读】常见设计思想记录

1.随机写转为顺序写

这个主要是存储介质本身的特性决定的。比如磁盘而言,顺序写比随机写性能高很多。就机械磁盘,随机读写,需要频繁的寻址。而寻址是一个物理过程,很耗时,基本是在毫秒级别的。而顺序读写,只需要一次或者少量寻址即可。其他耗时主要是数据传输方面的耗时。

对于固态硬盘而言。虽然随机读写的性能有了很大的提升,但是还是比顺序读写差的。

因此,很多基于磁盘的存储系统,比如mysql、hbase、es等等。都可以看到这方面的优化。即把随机读写转为顺序读写,以提高读写性能。

比如mysql 的redo 日志。es 的translog 日志等等。基本思想就是把随机写转为顺序写。更新操作先写日志(顺序),再写缓存。es是先写缓存再写日志(主要是es写日志回退麻烦)。这个操作也叫WAL。

而缓存与磁盘之间的同步,是满足一定条件后。才进行刷盘的。这里要用到了另一个思想。用批量操作代替单次操作。以提高性能(本质是避免多次传输)。

 

2.批量操作代替单次操作

批量操作代替单次操作,本质原因,应该是避免多次传输导致的性能损耗。从而起到提高吞吐量或者性能的目的。除了避免多次传输,在某些场景下,批量操作是可以共享“元数据”的,也可以减少传输的数据量。等等

很多系统中,都利用了该特性。比如mysql而言。缓存刷盘的机制。并不是每一次更新操作都会进行缓存刷盘。而是满足一定条件后。进行批量刷盘。这样在一次io中。可以传输多个页。而不是每次更新都进行一次io操作。因为io操作是很耗时的操作。

还有,我们在插入数据到mysql时,也常常采用批量插入的方式。因为插入操作。会有一个网络传输的过程。多条插入语句。只要一趟网络传输即可。除了这个。mysql通信也有自己的通信协议。批量插入,在一定程度上,应该是可以共享协议头的数据的。这样也可以减少传输的数据量。

3.局部性原理

局部性原理。主要有时间局部性和空间局部性。这是一个相关性原理。也就是基于统计总结出来的规律。就是说,事件的发生是有概率的。

(1)、时间局部性原理

指最近访问到的数据,在接下来的时间。大概率会重新访问到。常见的,比如热点数据。或者语言中的循环操作。对于cpu而言。循环操作的字节码等等。

(2)、空间局部性原理

指访问到的数据。那么与数据相邻或者相近的数据,再接下来大概率会访问到。

很多系统都可以看到局部性原理的应用。比如mysql而言。在加载数据页到缓存的时候,也会同时加载邻近的数据页。cpu高速缓存中,加载数据或者字节码时,也会把与数据或者字节码相近的数据一起加载到高速缓存中。

4.平衡

1、cap

cap是分布式系统中的一个理论。三个字母分别代表如下。 c: 一致性 a: 可用性 p:分区性。cap理论说的是,在分布式系统中。是不能够同时满足这三个特性的。最多只能够满足其中两个。

比如选择了 ap. 那么就要牺牲c 。 即选择了可用性,那么一致性就要做出让步。这里并不是说牺牲了一致性。而是说一致性的强弱而言。

同理。选择cp. 那么a 在一定程度上就要做出让步。

2、rws

rws是读、写、空间的缩写。意思就是说。这三者是很难一起满足的。就是说没有这样的算法,使得读的性能很高,写得性能也很高,同时占用空间很低的算法。我们只能在这三者中进行平衡。要么在一定程度上牺牲读性能,要么牺牲写性能,要么牺牲空间。

rws在很多系统或者算法上都有体现。比如lsm。 lsm选择了ws,因而读性能相对比较弱。比如hbase和es。底层存储就是采用类lsm的思想设计的。

比如hashmap。 就选择了rw。hashmap读写是O(1)级别的。但是空间利用率低。

rws和空间换时间,或者时间换空间的思想是一样的。就是说很难同时满足,需要根据场景做出平衡。

而平衡的思想,在很多系统或者框架中。都是很常见的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值