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

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【程序员养生延寿系列-万人关注的养生指南】

一.程序员面临的健康问题 应该说不只程序员,大部分互联网从业者,都会遇到很多类似的健康问题,比如: 心理压力大,失眠长期加班久坐不动熬夜,甚至通宵作息不规律饮食不均衡 短期可能不会表现出来&#xff…

MMDetection3D v1.1.0安装教程

MMDetection3D v1.1.0安装 1. 系统环境2. 安装2.1 基本环境安装2.2 验证2.3 安装MinkowskiEngine和TorchSparse 3. 最终环境配置 根据 v1.1.0版本官方手册,测试后的安装配置,亲测可行 1. 系统环境 项目版本日期Ubuntu18.04.06 LTS-显卡RTX 2070-显卡驱…

Leaflet-学习

一、官网 英文官网:Leaflet 中文官网:Leaflet 二、介绍 Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有39 KB, 并且拥有绝大部分开发者所需要的所有地图特性。 Leaflet 简单、高效并且易用。 它可以高效的运行在桌…

uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题,例如要传code给后端以换取session_key,在这之前需要先调用 uni.login,所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理,以便能更…

SSMBUG之 url +

1. Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. 经查, 书写一切正常. 注意到此时yml文件的图标是一个红色的Y而不是绿色的spring , 推测没有正确加载. 重新创建项目, 所有东西拷贝一份便恢复正常…

猫头虎分享已解决Bug || AttributeError: ‘Sequential‘ object has no attribute ‘session‘

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

MySQL报错:sql_mode=only_full_group_by解决方法

Linux环境 ubuntu 22.04 MySQL是8.0.35版本 问题描述 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column auth_system.t_class_temp_config.id which is not functionally dependent on columns in GROUP BY clause; this is inco…

Kubernetes基础(二十六)-kubernetes的eviction机制

eviction,即驱赶的意思,意思是当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod。eviction在openstack的nova组件中也存在。 目前kubernetes中存在两种eviction机制,分别由kube-controller-manager和kubelet实现。 …

Delphi之后的接班人?国产可视化编程工具重塑经典

Delphi,这个名字对于许多80后的程序员来说,无疑是一种深深的情怀。它曾是可视化编程的王者,承载着无数开发者的青春记忆。 在Pascal语言盛行的年代,Delphi以其独特的魅力,迅速在编程界崭露头角。当时流传着这样一句话&…

Java实现公司货物订单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

开启数字内容创作的新时代

目录 技术解析 未来展望 技术解析 Sora是一款由OpenAI开发的先进AI视频模型,其技术架构基于深度学习和自然语言处理技术。该模型的核心算法原理包括使用深度神经网络进行视频内容的理解、生成和互动。 在技术架构方面,Sora采用了一种混合的神经网络结…

架构设计:流式处理与实时计算

引言 随着大数据技术的不断发展,流式处理和实时计算在各行各业中变得越来越重要。那么什么是流式处理呢?我们又该怎么使用它?流式处理允许我们对数据流进行实时分析和处理,而实时计算则使我们能够以低延迟和高吞吐量处理数据。本…

怎么向最厉害的人偷师?

用户孙振楠William: 自己做重大决策,心里常常没底。你觉得有必要跟身边的长辈或者是公司里的上级有意识地建立导师关系吗? 选谁成为人生导师呢? 回答:做好决策的确是一件不容易的事情,你需要懂得决策的基本…

在Spring Boot启动时禁止自动配置数据源相关的组件、@SpringBootApplication

一、SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解 在Spring Boot启动时禁止自动配置数据源相关的组件。 SpringBootApplication(exclude {DataSourceAutoConfiguration.class})注解的使用案例 这个注解通常应该写在微服务项目的主启动类上&…

Java 面试题基础(四)

Java 面试题基础(四) 前言1、获取Class对象的构造方法?2、获取Class对象的成员变量?3、获取Class对象的成员方法?4、简述一下你了解的设计模式?5、java中fail-fast和fail-safe的区别说明?6、Jsp…

C#_事件简述

事件模型简述 C#中事件的运行模式为"发布订阅模型",事件触发者称为"发布者",事件处理者称为"订阅者" 事件模型的五个组成部分 事件(成员)事件的拥有者(类/对象)事件的响应…

【MySQL高可用集群】MySQL的MGR搭建

前情提要: MySQL官方在 5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR),使用类似 zookeeper 的多于一半原则。在一个集群由 2N1 个节点共同组成一个复制组,一个事务的提交,必须经过…

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

tigramite教程(二)生物地球科学案例研究

文章目录 数据生成与绘图因果发现分析平稳性假设、确定性、潜在混杂因素结构假设参数假设使用PCMCIplus的滑动窗口分析聚合因果图非参数因果效应估计假设的图形和调整集干预的真实情况假设的参数模型和因果效应的估计使用关于图的不同假设进行估计非因果估计项目地址 这个文件…

android 13.0 屏蔽所有电话来电功能

1.概述 在13.0系统rom定制化开发中,最近项目需要开发需求是屏蔽来电功能,需要根据标志位 屏蔽一切来电功能 就是去掉通话功能,这就需要从通话流程进行分析,然后实现功能 ,而我们知道所有的来电去掉都是CallManager.java来负责监听管理的。 2.屏蔽所有电话来电功能的核心代…