精华内容
下载资源
问答
  • redis延迟双删的策略

    千次阅读 2021-03-03 14:09:44
    redis延迟双删的策略 1.为什么要进行延迟双删 一般我们在更新数据库数据时,需要同步redis中缓存的数据 所以存在两种方法: (1)第一种方案:先执行update操作,再执行缓存清除。 (2)第二种方案:先执行缓存清除...

    redis延迟双删的策略

    1.为什么要进行延迟双删
    一般我们在更新数据库数据时,需要同步redis中缓存的数据
    所以存在两种方法:
    (1)第一种方案:先执行update操作,再执行缓存清除。
    (2)第二种方案:先执行缓存清除,再执行update操作。

    弊端:当存在并发请求时,很容易出现问题
    (1)第一种方案:当请求1执行update操作后,还未来得及进行缓存清除,此时请求2查询到并使用了redis中的旧数据。
    (2)第二种方案:当请求1执行清除缓存后,还未进行update操作,此时请求2进行查询到了旧数据并写入了redis。

    2.如何实现延迟双删
    所以此时我们需要使用第三种方案:
    先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。

    3.需要注意的点
    上述中(延迟N秒)的时间要大于一次写操作的时间,一般为3-5秒。
    原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。
    ps:一般写入的时间会远小于5秒

    展开全文
  • Mysql与Resi延迟双删策略原理解析

    千次阅读 2020-12-27 21:52:52
    MySQL与Redis延迟双删策略原理解读? 课程内容: 1.MySQL与Redis数据一致性协议方案有那些? 2.到底是先删除缓存?还是先更新数据库? 3.为什么不推荐使用更新数据,在更新缓存? 4.如何利用延迟双删除策略?实现...

     

    1. 概述

    本文是在观看腾讯视频学习总结而来的,这里先大致粗略的记录一下,后面会再重新整理

    MySQL与Redis延迟双删策略原理解读?
    课程内容:
    1.MySQL与Redis数据一致性协议方案有那些?
    2.到底是先删除缓存?还是先更新数据库?
    3.为什么不推荐使用更新数据,在更新缓存?
    4.如何利用延迟双删除策略?实现一致性问题
    5.延迟双删除策略,存在那些优缺点 
    6.总结:MySQL与Redis数据一致性问题
    腾讯课堂直播:https://m.ke.qq.com/m-core/live.html?cid=273548&term_id=100323286

     

     

    线程1写、线程2度

    删除Redis缓存key

    2. gengxin shujuku dbxinxi 

    3. 延迟删除Redis 缓存key

     

    线程1在更新db之前,另外线程在读的时候,将原来db的数据同步到redis中。

    线程1更新db成功后,再把Redis缓存清理一次。

     

     

     

    双写一致性协议(共4种策略)

    根据实际项目要求来选择,例如并发量等等。

    1、小项目、并发量低

    不追求强一致性时

    可以先更新db、再删除redis;;或者先删除Redis再更新db。

    2、项目大时

    建议使用延迟双删策略

     

    可以有4中删除策略

    策略1、先更新db,再删redis

     

    • 策略2、先再删redis,再先更新db,最后延迟删除Redis(延迟双删策略,可取的方法)

    并发量大采用这种延迟双删策略

    如果第三次删除失败,就要不断的去重试,删除Redis(例如使用for循环,或者死循环尝试删除Redis缓存)

     

     

    2. 参考资料

    https://ke.qq.com/course/273548?taid=10520037060521100&tuin=388db9e0

     

     

    展开全文
  • 高并发场景,为了提高性能,解决数据库压力,一般数据会对数据进行缓存,减轻数据压力,但是如果使用缓存,会有一个缓存不一致的情况,一般缓存不一致的一种解决方案是延迟双删。 通用延迟器 public class ...

    高并发场景,为了提高性能,解决数据库压力,一般数据会对数据进行缓存,减轻数据压力,但是如果使用缓存,会有一个缓存不一致的情况,一般缓存不一致的一种解决方案是延迟双删。

    通用延迟器

    public class DelayTrigger<T> {
        private static final int capacity = 10000;
        private static final long DELAY_TIME = 10 * 1000;// 10秒
        private static final AtomicInteger cnt = new AtomicInteger();
        private final DelayQueue<DelayElement<T>> queue = new DelayQueue<DelayElement<T>>();
        private IDelayHandler<T> delayHandler;
        private ExecutorService producer = new ThreadPoolExecutor(1, 2, 1L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(capacity),
                new NamedThreadFactory("DelayTrigger_Producer", false), new ThreadPoolExecutor.DiscardPolicy());
        private ExecutorService consumer = new ThreadPoolExecutor(2, 4, 1L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(capacity),
                new NamedThreadFactory("DelayTrigger_Consumer", false), new ThreadPoolExecutor.DiscardPolicy());
    
        private volatile boolean running = true;
        
        private final Listener listener = new Listener();
    
        
        
        
        private long delayTime = DELAY_TIME;
    
        public DelayTrigger(IDelayHandler<T> delayHandler) {
            this(delayHandler, DELAY_TIME);
        }
    
        public DelayTrigger(IDelayHandler<T> delayHandler, long delayTime) {
            this.delayHandler = delayHandler;
            this.delayTime = delayTime;
            this.listener.setName("DelayTrigger-" + cnt.incrementAndGet());
            this.listener.setDaemon(true);
            this.listener.start();
        }
    
        private class Listener extends Thread {
    
            @Override
            public void run() {
                while (running && !isInterrupted()) {
                    try {
                        final DelayElement<T> t = queue.poll(5, TimeUnit.SECONDS);
                        if (t != null) {
                            consumer.execute(new Runnable() {
    
                                @Override
                                public void run() {
                                    delayHandler.handle(t.getT());
                                }
    
                            });
                        }
                    } catch (InterruptedException e) {
                        // ignore interrupt
                    }
                }
            }
        }
    
        public void put(final T t) {
            producer.execute(new Runnable() {
    
                @Override
                public void run() {
                    queue.add(new DelayElement<T>(t, delayTime));
                }
    
            });
        }
    
        /**
         * 关闭资源
         */
        public void destroy() {
            this.producer.shutdownNow();
            this.running = false;
            this.consumer.shutdownNow();
            this.queue.clear();
        }
    
        /**
         * 最大可能释放资源
         */
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            destroy();
        }
    
    }

    使用

    public abstract class OpCache{
    	private final ICacheClient proxy;
    
        private final DelayTrigger<String> TRIGGER = new DelayTrigger<>(new IDelayHandler<String>() {
    
            @Override
            public void handle(String t) {
                if (proxy.isRunning()) {
                    proxy.delete(t);
                }
            }
    
        });
        
        public OpCache(ICacheClient client) {
            this.proxy = client;
        }
        
        public void close() {
            delayTrigger.destroy();
        }
        /**
         * 删除key value 键值对
         */
        public void deleteObject(String key) {
            proxy.delete(key);
            // 延迟双删除
            TRIGGER.put(key);
        }
    }

    展开全文
  • 文章目录延迟双删总结流程设置缓存过期时间 延迟双删 这个问题是涉及到缓存redis和主从mysql的数据更新,在高并发中,是很容易出现缓存和数据库之间数据不一致问题的。 如果出现不一致的情况是很危险的,比如我们...

    延迟双删

    这个问题是涉及到缓存redis和主从mysql的数据更新,在高并发中,是很容易出现缓存和数据库之间数据不一致问题的。

    如果出现不一致的情况是很危险的,比如我们常见的限量抢购,它既要响应快,又要数据可靠。

    我什么说是双删呢?

    首先我们知道redis中缓存的数据是用来读取的,写数据一般都是要写入mysql中。

    如果先删了缓存,还没有来得及写MySQL,另一个线程就来读,发现缓存空,则去数据库读取数据写入缓存,此时缓存中为脏数据。

    如果先写库,在删除缓存前,写库线程一旦挂掉没有删掉缓存,那缓存将一直存储这脏数据。

    所以删除一次是肯定不行的,所以得双删。

    但是如果没有延迟又会有什么问题?

    比如我先进行了一次缓存删除,由于高并发,刚刚有一个读请求读取了mysql中的脏数据,如果这个数据立即写入到缓存中,那么我进行第二次删除的时候是可以删掉这个脏数据的,但是如果是第二次删除发生在写入缓存之前,那么还会有脏数据问题。

    总结流程

    1. 先删除缓存
    2. 再写数据库
    3. 休眠xx毫秒(根据具体业务时间)
    4. 再次删除缓存

    xx毫秒怎么确定?

    需要评估项目读数据业务逻辑耗时,以确保读请求结束,写请求可删除读请求造成的缓存脏数据。

    该策略还要考虑 redis 和数据库主从同步的耗时。最后的写数据的休眠时间:则在读数据业务逻辑的耗时的基础上,加上几百ms即可。比如:休眠1秒。

    当然还有一些实现思路,但是效果肯定是不如延迟双删好,但是开发代价会比较友好,比如下面实现思路。

    设置缓存过期时间

    理论上,设置缓存过期时间,是保证最终一致性的解决方案。
    所有的写操作以DB为准,只要到达缓存过期时间,则后面的读请求自然会从DB读取新值,然后回填缓存。

    结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加写请求耗时。

    写完数据库后,再次删除缓存成功保证
    上述的方案有一个缺点,那就是操作完数据库后,由于种种原因删除缓存失败,这时,可能就会出现数据不一致的情况。
    需提供保障重试方案。

    • 方案一
      具体流程:
    1. 更新数据库数据
    2. 缓存因为种种问题删除失败
    3. 将需要删除的key发送至消息队列
    4. 自己消费消息,获得需要删除的key
    5. 继续重试删除操作,直到成功

    然而,该方案有一个缺点,对业务线代码造成大量的侵入。于是有了方案二。
    在方案二中,启动一个订阅程序去订阅数据库的binlog,获得需要操作的数据。在应用程序中,另起一段程序,获得这个订阅程序传来的信息,进行删除缓存操作。

    • 方案二
      具体流程:
    1. 更新数据库数据
    2. 数据库会将操作信息写入binlog日志当中
    3. 订阅程序提取出所需要的数据以及key
    4. 另起一段非业务代码,获得该信息
    5. 尝试删除缓存操作,发现删除失败
    6. 将这些信息发送至消息队列
    7. 重新从消息队列中获得该数据,重试操作。
    展开全文
  • redis延迟双删

    2021-08-25 11:09:25
    缓存为啥是删除,而不是更新?...延时双删是什么? 就是在增删改某实体类的时候,要对该实体类的缓存进行清空,清空的位置在数据库操作方法的前后。 采用反证法 只先删 只后删 结论 从而得出 ...
  • redis延时双删第一次删除的作用是什么呀 redis延时双删第一次删除的作用是什么呀 redis延时双删第一次删除的作用是什么呀
  • 浅谈延迟双删策略

    2021-09-09 19:58:28
    在谈延时双删之前我们先来了解一下一般场景下数据库和redis的同步机制 上面这种同步机制会有什么问题? 在我们访问redis时,redis中的数据不是热点数据,即此时
  • 在高并发的场景下,数据库处理数据增改查很是薄弱。有一些数据查询的频率远大于修改频率,就需要使用缓存技术,让先去请求redis,redis存在返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据缓存到...
  • redis数据一致性之延时双删详解

    千次阅读 2021-02-02 12:11:44
    在使用redis时,需要保持redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略,今天我们就来详细刨析一下 注意:要知道经常修改的数据表不适合使用redis,因为双删策略执行的结果是把redis中保存的那...
  • redis缓存为什么要延时双删

    千次阅读 多人点赞 2020-09-11 17:26:45
    redis缓存为什么要延时双删
  • 缓存延时双删 为什么要缓存延时双删 先删缓存,在修改数据库过一段时间在删一次缓存,这个延时十分关键,时间的大小取决于,另一个事物执行完成的时间。如果没有延时,或者延时时间不够,会导致事务读取的是旧的数据...
  • 首先,删除缓存是为了让其他事务读取数据的时候不会读到旧事务,而更新数据库前清除...那为什么要延时双删呢?我们考虑这样一种情况,在我们两次删除缓存之间更新数据库之前,B事务读到了数据库中的脏数据,但是他的时
  • 自动生成数据和增查改串口接口,支持文件上传下载,延迟,自定义接口逻辑... 特性 支持0侵入,无需修改项目中的任何代码即可投入使用 快速生成接口和数据,以及文档 支持Restful API 以最方便的形式支持api拦截,...
  • 加入现在执行redis的改动数据库打的方法,这时会利用Aop机制 执行对Redis的延迟双删策略; 访问:http://localhost:8080/aop/addData  执行第一次删除 之后 redis中的数据就被删除了; 当执行完controller中的...
  • 还是使用双删延时策略。只是,睡眠时间修改为在主从同步的延时时间基础上,加几百ms。 5.3、 采用这种同步淘汰策略,吞吐量降低怎么办? ok,那就将第二次删除作为异步的。自己起一个线程,异步删除。这样,写...
  • 什么是延迟双删: https://blog.csdn.net/huizhi2533/article/details/107021249/ redis和mysql数据一致性的问题 在这里,我们讨论三种更新策略: 先更新缓存,再更新数据库 先更新数据库,再更新缓存 先...
  • 解决方案 在高并发场景下,数据库和缓存双写不一致...对于这种问题,如果业务场景对数据一致性没有那么高,我们可以在更新缓存时设置一个过期时间,过期之后缓存也就不存在了,还有一种我们可以使用延迟双删方案。 间
  • 整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
  • 说到数据库与缓存一致性,目前我所知道的两种比较适合作为面试答案的方法分别是:延迟双删 和 binlog同步,但是!一般的业务场景,真的没必要用这两种方式。 原因是 1、延迟双删策略需要开发人
  • redis 缓存一致性

    2021-03-29 11:45:16
    一:延迟双删 一、只先删缓存 问题:先删缓存,在改库前,其他事务又把旧数据放到缓存里去了 二、只后删缓存 问题:改了库,清理缓存前,有部分事务还是会拿到旧缓存 三、普通双删 问题:第一次清空缓存后、更新...
  • 简单说下redis实现延迟队列的原理:把所有需要延时执行的任务添加到有序集合里面;并将任务的执行时间设置为分值,另外再使用另一个线程来查找有序集合里面是否存在可以被立即执行的任务,如果有的话就从有序集合...
  • input输入字符过快的时候会出现延迟显示,一开始是认为数据绑定的原因的 其实这个问题在2020年的时候不少开发者在微信的小程序社区报过bug,但是这个问题出现的条件如下: 1. 在小程序开发者工具的真机调试 2. 调试...
  • 实现延迟队列的方式有很多种,有本地自己jdk方式实现、Quartz 定时任务实现、RabbitMQ 延时队列实现,还有Redis方式实现。综合自己的生产情况,Redis是符合分布式服务及开发成本较小的一种方式。基本的机制如下图 ...
  • 2021-08-30

    2021-08-30 18:51:38
    缓存延迟双删,删缓存,更新数据库,过一段时间再删缓存。 token java多路复用,bio nio aio,同步需要等结果,异步用回调,多线程下理解。 非阻塞直接返回。多路复用 为什么innodb不像myism存储记录总条数,因为有...
  • 2、采用延迟双删 先删缓存, 后更新数据库, 延时再删一次缓存 但是会存在问题:改库后延时时间内的数据可能是旧数据 如果业务场景要求,改库成功就不能使用旧数据,可以采用如下优化方案: 新增一个缓存类型,记录...
  • Redis知识整理

    2020-01-02 18:10:32
    1、技术选型 (阿里云redis) 2、redis 整合 3、redis 操作封装 4、分布式缓存 (参考 阿里云...延迟双删策略 数据库增、删、改 在数据库执行,异步通知 redis更新数据 redis操作串行化 6、redis和数据库不一致时如...
  • 主从延迟和延迟双删问题可以做到强一致性吗?创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart...
  • 众所周知,视频直播用 CDN + RTMP 就可以满足绝大部分视频直播业务,我们也接触了和测试了几家 CDN 提供的方案,单人直播没有问题,一旦涉及到多人互动延迟非常大,无法进行正常的互动交谈。对于我们做在线教育的...
  • 若该文为原创文章,未经允许不得转载 ...本文章博客地址: 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 ...本文由袁荣喜向「高可用架构」投稿,介绍其将直播延迟控制.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,838
精华内容 5,135
关键字:

延迟双删