缓存技术
缓存概念的内涵:原意是指高速缓冲存储器,一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问
缓存概念的外延:凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存
不能把缓存理解成一样具体的东西,它只是一种处理方式的统称!
缓存技术分类:
Ÿ 操作系统磁盘缓存 à 减少磁盘机械操作
Ÿ 数据库缓存 à 减少文件系统I/O
Ÿ 应用程序缓存 à 减少对数据库的查询
Ÿ Web服务器缓存 à 减少应用服务器请求
Ÿ 客户端浏览器缓存 à 减少对网站的访问
buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。
Linux free命令:
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
系统的总物理内存:133GB,但系统当前真正可用的内存并不是第一行free 标记的 0GB,它仅代表未被分配的内存。
行1:total:物理内存总量;used:总计分配给缓存(包含buffers 与cache)使用的数量,但其中可能部分缓存并未实际使用;free:未被分配的内存;shared:共享内存,一般系统不会用到,这里也不讨论;buffers:系统分配但未被使用的buffers 数量;cached:系统分配但未被使用的cache 数量
行2:used:实际使用的buffers 与cache 总量,也是实际使用的内存总量;free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
现代CPU架构引入了TLB,用来缓存一部分经常访问的页表内容。TLB是有限的,这点毫无疑问。当超出TLB的存储极限时,就会发生 TLB miss,于是OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss,程序的性能会下降地很快。
为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。
Linux大内存页:
Hugepages是从Linux kernal 2.6后被引入的,其目的是使用更大的memory page size以适应越来越大的系统内存。
加载类型1-增量加载的缓存:此类缓存的更新机制为“懒加载”机制,当用户请求数据的时候,首先判断该数据是否已被存储,如果没有,则从数据库获取数据,返回给用户,同时将数据缓存起来;当用户第二次请求相同的数据,则直接从缓存里获取并返回给用户。
同时, 每一个缓存的单元(数据)都有自己的有效时间,当用户请求缓存数据的时候,系统也会通过判断该数据是否过期,如过期则丢弃,重新从数据库获取一份返回给用户,并缓存起来以备下次调用。使用EHCACHE组件作为底层实现。
加载类型2-一次性完全加载的缓存:此类型机制与类型(1)类似, 不同点在于其的加载和更新的方式。 此类型缓存将被一次性完全加载并缓存起来, 所有数据同时过期, 同时刷新。
加载类型3- LRU机制缓存:懒加载机制有一个缺点,就是当缓存数据的有效时间耗完后, 无论该数据在数据库有还是没有被修改,都会被作为过期处理而废弃。
LRU机制缓存弥补了这一缺点, 仍然是“懒加载”机制,每一个单元(数据)也有自己的有效时间, 不同之处在于,每一个数据单元被调用的时候,都会更改其的创建时间,从而使其的生命周期得以延长, 当缓存池自动刷新的时候,优先淘汰最近最少使用的数据。
集群内同步:
Ÿ 每一个应用在每一个server里,都将会保存一份相同的cache, 当数据库发生改变的时候,在某一个时间段内有可能会出现缓存不一致的现象。目前采取两种策略来处理:
Ÿ 规避
– 对于类型(1)和类型(2),由于缓存的有效时间是一定的,当数据库数据发生改变的时候,能保证在缓存有效时间耗完后,缓存能够同步。
– 所以当此类数据缓存设计的时期,要跟用户约定,此类数据一旦修改,最长生效时间为此类数据缓存的更新周期。
Ÿ 时间调度
– 对于LRU类型缓存,由于其的生命周期会随着数据被调用而改变,如果该数据一直被使用,则该数据在很长一段时间内不会由于有效时间耗尽而更新。
– 目前采用的是在服务端创建时间调度程序,定期去检查数据库发生变化的数据,并将该数据从缓存中销毁,强制更新。 所以,如果使用时间调度同步缓存,则生效时间为时间调度程序运行的周期。
memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为 mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。