请列出常见的缓存方式,并简要概述其优缺点
客户端缓存,本地缓存(memorycahce),CDN缓存,反向代理缓存(Nginx),分布式缓存(Redis)
ASP.NET缓存有几种实现方式?
1)页面输出缓存:将页面全部进行缓存。
2)页面局部缓存:将页面中的一部分放在用户控件中,对该部分进行缓存。
3)数据缓存:使用Cache类进行数据缓存。
4)客户端缓存:使用HttpCachePolicy类进行客户端(浏览器)缓存。
简单聊聊缓存雪崩及解决方案?
简述:
如果缓存在一段时间内同时失效,例如我们在设置缓存时,采用了相同的过期时间,导致在某一时刻所有缓存同时失效,请求全部到数据库上,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
解决方案:
缓存雪崩对底层系统的冲击非常可怕,造成的损失巨大。遗憾的是目前并没有比较完美的解决方案。
1)“加锁”或者“队列”方式,“加锁”或者“队列”方式保证缓存的单线程(进程)写,从而避免大量并发请求落到底层存储系统上。比如某个Key只允许一个线程查询和写缓存,其他线程等待。
2)设置分散缓存失效时间,这个是个比较简单处理方案,就是将缓存失效时间分散开,比如我们在原有失效时间上增加一个随机值,如1~6分钟随机,尽量让缓存不要同时失效,从而尽量避免缓存雪崩。
3)单独处理热门数据, 对于一些热门数据的持续读取,这种缓存数据也可以采取定时更新的方式来刷新缓存,避免自动失效。
4)从服务器和接口处解决。如果服务和接口都有限流机制,就算缓存全部失效了,但是请求的总量是有限制的,可以在承受范围之内,这样短时间内系统响应慢点,但不至于挂掉,影响整个系统。
5)设置热点数据永远不过期
缺点:会造成写一致问题,当数据库数据发生更新时,缓存中的数据不会及时更新,这样会造成数据库中的数据与缓存中的数据的不一致,应用会从缓存中读取到脏数据。可采用延时双删策略处理。
…
…
…