高并发解决方案利器之分布式缓存和本地缓存
*
一: 什么是缓存?
1 程序经常要调用的对象在内存中,方便其使用时可以快熟调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能。
2: DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存
* 分布式缓存
3:与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用,多个应用克直接的共享缓存
4:常见的分布式缓存 Redis、Memcached等
* 本地缓存
5:和业务程序一起的缓存,例如Mybatis的一级或者二级缓存,本地缓存自然是最快得,但是不能在多个节点共享
6: 常见的本地缓存如: SSM、Mybatis一级缓存、Mybatis二级缓存、框架本事的缓存、Redis本地单机服务、ehchche、guava
cache、Caffeine等
* 选择本地缓存和分布式缓存
7: 和业务数据结合去选择
8:高并发项目里面一般都是有本地缓存和分布式缓存共同存在的
二. 怎么解决缓存出现的一些问题呢? 那么好请看下几点
1: 缓存击穿(某个热点key缓存失效了)
1.1:缓存中没有但数据库中有的数据,假如是热点数据,那么key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大。
1.2:和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。
1.3: 预防: 设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁
2: 缓存穿透 (查询不存在数据)
2.1: 查询一个不存在的数据,由于缓存是不命中的,并且处于容错考虑,如发起id为"-1"不存在的数据
2.2:如果从存款层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB就挂掉了,这也是黑客利用不存在的key频繁攻击应用的一种方式。
2.3: 预防:
接口层增加校验,数据合理性校验,缓存取不到的数据,在数据库中也没有取到这时也可以将key-value对写炜key-null,设置短点的过期时间,防止同一个key被一直攻击。
3: 缓存雪崩 (多个热点key过期)
3.1:大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成瞬时DB请求量大,压力骤增,引起雪崩。
3.2: 预防:存数据库的过期时间设置随机,防止同一时间大量数据过期现象发生,设置热点数据永远不过期,定时任务定时更新
。