redis 缓存并发问题

 

*************************

缓存穿透

 

现象:缓存层与存储层都没有请求查询的数据,造成每次查询都需要访问存储层,在高并发场景下造成后端数据库负载过大

 

解决办法:

网关层(nginx)限制单个ip一段时间内的访问次数

缓存空值,将每次查询返回的空值进行缓存(该方法无法应对恶意攻击)

使用布隆过滤器,将后端需要缓存的数据存储入布隆过滤器,进入缓存层前先用布隆过滤器判断数据是否存在,若不存在则不查询,存在则访问缓存层,缓存层查询的数据不存在则去后端获取数据,然后将查询结果写入缓存存储

 

 

*************************

缓存击穿

 

现象:缓存层中的key过期,致使大量查询key的请求到后端数据库查询数据

 

解决办法:

使用全局性锁,当key过期时,只有一条线程可以去后端获取数据,更新缓存

热点数据永不过期,使用定时线程定时更新缓存、或者修改数据时更新缓存

 

*************************

缓存无底洞

 

现象:缓存层使用大量的缓存存储节点,使同一次缓存查询的数据分布在多个节点上,致使缓存查询效率变慢

解决办法:将同一业务类型的数据尽可能存储在集群的同一个节点上,同时对缓存存储节点进行主从备份,避免单节点数据丢失

 

*************************

缓存雪崩

 

现象:缓存服务器故障或者大量的缓存key过期,致使高并发场景下大量请求访问后端数据库,使后端数据库负载过大

 

解决办法:

对缓存服务器节点做集群主从部署,避免集群单点故障导致缓存丢失

为热点缓存数据设置随机过期时间,避免缓存集中过期造成后端数据访问压力