共计 544 个字符,预计需要花费 2 分钟才能阅读完成。
在分布式场景下,为应答高流量冲击,加重数据库压力,咱们大都会通过缓存来应答流量冲击,常见的缓存中间件如 Redis、Memcache 等,缓存也会带来肯定的问题,如下:
1. 缓存穿透:指缓存中没有数据,数据库中也没有数据。在进行数据的拜访时,通过数据的 key 读取数据,然而该 key 对应数据在数据库中没有,在缓存中也没有,造成每次通过该 key 读取数据都会进行数据库操作,且每次读取都为 null 的状况。在大型项目中,这种有效的数据库操作会减少数据库的读压力。
解决方案:空值缓存、布隆过滤。
2. 缓存击穿:指定 key 的数据在数据库中存在,然而缓存中还没有写入该 key 对应的数据,在高并发场景下,多个线程同时通过该 key 读取数据时,会因为高并发拜访的起因导致同一个 key 对应的数据会从数据库被屡次读取。
解决方案:上锁、singleflight 回源操作。
3. 缓存雪崩:缓存服务不具备高可用性导致大面积缓存生效的状况。
解决方案:集群,服务熔断,降级,预热,距离更新缓存。
4. 数据一致性:数据进行更新时,如何对数据进行操作能力保障数据库中的数据和缓存中的数据统一的问题。
解决方案:先更缓存再更新数据库,先更新数据库再更新缓存,先删除缓存再更新数据库,先更数据库再删缓存,先删缓存再更新数据库再删缓存,串行操作。
正文完