缓存问题和数据一致性问题

缓存穿透

            查询大量缓存中不存在乃至数据库中不存在的数据,导致大量调用数据库操作

            解决方式:

                           缓存空对象:每查询一次不存在的数据,在redis内存中添加对应的键+空对象。

                           坏处:还是查了数据库;浪费redis大量的空间

                           布隆过滤器:程序启动时,把所有业务的需要用到的键缓存到redis中,当查询请求来时过滤请求,没有的话直接返回。当新增键时扩展redis内存中list的值

                           坏处:事先要知道哪些是热点业务的键;每次删除,添加要有额外的操作redis;

                            canal:canal监听数据库操作,把更改写入redis,查询不再查询数据库,若redis里面没有则直接返回没有

缓存击穿

              redis中数据过期此时高并发请求进来,大量去操作数据库查询

              解决方式:redis内存查询不到,然后就加分布式锁,锁住键,让拿到锁的线程去查询数据库并把查询结果缓存到数据库中,并释放锁。其他高并发的请求先等待一会,再去查询缓存就会发现能查到了

缓存雪崩

             大量数据过期,导致数据库压力陡增

             解决方式:过期时间加随机因子,避免大量数据同时过期;定时对缓存数据进行续期;查询续期

数据一致性的问题:

             在对redis内存中内容做更改时,其他线程可能会读到脏数据。比如更新订单id对应的订单内容时,按一般思路是 A线程先操作数据更改数据,然后再更改redis缓存中内容,假如b线程在A线程更改完数据库后去读redis缓存的数据就会读到旧的数据,所以就需要采取一些手段。

            延时双删:更新数据库数据前先删除redis缓存,然后更新数据库,然后发送延时消息到消息队列中,消费消息再删除一次redis缓存(确保这个消息一定要被正确消费,要有重试机制,解决最终一致性问题) 

            串行化:操作缓存的操作写入队列中,不管是更新缓存还是查询缓存,所有redis操作相当于就串行化了                            

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值