首页 > 数据库 >Redis缓存同步1-策略介绍

Redis缓存同步1-策略介绍

时间:2023-07-09 09:25:55浏览次数:35  
标签:Canal 异步 同步 通知 Redis 更新 缓存 MQ

他.png

缓存数据同步策略示意图

在大多数情况下,我们通过浏览器查询到的数据都是缓存数据,如果缓存数据与数据库的数据存在较大差异的话,可能会产生比较严重的后果的。所以,我们应该也必须保证数据库数据、缓存数据的一致性,这就是缓存与数据库的同步。

缓存数据同步策略

缓存数据同步,常见的有三种方式:

1:设置有效期 

给缓存设置有效期,到期后自动删除。再次查询的时候,更新数据。

这种方式的优缺点及使用场景如下:

优点:简单、方便、好理解;

缺点:时效性差,缓存过期之前可能数据库中的数据和缓存中的数据就不一致了了。

使用场景:更新频率低,时效性要求低的业务。

 2:同步双

 

同步双写策略就是在修改数据库的同时,也修改缓存。

同步双写的优缺点:

优点:时效性强,缓存与数据库强一致;

缺点:有代码侵入,耦合度高;只要操作数据库的插入、更新及删除相关业务操作,就要去同步更新缓存,这种耦合度太高了;

使用场景:对一致性、时效性要求较高的缓存数据。

 3:异步通知

 

异步通知其实就是在修改了数据库的时候,发送时间通知,相关服务监听到通知之后异步的修改缓存数据。

这种方式的优缺点:

优点:低耦合,可以同时通知多个缓存服务。可以使用MQ,异步特性来更新缓存,这样更新数据库和更新缓存就解耦了,而且一次可以更新多个服务,同时,代码入侵也是很少的(只有发送MQ少量代码)甚至是零入侵就可以实现;

缺点:时效性一般,可能存在中间不一致的状态。因为是异步的,可能会存在时间差,导致数据在某一时刻,是不一致的。但是可以保证最终一致性

使用场景:时效性要求一般的,有多个服务需要同步更新缓存的。

事实上,大多数场景下,我们都可以通过异步通知这种策略来更新缓存。所以,我们就来深入的讲讲异步通知。

通常情况下,异步通知实现方案,可以基于MQ或者是基于Canal来实现。

异步通知的两种方案

我们先来看看基于MQ异步通知的流程

 

MQ异步通知更新缓存

 

我们以修改了商品后,更新对应的缓存为例来讲讲。业务流程大致如下描述:

1:在页面修改了商品信息后,商品信息入库,保存到MySQL数据库中;

2:入库成功后,发布一个MQ消息;

3:有个服务监听对应MQ消息,如果接收到消息后,就更新对应商品的缓存信息

流程图如下:

image.png

MQ异步通知更新缓存流程图

这种方案,依然有少量的代码入侵:在写完数据库后,发送MQ消息,这点代码入侵是没办法省略的。

第二种方案,就是Canal通知

基于Canal的通知

基于Canal通知的业务流程如下图:

image.png

基于Canal通知的业务流程图

流程解读:

1:商品服务完成商品修改后,商品信息入库后,相关业务直接结束。这里没有任何的代码入侵;

2:Canal监听MySQL变化,当发现变化后,立即通知缓存服务;

3:缓存服务接收到canal通知后,更新缓存

使用Canal的异步通知是代码零侵入的。所以,这里,咱们就选择基于Canal的通知。接下来,我们就来讲讲Canal

 

标签:Canal,异步,同步,通知,Redis,更新,缓存,MQ
From: https://www.cnblogs.com/kaigejava/p/17538300.html

相关文章

  • 数据查询慢问题以及实现缓存预热
    数据查询慢问题解决办法:使用缓存技术,提前把数据从数据库中取出来,就可以更快的进行读写。1.缓存的实现Redis(分布式缓存)memcached(分布式)Etcd(云原生架构的一个分布式存储,存储配置,扩容能力)ehcache(单机)本地缓存(Java内存Map)Caffeine(Java内存缓存,高性能)GoogleGuavaR......
  • redis
    Redis一、redis介绍Redis是一个缓存数据库,主要是做缓存。用户请求数据时,第一次先请求redis中的数据,redis中没有,再去请求后台数据库Redis是一种内存型的nosql数据库,一般是用来缓存加速的,并且能够支持数据持久化存储,可以将数据持久化到硬盘中Redis存储数据的方法是以key-value的......
  • Redis进阶
    Redis1Redis中的数据结构![image-20201204114339215](Redisday02.assets/image-20201204114339215.png)传统键值存储是关联字符串值到字符串键,但是Redis的值不仅仅局限于简单字符串,还可以持有更复杂的数据结构。下面列的是Redis支持的所有数据结构,后面将逐一介绍:String(......
  • 关于Azure-平台-Redhat-Linux-服务器时间同步的问题解决
    首先说明一下,关于Azure平台中国区,是没有RedhatLinux系统镜像的于是笔者这边是通过在Windows系统 Hyper-V管理器中安装完Redhat8.x操作系统后,最后将系统磁盘转换成转换为VHD格式然后经过一系列操作、最终在Azure平台上形成了自己的并且加固过的RedHatEnterpriseLinuxre......
  • C++之深入探讨同步操作与强制次序
    背景在C++多线程编程中,线程间的同步与顺序执行是至关重要的。同步操作可以确保线程间的数据一致性,避免数据竞争和死锁问题。强制次序则可以确保线程间的操作按照预期顺序执行。本文将详细介绍C++多线程编程中的同步关系、先行关系、原子操作的内存顺序、释放序列和同步关系、栅栏......
  • CABasicAnimation和CAKeyframeAnimation动画同步问题
    背景需要做一个扇形带指示器的进度条动画,最初实现的是如下效果代码如下funcstartAnimation(){letwidth=self.frame.widthletbezierPath=UIBezierPath(arcCenter:CGPoint(x:width/2,y:radius),radius:radius-trackWidth,startAngle:(1+angle......
  • 百转千回!记一次MySQL主从同步异常的排查记录
    一、现象最近项目的测试环境遇到一个主备同步的问题:备库的同步线程停止了,无法同步主库的数据更改。备库报错如下:从库同步报错信息完整的错误信息:Relaylogreadfailure:Couldnotparserelaylogevententry.Thepossiblereasonsare:themaster'sbinarylogis......
  • 桢同步问题分析以及解决方案
    问题展示以及源码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;[RequireComponent(typeof(PlayerPawn))]publicclassMoveSync:MonoBehaviour{privatefloattime=0;[SerializeField]private......
  • 阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂
    前言:金三银四刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及我在这方面学习的经验。阿里微服务面试真题1.单片,SOA和微服务架构有什么区别?单......
  • uniapp清除应用缓存
    计算缓存//计算缓存formatSize(){letthat=this;plus.cache.calculate(function(size){letsizeCache=parseInt(size);if(sizeCache==0){that.fileSizeString="0B";}elseif(sizeCache<1024){that.fileSizeString=sizeC......