1:穿透,访问缓存中没有,数据库中也没有的数据,直接忽略缓存层,直达数据库
解决方案:方案一,查一个不存在的数据时,给一个设置一定过期间的key的数据,存入缓存,方案二:布隆过滤器,在将数据存入Redis时,会同时存储一个Redis的键到布隆过滤器中,通过布隆过滤器提供的多个Hash函数对Key进行Hash运算,再对位数组长度进行取余,得到一个下标,将该下标值设置为1,访问同样的数据时如果通过布隆过滤器计算后的值相等,则认为缓存中可能存在这个数据(hash运算后得到的结果可能相同,哈希冲突)在缓存中查找数据,如果出现一个0,则认为这个数据不在缓存中,就去数据库中查找数据。
2:缓存一致性问题:缓存一致性是指缓存和数据库两者的数据保持一致(造成缓存不一致的原因可能是在写数据库和写缓存两步存在异常,也可能是并发所导致。写数据库和写缓存导致不一致称为双写不一致,比如:先更新数据库成功了,更新缓存时失败了,最终导致不一致)
解决方案:分布式锁,延迟双删(当一个线程删除缓存中的数据,并修改数据库中的主数据时从数据库会同步主数据库中的数据,当同步完成后再次删除缓存中的数据,这个时候即使在数据库是数据同步过程中有新的线程会去访问缓存由于缓存的数据被删除了,新的线程会访问数据库中的数据,再将数据保存到缓存,但是我们最后都会将缓存中的数据删除,等待新的线程访问数据据,将新数据写入缓存,保证最终数据的一致性),方案三:MQ异步同步,写数据库时canal读取binlog日志,将数据变化日志写入mq同步程序监听mq接收到数据变化的消息,同步程序解析消息内容写入redis,写入redis成功正常消费完成,消息从mq删除完成数据的同步。方案四:采用定时任务方式,根据程序业务,合理设置定时任务。更新数据库以及缓存数据。
3:缓存雪崩,请求大量访问相同的数据,数据没有保存在缓存中,而直接访问数据库时,数据库由于负载过大直接宕机
解决方案:分布式锁,访问的数据在缓存中设置一个拥有有效过期时间的空数据(让请求通过缓存获取数据,减少数据库压力防止数据库宕机),热点数据用不过期。