1.线程A发起了一个写的操作,删除缓存 2.线程B发起了一个读的操作,缓存没有 3.线程B读DB,读出来一个老数据 4.线程B吧老的数据,放入缓存 5.线程A写入数据库新的数据。 这样就导致,缓存数据库和缓存不一致。 因此:cache-aside 先操作数据库,后操作缓存。 怎么做到数据库和缓存强一致? 其实没有办法强一致,...
但是,两个又有很大的不同:读写穿透是同步更新 cache 和 DB,而异步缓存写入则是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。所以如果缓存挂掉而数据没有更新的话,就会造成数据丢失,适用于对数据一致性要求没那么高的场景。 二、先更新缓存,后更新数据库(不推荐) 1.操作失败的情况: ...
1.一致性问题解决方案 缓存和数据库一致性的经典解决方案有以下两个: 使用延迟双删 + MQ保证数据的一致性。 通过Canal 监听MySQL的 Binlog 写入日志,之后将写入操作(增加、删除和修改)的信息发送至Kafka,程序监听到 Kafka 的消息后更新Redis,从而保证数据的最终一致性。需要注意的是,无论使用的是延迟双删还是 Can...
1.1 读写DB和缓存流程 读请求:命中缓存 :直接返回Redis缓存数据,无数据库请求未命中:从数据库查询数据,并将查询结果写入Redis CUD写请求:更新数据库数据删除缓存中的数据,缓存将在下次未命中缓存时更新 1.2 数据一致性问题 缓存删除之前读取数据:假设进程 A 已成功更新 MySQL 中的值,但在删除 Redis 缓存...
双写一致性问题的产生 Redis缓存数据的修改可能会导致与数据库数据不一致的问题。例如,数据库中的某个数据被修改了,但是Redis中的缓存数据并没有被同步更新,这时候系统在获取该数据时会从Redis中获取到旧的数据,导致数据不一致的问题。 为了解决这个问题,需要引入双写一致性机制,即每次修改数据库中的数据时,同时修改...
接下来再看数据一致性问题。 如果想要保证缓存和数据库的一致性,那前面说的定时任务刷新缓存的方法就不能用了。 也就是说,更新数据时,不仅仅要操作数据库,同时也要操作缓存。即修改一条数据,不仅要更新数据库,还要一起更新缓存。 有人可能会注意到,同样是更新数据,我是要先更新缓存,再更新数据库,还是先更新数据...
1.1 读写DB和缓存流程 读请求: 命中缓存 :直接返回Redis缓存数据,无数据库请求 未命中:从数据库查询数据,并将查询结果写入Redis CUD写请求: 更新数据库数据 删除缓存中的数据,缓存将在下次未命中缓存时更新 1.2 数据一致性问题 缓存删除之前读取数据:
写操作:首先更新数据库,然后使缓存失效(删除或更新缓存中的数据)。 Write Through(写穿模式):写操作时,同时更新缓存和数据库,确保两者数据一致。但这种方法可能增加写操作的延迟。 Write Behind Caching(写回缓存模式):写操作时,只更新缓存,然后异步地将数据写回数据库。这种方法可能带来数据一致性问题,特别是在缓存...
redis作为读写缓存的时候 定义:读写缓存,就是先处理缓存,再处理数据库,这里的处理策略有同步和异步两种 同步直写策略:写缓存时,也同步写数据库,缓存和数据库中的数据一致,这个时候要考虑添加事务,保证缓存和数据库的更新具有原子性 异步写回策略:写缓存时不同步写数据库,等到数据从缓存中淘汰时,再写回数据库。使...
但缺点也很明显,有 2 个问题: 缓存利用率低:不经常访问的数据,还一直留在缓存中 数据不一致:因为是「定时」刷新缓存,缓存和数据库存在不一致(取决于定时任务的执行频率) 所以,这种方案一般更适合业务「体量小」,且对数据一致性要求不高的业务场景。