老徐与阿珍的故事:缓存穿透,缓存击穿,缓存雪崩,缓存热点,傻傻分不清徐。据说他之前因为炒某币而输光了所有家产,现在还负债累累。阿珍,女,本名陈家珍,是一名刚进公司的实习生。虽然是职场新人,但她聪明好学。据说她是校内四大美女之一,追求者从旺角排到铜锣湾,但至今仍单身。阿珍:“在高并发下遇到瓶颈的时候,往往会使用缓存来提升整个系统的性能。”老徐:“嗯,不过缓存可以大大提升整个系统的性能,但同时也引入了更多的复杂性。”简点点头,道:“对,缓存穿透,缓存击穿,缓存雪崩,缓存热点等等,我一直分不清这些东西,还经常搞混。”老徐顿时自信起来道:“这个我明白,听我说给你听。”缓存穿透缓存穿透是指在查询缓存数据时,缓存和数据库中都没有对应的数据,在缓存中也找不到对应的数据。对于数据,每次都要去数据库中查询一遍,然后返回数据不存在。在这种场景下,缓存并没有起到分担数据库访问压力的作用。读取不存在数据的请求量一般不会太大,但是如果有一些恶意攻击,故意大量访问一些不存在的数据,会对数据库造成很大的压力。阿震:“太可怕了,遇到这种攻击怎么办?”老徐:“这个好办,一般有两种办法。”如果找到了,直接设置一个具体的值存入缓存。读取缓存后,会得到这个具体值,直接返回空值,不会继续访问数据库。第二种是:将已有数据的key存入Bloomfilter中。当有新的请求时,先去Bloomfilter检查是否存在,如果数据不存在,直接返回;如果数据存在,则查询缓存并查询数据库。缓存击穿缓存击穿是指在查询缓存数据时,数据库原本有数据,而缓存没有。生成缓存数据需要很长时间或大量资源。这个时候,如果有大量的数据请求,就会影响到数据库,甚至系统压力很大。阿震:“哦?怎么解决的?”老徐:“这个好解决,一般有两种办法。”第一种是:对缓存更新操作加锁保护,保证只有一个线程可以执行缓存更新操作,没有获取更新锁的??线程要么等待锁释放,重新读取缓存,或直接返回空值或默认值。二是:后台作业定期更新缓存,而不是在访问页面时生成缓存数据。这样缓存就可以按照一定的策略定时更新,不会对存储系统造成瞬间压力。缓存雪崩缓存雪崩是指当大量缓存同时失效或过期时,大量请求直接访问数据库,甚至耗费很长时间或大量资源来计算缓存的结果,造成系统性能急剧下降。阿珍抢先说道:“我知道怎么解决了!”老徐反问:“怎么解决的?”阿珍回复:“同类型缓存的过期时间可以设置为随机值,比如:原来的过期时间是5分钟,在此基础上增加0到60秒,那么过期时间会在5分钟内波动到6分钟,有效防止大量缓存同时过期。”缓存热点缓存热点指的是大部分甚至所有业务的请求都命中同一个缓存数据。虽然缓存本身的性能比较高,但是对于一些特别热的数据,如果大部分甚至所有的请求都命中同一个缓存数据,那么数据所在的缓存服务器的压力也会很大。例如,某电商闪购活动在短时间内吸引了数千万用户访问。阿珍:“遇到这种情况怎么办?”老徐:“这个很好解决,一般有两种方式:复制多个缓存副本和本地内存缓存。”Copyingmultiplecachecopies是将请求分发到多个缓存服务器,以减轻缓存热点对单个缓存服务器造成的压力。在设计缓存副本时,有一个细节需要注意:不要为不同的缓存副本设置统一的过期时间,否则所有的缓存副本会同时生成和失效,造成雪崩效应缓存。将热点数据缓存在客户端本地内存中,并设置过期时间。对于每一个读请求,它会先检查数据是否存在于本地缓存中,如果存在则直接返回,如果不存在则去分布式缓存服务器。阿震用崇拜的目光看着老徐,说道:“老徐,你真好,什么都懂!”老徐不好意思地挠了挠头,说:“没有了。”最后,谢谢你这么帅,给我点赞和关注。
