缓存穿透、缓存击穿、缓存雪崩

常用的缓存处理流程:

客户端发起请求,服务器端从缓存获取,获取到则返回,如果没有则从数据库获取,然后存放到缓存,最后返回结果,如果依旧没有则返回空。

缓存穿透:

缓存和数据库中均没有数据,但是客户端不断发起请求,会导致这些请求直接打到数据库上,导致数据压力增高。

可以设置空置,如果数据库获取不到的缓存,存储key-null,超期时间设置60s或者根据业务设定其他时间。

如果某些业务场景,有些key是永远不会存在的,是恶意访问。可以使用bitmap记录key是否存在,例如使用布隆过滤器。

缓存击穿:

由于缓存到期被清理,用户并发较多的时候,导致这个时间的请求打到数据库,引起数据库短时间压力增大。

热点数据永不过期。

使用分布式锁,redis使用setIfAbsent,如果获取到锁,从数据库获取,然后刷新缓存,返回值,没有获取到锁,等待100ms,重新从redis获取值,没有值就获取锁,最多重试3次,依旧没有获取成功则返回空。

缓存雪崩:

缓存中大批量数据到期,由于查询量巨大,导致这些查询短时间打到了数据库上,使得数据库压力过大。

缓存数据的过期时间随机分布,尽量避免同时大量数据失效。

热点数据设置永久有效。

原文地址:https://www.cnblogs.com/avalon-merlin/p/9268072.html