分布式缓存问题解决方案

缓存击穿

Redis中的热点数据失效,在数据从MySQL写到Redis的过程有大量请求访问这个数据,导致大量请求直接到达数据库,导致数据库奔溃,服务不可用。

解决方案

​ 当发现缓存失效的时候,不是立即从数据库加载数据。

​ 而是先获取分布式锁,获取锁成功才执行数据库查询和写数据到缓存的操作,获取锁失败,则说 明当前有线程在执行数据库查询操作,当前线程睡眠一段时间在重试。

​ 这样只让一个请求去数据库读取数据。

缓存穿透

大量请求查询一个不存在的数据,即数据不存在 Redis 也不存在于数据库。导致每次请求都会穿透到数据库,缓存成了摆设,对数据库产生很大压力从而影响正常服务。

解决方案

​ 在数据写入数据库的同时将这个 ID 同步到到布隆过滤器中,当请求的 id 不存在布隆过滤器中则说明该请求查询的数据一定没有在数据库中保存,就不要去数据库查询了。

在高并发用户注册场景下如何防止缓存穿透:

布隆过滤器 + 缓存:当用户名“lihua”成功注册后,同步到布隆过滤器中。当用户注销后,系统将用户名放入缓存结构中。当其他用户查询”lihua”是否被使用时,首先检查布隆过滤器是否包含该用户名。如果布隆过滤器中不存在该用户名,证明该用户名可用,直接返回。如果布隆过滤器中存在该用户名,进一步检查缓存结构中是否包含该用户名,如果存在,表示该用户名已被注销,可以被再次使用;如果缓存中不存在,表示该用户名已被使用且尚未被注销,不可用。

缓存雪崩

Redis中大量的key失效,导致请求直接到达数据库,直接宕机。出现该原因主要有两种:

解决方案

大量数据同时过期

Redis宕机

last update time 2023-08-24