缓存穿透、缓存击穿、缓存雪崩
常用的缓存处理流程:
客户端发起请求,服务器端从缓存获取,获取到则返回,如果没有则从数据库获取,然后存放到缓存,最后返回结果,如果依旧没有则返回空。
缓存穿透:
缓存和数据库中均没有数据,但是客户端不断发起请求,会导致这些请求直接打到数据库上,导致数据压力增高。
可以设置空置,如果数据库获取不到的缓存,存储key-null,超期时间设置60s或者根据业务设定其他时间。
如果某些业务场景,有些key是永远不会存在的,是恶意访问。可以使用bitmap记录key是否存在,例如使用布隆过滤器。
缓存击穿:
由于缓存到期被清理,用户并发较多的时候,导致这个时间的请求打到数据库,引起数据库短时间压力增大。
热点数据永不过期。
使用分布式锁,redis使用setIfAbsent,如果获取到锁,从数据库获取,然后刷新缓存,返回值,没有获取到锁,等待100ms,重新从redis获取值,没有值就获取锁,最多重试3次,依旧没有获取成功则返回空。
缓存雪崩:
缓存中大批量数据到期,由于查询量巨大,导致这些查询短时间打到了数据库上,使得数据库压力过大。
缓存数据的过期时间随机分布,尽量避免同时大量数据失效。
热点数据设置永久有效。