(网站性能优化第一定律:优先考虑使用缓存优化性能)
缓存的基本原理:缓存是指将数据存储在相对较高访问速度的存储介质中,以供系统处理。
缓存的本质:缓存是一个内存Hash表。网站应用中,数据缓存以一对键值对(Key、Value)的形式存储在内存Hash表中。
计算KV对中key的HashCode对应的Hash表索引,可以快速访问Hash表中的数据。(许多语言支持获取任意对象的HashCode,可以把HashCode理解为对象的唯一标识符)
Java中HashCode方法包含在根对象Object中,其返回值是一个Int。然后通过Hashcode 计算Hash表的索引下标,最简单的是余数法,使用Hash表数组长度对Hashcode求余,余数即Hash表索引,
使用该索引可以直接访问得到Hash表中存储的KV对,如下图(数值仅供参考)。
缓存的基本概念:缓存是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存的作用:用于存放读写比很高、很少变化的数据。 如商品的类目信息,热门词的搜索列表,热门商品等。应用程序读取数据时,先读取缓存,如果读取不到或数据已失效,再访问数据库,并将数据写入缓存
网站数据访问通常遵循二八定律,80%的访问落在20%的数据上,因此利用Hash表和内存的高速访问特性,将这20%的数据缓存起来,可很好的改善系统的性能,提高数据的读取速度,降低存储访问压力。
使用缓存应注意的问题:
1. 频繁修改的数据不应存入缓存,一般来说读写比在2:1以上才有使用缓存的意义,因为频繁修改的数据如果存入缓存,会出现应用还来不及读取,数据就已经失效的情况,这样会增加系统负担。
2. 没有热点的访问。内存资源宝贵而有限,不可能把所有数据都缓存起来,只能将最新访问的数据及热门的数据缓存起来,把历史数据清理出缓存。
3. 数据不一致与脏读。一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数据库重新加载,因此要容忍一定时间的数据不一致
缓存可用性:
缓存是为了提高数据访问性能的,缓存数据丢失或缓存不可用不会影响到程序的处理--它可以直接从数据库中获取。但随着业务的发展,缓存会承担大部分的数据访问压力,数据库已经习惯了有缓存的日子,一旦缓存不可用(缓存服务奔溃),数据库会因为不能承担如此大的压力而宕机,进而导致整个网站不可用,这种情况被称为缓存雪崩。 实践中可以通过缓存热备等手段提高缓存的可用性,当某台缓存服务器宕机时,将缓存访问切换到热备服务器上,但这样有违缓存的初衷。更多的是通过分布式缓存服务器集群,将缓存数据分布到集群多台服务器上可一定程度上改善缓存的可用性
缓存预热(Warm Up):
缓存存放的是热点数据,热点数据又是缓存系统通过LRU(最近最久未用)算法对不断访问的数据筛选淘汰出来的,这个过程需花费较长的时间。新启动的缓存系统,如果没有任何数据,在重建缓存数据的过程中,系统的性能及数据库的负载都不太好,
那么最好在缓存系统启动时就把热点数据加载好,这个缓存预加载手段叫作缓存预热。对于一些元数据如城市列表、类目信息,可以在启动时加载数据库中全部数据到缓存进行预热。
缓存穿透:
如果因为不恰当的业务、或者恶意***持续高并发地请求某个不存在的数据,由于缓存没有存储该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其value值为null)。
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.
分布式缓存架构:
分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务。
其架构方式有两种:
一、以JBoss Cache为代表的需要更新同步的分布式缓存
二、以Memcached为代表的不互相通信的分布式缓存。
JBoss Cache的分布式缓存在集群中所有服务器中保存相同的缓存数据,当某台服务器由缓存数据更新的时候,会通知集群中其他机器更新缓存数据或清除缓存数据。JBoss Cache通常将应用程序和缓存部署在同一台服务器上,应用程序可以从本地快速获取缓存数据,但是这种方式带来的问题是缓存数据的数量受限于单一服务器的内存空间,而且当集群规模较大的时候,缓存更新信息需要同步到集群所有机器上,其代价惊人,因而这种方式更多见于企业应用系统中,而很少在大型网站中使用。
大型网站需要缓存的数据量一般都很庞大,可能会需要数TB的内存做缓存,这时候就需要另一种分布式缓存---Memcached,
它采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构方式。缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据,缓存服务器之间不通信,缓存集群的规模可以很容易的实现扩容,具有良好的可伸缩性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。