查的数据是缓存和数据库中都不存在的数据。比如通过id查询商品信息,id一般大于0,攻击者会故意传id为-1去查询,由于缓存不命中则从DB中获取数据,这将会导致每次缓存都不命中数据导致每个请求都访问DB,造成缓存穿透。
1.利用互斥锁,缓存失效的时候,先去获得锁,得到了锁,再去请求数据库。没得到锁,则休眠一段时间重试。
2.采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,如果缓存过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
3.提供一个能迅速判断请求是否有效的机制,比如,利用布隆过滤器内部维护一系列合法有效的key。迅速判断出,请求所带的key是否合法有效,如果不合法,则直接返回。
4.如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。