缓存穿透
查询大量缓存中不存在乃至数据库中不存在的数据,导致大量调用数据库操作
解决方式:
缓存空对象:每查询一次不存在的数据,在redis内存中添加对应的键+空对象。
坏处:还是查了数据库;浪费redis大量的空间
布隆过滤器:程序启动时,把所有业务的需要用到的键缓存到redis中,当查询请求来时过滤请求,没有的话直接返回。当新增键时扩展redis内存中list的值
坏处:事先要知道哪些是热点业务的键;每次删除,添加要有额外的操作redis;
canal:canal监听数据库操作,把更改写入redis,查询不再查询数据库,若redis里面没有则直接返回没有
缓存击穿
redis中数据过期此时高并发请求进来,大量去操作数据库查询
解决方式:redis内存查询不到,然后就加分布式锁,锁住键,让拿到锁的线程去查询数据库并把查询结果缓存到数据库中,并释放锁。其他高并发的请求先等待一会,再去查询缓存就会发现能查到了
缓存雪崩
大量数据过期,导致数据库压力陡增
解决方式:过期时间加随机因子,避免大量数据同时过期;定时对缓存数据进行续期;查询续期
数据一致性的问题:
在对redis内存中内容做更改时,其他线程可能会读到脏数据。比如更新订单id对应的订单内容时,按一般思路是 A线程先操作数据更改数据,然后再更改redis缓存中内容,假如b线程在A线程更改完数据库后去读redis缓存的数据就会读到旧的数据,所以就需要采取一些手段。
延时双删:更新数据库数据前先删除redis缓存,然后更新数据库,然后发送延时消息到消息队列中,消费消息再删除一次redis缓存(确保这个消息一定要被正确消费,要有重试机制,解决最终一致性问题)
串行化:操作缓存的操作写入队列中,不管是更新缓存还是查询缓存,所有redis操作相当于就串行化了
966

被折叠的 条评论
为什么被折叠?



