Redis缓存同步1-策略介绍

缓存数据同步策略示意图
在大多数情况下,我们通过浏览器查询到的数据都是缓存数据,如果缓存数据与数据库的数据存在较大差异的话,可能会产生比较严重的后果的。所以,我们应该也必须保证数据库数据、缓存数据的一致性,这就是缓存与数据库的同步。
缓存数据同步策略
缓存数据同步,常见的有三种方式:
1:设置有效期
给缓存设置有效期,到期后自动删除。再次查询的时候,更新数据。
这种方式的优缺点及使用场景如下:
优点:简单、方便、好理解;
缺点:时效性差,缓存过期之前可能数据库中的数据和缓存中的数据就不一致了了。
使用场景:更新频率低,时效性要求低的业务。
2:同步双
同步双写策略就是在修改数据库的同时,也修改缓存。
同步双写的优缺点:
优点:时效性强,缓存与数据库强一致;
缺点:有代码侵入,耦合度高;只要操作数据库的插入、更新及删除相关业务操作,就要去同步更新缓存,这种耦合度太高了;
使用场景:对一致性、时效性要求较高的缓存数据。
3:异步通知
异步通知其实就是在修改了数据库的时候,发送时间通知,相关服务监听到通知之后异步的修改缓存数据。
这种方式的优缺点:
优点:低耦合,可以同时通知多个缓存服务。可以使用MQ,异步特性来更新缓存,这样更新数据库和更新缓存就解耦了,而且一次可以更新多个服务,同时,代码入侵也是很少的(只有发送MQ少量代码)甚至是零入侵就可以实现;
缺点:时效性一般,可能存在中间不一致的状态。因为是异步的,可能会存在时间差,导致数据在某一时刻,是不一致的。但是可以保证最终一致性
使用场景:时效性要求一般的,有多个服务需要同步更新缓存的。
事实上,大多数场景下,我们都可以通过异步通知这种策略来更新缓存。所以,我们就来深入的讲讲异步通知。
通常情况下,异步通知实现方案,可以基于MQ或者是基于Canal来实现。
异步通知的两种方案
我们先来看看基于MQ异步通知的流程
MQ异步通知更新缓存
我们以修改了商品后,更新对应的缓存为例来讲讲。业务流程大致如下描述:
1:在页面修改了商品信息后,商品信息入库,保存到MySQL数据库中;
2:入库成功后,发布一个MQ消息;
3:有个服务监听对应MQ消息,如果接收到消息后,就更新对应商品的缓存信息
流程图如下:

MQ异步通知更新缓存流程图
这种方案,依然有少量的代码入侵:在写完数据库后,发送MQ消息,这点代码入侵是没办法省略的。
第二种方案,就是Canal通知
基于Canal的通知
基于Canal通知的业务流程如下图:

基于Canal通知的业务流程图
流程解读:
1:商品服务完成商品修改后,商品信息入库后,相关业务直接结束。这里没有任何的代码入侵;
2:Canal监听MySQL变化,当发现变化后,立即通知缓存服务;
3:缓存服务接收到canal通知后,更新缓存
使用Canal的异步通知是代码零侵入的。所以,这里,咱们就选择基于Canal的通知。接下来,我们就来讲讲Canal
Redis缓存同步1-策略介绍的更多相关文章
- redis 缓存用户账单策略
最近项目要求分页展示用户账单列表,为提高响应使用redis做缓存,用到的缓存策略和大家分享一下. 需求描述:展示用户账单基本信息以时间倒序排序,筛选条件账单类型(所有,订单收入.提现.充值...). ...
- 结合场景使用Redis缓存与数据库同步
Redis缓存与MySQL数据库与同步 什么场景用到了Redis缓存? 1.广告数据 2.搜索时,分类品牌名称,分类名称和规格数据 3.购物车 4.支付 问题:如何实现? 1.广告数据 先查询Redi ...
- JAVA记录-redis缓存机制介绍(一)
1.redis介绍 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Re ...
- Redis数据类型,持久化,回收策略——(Redis缓存第一章)
缓存:第一种是内存缓存 比如Map(简单的数据结构),以及EH Cache(Java第三方库),第二种是缓存组件比如Memached,Redis:Redis(remote dictionary ser ...
- redis缓存介绍以及常见问题浅析
# 没缓存的日子: 对于web来说,是用户量和访问量支持项目技术的更迭和前进.随着服务用户提升.可能会出现一下的一些状况: 页面并发量和访问量并不多,mysql足以支撑自己逻辑业务的发展.那么其实可以 ...
- Redis缓存策略设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...
- 1.2_springboot2.x中redis缓存&原理介绍
1.整合redis作为缓存 说明这里springboot版本2.19 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构 ...
- celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决
今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...
- redis集群配置,spring整合jedis,缓存同步
前台的商品数据(图片等加载缓慢)查询,先从redis缓存查询数据. redis是一个nosql数据库,内存版数据库,读取速度11w/s.本身具有内存淘汰机制,是单线程服务器(分时操作系统),线程安全. ...
- redis 缓存策略
redis 缓存策略配置项:maxmemory <bytes>maxmemory-policy noeviction 触发时机:每次执行命令(processCommand)的时候会检测 w ...
随机推荐
- day31:socketserver&hashlib&hmac&TCP登录
目录 1.socketserver:实现TCP协议下Server端的并发 2.hashlib模块 3.hashlib应用:文件校验 4.hmac应用:服务器的合法性校验 5.TCP登录程序 1.soc ...
- 去掉Bom头的方法和为什么要清除Bom头
什么是bom头? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也 ...
- Vue路由实现的底层原理
在Vue中利用数据劫持defineProperty在原型prototype上初始化了一些getter,分别是router代表当前Router的实例 . router代表当前Router的实例.rout ...
- GPT-NER:通过大型语言模型的命名实体识别
讲在前面,chatgpt出来的时候就想过将其利用在信息抽取方面,后续也发现了不少基于这种大语言模型的信息抽取的论文,比如之前收集过的: https://github.com/cocacola-lab/ ...
- ARM Cortex-M4|非常好用的一种串口收发方式
在这里分享项目中我经常使用的一种串口收发方式:阻塞发送 + 接收中断 +空闲中断 + 环形队列 项目代码地址:www.baidu.com 一.简介 串口发送使用最简单的阻塞发送方式,一般来说都是接收的 ...
- Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新
Hystrix 简介 Hystrix 是 Netflix 开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮.这里对 Hystrix 本身不做过多介绍. Hystrix 目前处于维 ...
- 业务系统对接CAS
启动类加@EnableCasClient <!--cas客户端--> <dependency> <groupId>net.unicon.cas</groupI ...
- Python 字典嵌套
字典嵌套 含义:将一系列字典存储在列表中,或将列表作为值存储在字典中 在列表中嵌套字典.在字典中嵌套列表.在字典中嵌套字典 字典列表 创建多个字典,将字典存放在列表中 使用range()自动生成多个字 ...
- Eclipse 没有创建 Maven 项目入口的原因
试错过程 软件下载错了 我首先参考了 Eclipse历史版本下载和选择对应的java版本 这篇文章,发现 Eclipse 2020-06 的版本以后就不支持 JDK 8 了. 我想要下载 Oxygen ...
- Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) 小记
在机房其它人都有许多的橙名小号后我终于大号上橙了(果然还是太菜了),写篇博客记录一下. 计数水平太弱,赛场最后 5 分钟乱糊了一个 F 的做法,后来发现其它人做法都短好多. A & B &am ...