缓存-详谈


如今缓存的概念已经扩充,不仅是CPU和主内存之间有Cache,而且在内存和磁盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache–称为Internet临时文件夹或网络内容缓存等。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称为Cache。

CPU缓存

由于CPU的读取速度比内存的读取速度快,如果持续在CPU和内存之间一直来回不停的交换的话,那么CPU的运转周期就会出现了很大的浪费,所以出现了高速缓存,提供缓存的目的一般是为了让数据访问的速度适应CPU的处理速度,一般是使用硬件实现的指令预测与数据预取技术----尽可能的将要使用的数据预先从内存中取到缓存中。
在这里插入图片描述

地址镜像与变换
主条目:CPU缓存#组相联
由于主存容量远大于CPU缓存的容量,因此两者之间就必须按一定的规则对应起来。地址镜像就是指按某种规则把主存块装入缓存中。地址变换是指当按某种镜像方式把主存块装入缓存后,每次访问CPU缓存时,如何把主存的物理地址(Physical address)或虚拟地址(Virtual address)变换成CPU缓存的地址,从而访问其中的数据。

磁盘缓存

16MB缓冲区的硬盘
磁盘缓存(Disk Buffer)或磁盘快取(Disk Cache)实际上是将下载到的数据先保存于系统为软件分配的内存空间中(这个内存空间被称之为“内存池”),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏。

磁盘缓存是为了减少CPU透过I/O读取磁盘机的次数,提升磁盘I/O的效率,用一块内存来储存存取较频繁的磁盘内容;因为内存的存取是电子动作,而磁盘的存取是I/O动作,感觉上磁盘I/O变得较为快速。

相同的技巧可用在写入动作,我们先将欲写入的内容放入内存中,等到系统有其它空闲的时间,再将这块内存的资料写入磁盘中。

现在的磁盘通常有32MB或64MB缓存。旧的硬盘则有8MB或16MB。

缓存置换策略

主条目:CPU缓存#置换策略、分页和缓存文件置换机制

主存容量远大于CPU缓存,磁盘容量远大于主存,因此无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容。解决这个问题的算法有几种,如最久未使用算法(LRU)、先进先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)等,这些算法在不同层次的缓存上执行时拥有不同的效率和代价,需根据具体场合选择最合适的一种。

分布式缓存

哈希分为多种,不同的方式计算性能和碰撞率不同。最常规的方式,就是hash取模,最低级装备,满足不了分布式缓存的需要。随着系统访问量增加,缓存系统不得不通过增加机器节点的方式提高集群的相应速度和数据承载量,一旦增加机器节点,缓存数据需要重新建立,甚至是进行整体的缓存数据迁移,工作量和风险都会增加。分布式缓存,主要面临下面两个问题:

  1. n个节点中有一个宕掉了,或者需要新增机器,怎样做到cache的迁移做到最少,降低cache无法命中的概率。
  2. 集群中节点的硬件处理性能有高有低,想让性能高的节点多被分配一些Job,保证集群负载均衡。

那怎样的分布式缓存系统能够最大限度的解决上面的问题呢?

随之而来的一致性哈希算法就是专门来解决这个问题的。我们直接来看一下Consistent Hashing(1997年Consistenthashing and random trees)这种改良型的一致性哈希装备是怎么产生的。

一致性哈希算法其实也是采用取模的方法,只不过不是对机器取模,而是对2^32取模。那为什么要讲Consistent Hashing呢,因为这套装备最大限度地降低cache无法命中的概率,并在服务器数量比较少的时候通过增加虚拟节点取得比较好的负载均衡的效果。

首先讲为什么对2的32次方 取模,因为机器IP为32位,这样使用IP哈希计算后的结果肯定处于0~ 2的32-1之间。将这个区间比作一个圆环,圆环上有2的32次方个点,则集群上的机器一定散落在这些点上。同样我们也将我们要缓存的数据取md5值后同样对2的32次方取模,将其映射到这个圆环上,放心2^32有43亿大小,对于一般的缓存系统来说这个量级也是足够的。从缓存数据的位置逆时针找到第一个机器就是该数据的缓存物理机器,以后直接取这台机器查找数据即可。先在这阐明一点,一致性哈希采用TreeMap作为数据结构。

这里引用一篇文章能更好的解释Consistent Hashing算法。

假设你已经通过上面这篇文章理解了Consistent Hashing这种利器,同时附一篇该利器的代码实现

另外延伸另外一种hash算法-MurmurHash。该算法已经应用到Redis,Memcached,Cassandra,HBase,Lucene等开源项目中,速度快,而且碰撞率低。以后可以尽量应用该算法来解决哈希问题。

———————————————
版权声明:本文为CSDN博主「lsm18829224913」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lsm18829224913/article/details/80376021

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值