如何产生高斯带限白噪声数据_Redis缓存与数据库产生不一致的问题该如何解决?...

8ae7c43c4987d11b89c617d73f0d40e8.png

不一致产生的原因

  我们在使用redis过程中,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库。伪代码如下:

Object stuObj = new Object();
public Stu getStuFromCache(String key){
    Stu stu = (Stu) redis.get(key);
    if(stu == null){
        //加锁的目的是防止过多的查询走到数据库层
            synchronized (stuObj) {
            stu = (Stu) redis.get(key);
            if(stu == null){
                    Stu stuDb = db.query();
                    redis.set(key, stuDb);
            }
            }
    }
    return stu;
}

  写数据库的伪代码如下:

public void setStu(){
    redis.del(key);
    db.write(obj);
}

不管是先写库,再删除缓存;还是先删缓存,再写库,都有可能出现数据不一致的情况

  因为写和读是并发的,没法保证顺序,如果删了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,再删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。 如果是redis集群,或者主从模式,写主读从,由于redis复制存在一定的时间延迟,也有可能导致数据不一致。

优化思路

双删加超时

   在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。这样最差的情况是在超时时间内存在不一致,当然这种情况极其少见,可能的原因就是服务宕机。此种情况可以满足绝大多数需求。 当然这种策略要考虑redis和数据库主从同步的耗时,所以在第二次删除前最好休眠一定时间,比如500毫秒,这样毫无疑问又增加了写请求的耗时

异步淘汰缓存

  通过读取binlog的方式,异步淘汰缓存。

4d4cb3c136427d403de320d810ba1a48.png

好处:业务代码侵入性低,将缓存与数据库不一致的时间尽可能缩小。

9a0894fa68bf2becf6925768f87e267c.png

以上有不足的地方欢迎指出讨论,觉得不错的朋友希望能得到您的转发支持,同时可以持续关注我,每天分享Linux C/C++后台开发干货内容!

(关注+私信:Linux,获取学习资料和视频干货)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值