mysql和redis双写一致性策略分析

2023-05-16

mysql和redis双写一致性策略分析

一.什么是双写一致性
当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新;
数据读取的流程:
1.读取redis,如果value!=null,直接返回;
2.如果redis中value=null,读取mysql中数据对应的value,将key-value保存在redis中;
双写一致性策略:
策略1:先更新缓存,再更新数据库;
策略2:先更新数据库,再更新缓存;
策略3:先删除缓存,再更新数据库;
策略4:先更新数据库,再删除缓存;

二.四种策略存在的问题和优势
1.先更新缓存,再更新数据库
在这里插入图片描述

问题:这种策略如果redis更新成功,mysql更新失败,这时造成redis脏数据问题,这种策略是绝对不能使用的;

2.先更新数据库,再更新缓存
在这里插入图片描述
问题:这种策略的主要问题就是发生在并发场景下,当线程ThreadA更新mysql后由于某种原因并没有立刻更新redis缓存,这时线程ThreadB立即将数据库和缓存都更新成功,最后ThreadA将redis中的数据进行更新,这时就会造成ThreadB对缓存的更新丢失,这是一个很严重的问题;

3.先删除缓存,再更新数据库
在这里插入图片描述

问题:这种策略的主要问题也是发生在并发场景下,当ThreadA更新数据库之前先将redis中的数据进行删除,在更新数据库;但是在并发场景下回有一个问题,在ThreadA还没有更新完数据库时ThreadB读取了数据库将旧数据又重新写会redis中,这样同样造成数据库和缓存数据不一致问题;
解决办法:采用双删策略,在ThreadA准备写入数据库之前将缓存删除,当ThreadA数据库中数据更新完成后再进行一次缓存删除,这样就可以解决数据不一致问题,但是要注意第二次删除一定要保证时间上晚于数据库更新成功时间;值得注意的是延迟删除的时间间隔硬顶要大于操作的时间周期;

4.先更新数据库,再删除缓存
在这里插入图片描述
问题:这种策略的主要问题同样是发生在并发场景下,当ThreadA首先进行读数据库,准备将数据写入缓存,这时ThreadB更新数据库并且立刻执行了缓存删除,最后ThreadA才将旧数据同步到redis缓存中,同样会造成数据库和缓存数据不一致问题;
一般来说这种情况出现的概率很低,因为写操作时间大概率要比读操作时间长很多;
解决办法:解决上述问题的办法还是使用延迟双删策略,但要注意在ThreadB的第二次删除时间间隔一定要大于ThreadA的读取数据的时间周期;

三.扩展
1.采用延迟双删策略时如果删除失败了如何进行处理?
消息队列
2.如何使用Canal保证数据库与缓存数据的实时一致性?

四.关于单机redis中的16个数据库的分析
对于使用过redis的小伙伴们对一台redis服务器下有16个物理数据库并不陌生,它的命名格式是db0-db15,并且我们不能自定义的去更改这个命名;
在这里插入图片描述
1.关于16个物理数据库的使用介绍

Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。
聊聊关于Redis中16个默认数据库的知识
Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。
Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。
客户端与Redis建立连接后会默认选择0号数据库,不过可以随时使用SELECT命令更换数据库。
切库redis> SELECT 1 # 默认0号db,切换为1号dbOKredis [1] > GET username # 从1号库中获取 username (nil)
在实际项目中则可以通过以Redis配置文件的形式指定数据库,如下图所示
在这里插入图片描述
2、正确理解单机Redis的“数据库”概念

由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。开发者则需要自己记录存储的数据与数据库的对应关系。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么全部数据库都没有权限访问。但是,要正确地理解Redis的“数据库”概念这里不得不提到一个命令:
清空一个Redis实例中所有数据库中的数据redis 127.0.0.1:6379> FLUSHALL
该命令可以清空实例下的所有数据库数据,这与我们所熟知的关系型数据库所不同。关系型数据库多个库常用于存储不同应用程序的数据 ,且没有方式可以同时清空实例下的所有库数据。所以对于Redis来说这些db更像是一种命名空间,且不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

3、在redis集群环境下不支持一个实例多个数据库的形式
在resis的集群环境下只支持db0,所以在redis的集群环境下不能使用select +number进行redis物理数据库的切换;
要注意以上所说的都是基于单体Redis的情况。而在集群的情况下不支持使用select命令来切换db,因为Redis集群模式下只有一个db0。再扩展一些集群与单机Reids的区别,感兴趣的朋友可以去查阅相关的资料深入理解,这里就不做讨论了。

key批量操作支持有限:例如mget、mset必须在一个slot

Key事务和Lua支持有限:操作的key必须在一个节点

key是数据分区的最小粒度:不支持bigkey分区

不支持多个数据库:集群模式下只有一个db0

复制只支持一层:不支持树形复制结构

五、总结

Redis实例默认建立了16个db,由于不支持自主进行数据库命名所以以dbX的方式命名。默认数据库数量可以修改配置文件的database值来设定。对于db正确的理解应为“命名空间”,多个应用程序不应使用同一个Redis不同库,而应一个应用程序对应一个Redis实例,不同的数据库可用于存储不同环境的数据。最后要注意,Redis集群下只有db0,不支持多db。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql和redis双写一致性策略分析 的相关文章

  • 针对初学者的android Unresolved reference: *

    本文主要是针对Android初学者出现的android Unresolved reference xml代码kt的代码 xml代码 lt Button android id 61 34 64 43 id btn album 34 andro
  • python中跨平台文件操作

    众所周知 xff0c Windows下的路径分隔符为反斜杠 34 34 而UNIX like系统下的路径分隔符为正斜杠 34 34 xff0c 这常导致代码跨平台移植时的问题 Python设计为一门跨平台的语言 xff0c 当然可以轻松解决
  • Vxworks 学习(一)介绍

    Vxworks 学习 xff08 一 xff09 介绍 该系列文章是我根据多个博主以及相关书上内容整理的学习笔记 xff0c 许多内容非原创 实时操作系统 定义 实时操作系统 xff08 Real Time Operating System
  • 8-Cython依赖Visual Studio

    文章目录 前言一 vs 2015安装提示错误二 使用步骤1 下载安装vs高版本版本 二 环境配置三 测试模块编译安装四 测试Cython 前言 前面再crypto用于加解密时使用2005版本提供编译支撑 xff1b 最近2005编译环境安装
  • MongoDB的特点及概念

    MongoDB 的特点及概念 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 xff0c 是非关系数据库当中功能最丰富 xff0c 最像关系数据库的 它是一个基于分布式文件存储的开源数据库系统 在高负载的情况下 xff0c 添
  • 【四足机器人】强化学习实现minitaur运动控制(决策模型篇)

    文章目录 模型概要1 状态 决策空间 xff08 略 xff09 2 奖励函数3 决策模型 模型概要 1 状态 决策空间 xff08 略 xff09 状态空间 xff1a roll xff08 X轴 xff09 pitch xff08 Y轴
  • 解决windows下安装Anaconda后python pip不可用的情况

    在windows系统下通过安装Anaconda的方式安装的python使用中发现不能再通过pip安装python包 只能通过conda install packname 的方法 xff0c 导致很多conda不支持的包无法安装 我遇到的事d
  • Spring-为什么要使用Spring?为什么要使用依赖注入(DI)?

    为什么要使用Spring xff1f 使用Spring框架最主要的原因是为了简化Java开发 xff08 大多数框架都是为了简化开发 xff09 xff0c 它帮我们封装了很多完善的功能 xff0c 而且Spring的生态圈非常的庞大 基于
  • Shell Limits设置问题导致用户不能登录

    故障现象 前几天 xff0c 突然间某数据库主机不能su切换到grid用户 发生故障的环境为 xff1a RHEL 6 7 xff0c ORACLE 11gR2 RAC xff0c 其中集群节点1发生此故障 xff0c 而节点2状态正常 故
  • shell脚本通过ftp获取文件

    shell脚本通过ftp获取文件 span class token comment usr bin bash span span class token comment T 1日期 span day 61 96 date span clas
  • 将EditPlus添加到右键菜单中

    将EditPlus添加到右键菜单中 一 以管理员权限打开打开Edit Plus 二 工具 gt 配置用户工具 三 点击常规选项选中左侧将EditPlus添加到右键快捷菜单中 四 选中一个文件 xff0c 右键就可以看到了
  • windows安装jdk

    windows安装jdk 一 xff1a 下载地址 xff0c 可下载自己需要的版本 https www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • VMware共享本机网络

    VMware共享本机网络 一 设置桥接模式 xff1a 左上角菜单栏 gt 虚拟机 gt 设置 gt 网络适配器 xff08 如图操作 xff09 二 编辑虚拟网络 左上角菜单栏 gt 编辑 gt 虚拟网络编 xff08 如图操作 xff0
  • vim设置行号

    vim设置行号 方法一 xff1a 临时 或者 方法二 xff1a 当前用户永久 1 修改vim配置文件vimrc vim vimrc 输入 xff1a set number 或 set nu 保存退出 方法三 所有用户 1 vim etc
  • tomcat 配置https

    一 生成证书 1 使用jdk自带的keytool ext生成证书 xff0c 进入jdk下bin目录 xff1b 2 在路径栏输入cmd 回车打开dos命令窗口 xff0c 打开之后当前路径为jdk下bin目录 ps xff1a 也可直接w
  • Google http测试工具

    一 下载 xff1a 下载地址 xff1a https pan baidu com s 16mCI0QUn z0kNPX4yqGEWg 提取码 xff1a sgiz 二 配置 1 解压文件 2 在Google里配置插件 xff0c 或者叫扩
  • linux mysql 离线安装

    一 下载 1 官网地址 https dev mysql com downloads mysql 点击Archives 选择需要的版本 点击Download 进行下载 xff0c 如需要登录自行注册登录 将下载的安装包上传至linux系统 2
  • cmd介绍及常用命令

    cmd介绍 cmd基本概念 cmd commander xff0c 命令提示符是在操作系统中 xff0c 提示进行命令输入的一种工作提示符 在不同的操作系统环境下 xff0c 命令提示符各不相同 在windows环境下 xff0c 命令行程
  • 计算机的发展史

    计算机的发展史 计算机的前身 1642年的时候 xff0c 一位19岁的法国小伙设计并制作了一台能自动进位的加减法计算装置 xff0c 一开始是只能算加法的 xff0c 所以叫 加法器 后来慢慢改良 xff0c 可以做加减乘除的四则运算 x
  • 利用Radiogroup Radiobutton 实现滑动效果菜单

    第一次在满世界大侠的地方撰写博客 xff0c 所以不免紧张 xff0c 怕自己写出让人消掉大牙的文章 本着学习的态度 xff0c 最后我还是决定把自己的学习感想记录下来 首先我要感谢一个哥们 xff0c 大部分的内容都是他的杰作 xff0c

随机推荐

  • 一、初识VUE

    一 什么是vuejs VUE是一个渐进式的框架 xff0c 什么是渐进式呢 xff1f 渐进式意味着可以将vue作为应用的一部分 xff0c 嵌入应用 也就是说 xff0c 在一个整体项目中 xff0c 部分可用jQuery xff0c 部
  • Linux目录概述

    一 概述 由于开发linux发行版的社区或这企业太多 xff0c 如过每个Linux发行版的目录结构都不相同 那么在管理和使用上会造成很多困扰 xff0c 所以就有了FHS Filesystem Hierarchy Standard 的出现
  • ls与cp命令详解

    一 文件与目录检视 ls a xff1a 全部的文件 xff0c 连同隐藏文件 xff08 开头为 的文件 xff09 一起列出来 xff08 常用 xff09 A xff1a 全部的文件 xff0c 连同隐藏文件 xff0c 但不包括 与
  • linux 安装JDK

    一 下载JDK 版本 xff1a jdk 8u191 linux x64 tar gz 链接 xff1a https pan baidu com s 1w9HpHBRPHCfoiEpGSKJqXA 提取码 xff1a whya 二 安装 创
  • java调用DLL之jna

    一 添加maven依赖 span class token comment lt https mvnrepository com artifact net java dev jna jna gt span span class token t
  • 三、vue :定义变量、v-for、v-on示例

    一 vue定义变量 let xff1a 定义变量const xff1a 定义常量 contst定义常量时 xff0c 必须赋值 指向的对象不可改变 xff0c 但是对象中的属性 contst obj 61 name 39 张三 39 obj
  • 二、vue插值操作

    一 Mustache mustache语法就是两个大括号 34 34 mastache语法不仅直接可以写值 xff0c 也可以写一些简单的表达式 span class token tag span class token tag span
  • 二、vue中v-bind使用

    一 v bind基本使用 一个页面中 xff0c 除了标签内容需要动态绑定外 xff0c 标签的属性也需要动态绑定 xff0c 例如 xff1a a元素的href属性和img元素的src属性 这时就需要用到v bind了 span clas
  • 四、vue计算属性的使用

    通常 xff0c 在模板中可直接通过插值语法显示data中的属性 xff0c 但是在某些情况 xff0c 需要将某些数据进行转化后显示或者将多个数据结合起来显示 计算属性的基本使用 span class token tag span cla
  • firewall-cmd 端口管理

    1 开放端口 firewall span class token operator span cmd span class token operator span zone 61 public span class token operat
  • BIND 高级特性(二)-- 动态更新(转)

    BIND 高级特性 xff08 二 xff09 xff0d xff0d 动态更新 转 64 more 64 在很多大的网络中为了简化维护量 xff0c 都使用了DHCP来动态分配IP地址 这样就要求DNS也能够动态的添加和删除记录 BIND
  • Vue内置指令——v-show

    v show的用法与v if类似 xff0c 不同的是带有 v show 的元素始终会被渲染并保留在 DOM 中 v show 只是简单地切换元素的 CSS 属性 display span class token doctype span
  • QtCreator按顺序编译多个子项目

    QtCreator按顺序编译多个子项目 0 环境1 创建子项目2 创建SubProjectSln的子项目3 三个项目内容3 1 Dll3 2 Lib3 3 UiApp 4 构建 0 环境 Qt5 3 2 mingw482 32 1 创建子项
  • windows与wsl互相访问

    找出能与WSL2连接的那个IP 启动WSL2 xff0c 键入如下命令 xff1a span class token function cat span etc resolv conf 如 xff1a nameserver 172 27 1
  • 平衡树的深度与最少结点数问题

    对于一棵平衡树 xff0c 如果以NhNh表示深度为h时含有的最少结点数 有如下的规律 xff1a N0 61 0 N1 61 1 N2 61 2 Nh 61 Nh 1 43 Nh 2 43 1 这里研究的是最小结点数 xff0c 最多结点
  • ubuntu报错记录:bash:XXX.sh权限不够统一解决办法

    在Ubuntu上执行提示如下报错时 xff1a bash xxx sh权限不够 其中的xxx表示报错文件名 解决办法 span class token function sudo span span class token function
  • Ubuntu 修改中文字体教程

    刚刚开始使用Ubuntu xff0c 在终端代码里可以看到奇奇怪怪丑陋的中文字体 xff0c 怎么换成更好看的中文字体呢 看了很多教程都是通过修改终端字体来实现 xff0c 但这样就不能使用自己想要的英文字体了 xff0c 比如我使用 So
  • STM32接口FSMC与FMC控制 XXROM

    FMC是STM32F429 439专有的 xff0c 因为驱动SDRAM时需要定时刷新 xff0c 而FSMC存在于F1和F4中我们常用的芯片中 他们的全称为 xff1a Flexible static memory controller
  • springcloud通过nacos整合seata遇到的问题

    1 配置完成后 xff0c 启动seata server服务器 xff0c 注册到nacos xff0c 启动client后访问接口 xff0c 报错如下 xff1a io seata common exception FrameworkE
  • mysql和redis双写一致性策略分析

    mysql和redis双写一致性策略分析 一 什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新 xff1b 数据读取的流程 xff1a 1 读取redis 如果value 61 null 直接返回