某网站Redis与MySql同步方案分析

news/2024/5/13 18:52:39/文章来源:https://hanchao.blog.csdn.net/article/details/79729576

后续文章: 通过Canal保证某网站的Redis与MySql的数据自动同步


1.编写目的

某网站项目引入了redis缓存技术,如何保证Redis与MySql的数据一致性是开发人员需要首要解决的问题。

本文主要包括以下内容:

  • Redis与MySql的数据一致性方案汇总与选取
  • Canal解析binlog方案简介
  • 其他Redis开发原则

2.方案汇总与选取

下面展示了几种常见的Redis与MySql数据一致性的方案:

序号方案方案简述评价
1手动同步一对于读操作,先读redis,有则返回,无则读取MySql,并插入Redis。对于写操作,先写MySql,再读Redis。直观简单,但是每次数据操作都需要手动维护缓存和数据库的一致性
2手动同步二对于读操作,先读redis,有则返回,无则读取MySql,并插入Redis。对于插入操作,先插入MySql,再写入cache。对于更新和删除操作,先删除cache,再操作MySql。直观简单,但是每次数据操作都需要手动维护缓存和数据库的一致性。高并发情况下,会出现db与cache的不一致
3MySql的UDF通过数据库中的触发器(Trigger)调用UDF(user defined function,自定义的函数库),来触发对Redis的相应操作自定义的函数库需要我们基于MySql的API进行开发(C++)(阿里早期做法)
4Gearman+PHP+MySql UDF通过借用已经比较成熟的MySql UDF,将MySql数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis一般使用在PHP的开发中
5Open-Replicator解析binlogOpen Replicator是一个用Java编写的MySql binlog分析程序。Open Replicator 首先连接到MySql,然后接收和分析binlog,根据binlog的分析结果进行缓存操作。主动读取binlog,实时性保证不够,整体解决方案不够成熟
6Canal解析binlogCanal主要是基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,核心基本就是模拟MySql中Slave节点请求。阿里开源项目,比较成熟的解决方案。

方案分析与选取:

  • 方案1和2都需要开发人员去手动维护Reids和MySql之间的同步。
  • 方案3需要编写UDF。
  • 方案4一般用在PHP开发中。
  • 方案5实时性较差。
  • 本项目采用方案6:通过Canal解析binlog。

3.Canal解析binlog简介

2.2.binlog

binlog,全称binary log,即MySql的二进制日志文件

binlog用于记录mysql的数据更新或者潜在更新(比如DELETE语句执行删除而实际并没有符合条件的数据),在mysql主从复制中就是依靠的binlog。

2.3.MySql主从复制

下图是对MySql的主从复制(Master/Slave)的简单说明:

这里写图片描述

原理:

  1. Master将数据库增量更新记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
  2. Slave将Master的binary log events拷贝到它的中继日志(relay log);
  3. Slave重做中继日志中的事件,将数据库增量更新反映到自己的数据库中。

2.4.Canal原理

下图是对MySql的主从复制(Master/Slave)的简单说明:
这里写图片描述

原理:
1. Canal模拟MySql Slave的交互协议,伪装自己为MySql Slave,向MySql Master发送dump协议
2. MySql Master收到dump请求,开始推送binary log给Slave(也就是Canal)
3. Canal解析binary log对象(原始为byte流)

4.其他Redis开发原则

下面列出一些已经确定的Redis开发原则:

  • 所有的写操作(插入、更新、删除)都访问MySql。
  • 所有的读操作都访问cache。
  • 通过Canal解析MySql的binlog同步Redis来保持数据一致性。
  • 提供一个初始化全部缓存数据的方法:initCache。
  • Redis的KEY命名规范:项目名称-模块名称-对象名称-主键id。例如:baidu-news-user-0000000001。

5.注意事项

通过一段时间的使用,现将使用Canal解析binlog方案过程中的注意事项进行说明:

  1. MySql需要开启binlog模式,此模式下导致MySql性能下降。
  2. MySql需要开启binlog模式,此模式下导致MySql的binlog文件激增。
  3. 在处理blob数据类型时,需要进行转码。

说明:

  1. 如果MySql本身需要使用主从复制,则必须开启binlog。所以此种情况下,第一条无需在意。
  2. 为了防止因binlog文件激增导致数据库服务器磁盘激增,可以设置MySql日志的自动清理。可以参考:《MySql自动清除binary logs日志》
  3. Canal在读取了binlog的数据之后,会进行判断属于那种数据类型。这时,如果此字段属于blob字段,则进行转码即可,伪代码如下:
//判断每个字段
for (Column column : columns) {//如果字段类型为blob,则进行转码if ("blob".equals(column.getMysqlType())) {json.put(column.getName(), new String(column.getValue().getBytes("ISO-8859-1"),"gbk"));}else{//其他字段直接将字段名和值放到json串中json.put(column.getName(), column.getValue());}
}

具体转换成何种编码,请根据项目情况进行调节。

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

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

相关文章

基于django的视频点播网站开发-step7-我的收藏喜欢功能

从本讲起,我们会讲到个人菜单中另外两个比较重要的功能,“我的收藏”与“我的喜欢”。感兴趣的同学可以点击网站的右上角,即可弹出个人菜单,你就能看到“我的收藏”与“我的喜欢”了。通过学习这两个功能,我们会加深对…

宝塔面板从安装到网站上线全过程

宝塔面板是一款很不错的主机面板程序,支持Linux、Windows系统,可选LNMP和LAMP Web环境,本文介绍从宝塔面板安装到网站上线全过程。本教程以阿里云Linux(CentOS 7.4 64位)服务器为例:一:SSH登录服…

大型网站技术架构(八)网站的安全架构

2019独角兽企业重金招聘Python工程师标准>>> 从互联网诞生起,安全威胁就一直伴随着网站的发展,各种Web攻击和信息泄露也从未停止。常见的攻击手段有XSS攻击、SQL注入、CSRF、Session劫持等。 1、XSS攻击 XSS攻击即跨站点脚本攻击(…

nginx 学习记录:IP+端口号配置网站、隐藏端口号、自签名证书配置Https、强制Https、自定义404...

2019独角兽企业重金招聘Python工程师标准>>> 几点心得 1. 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server 1. 443后面一定要加ssl,不然http会被重定向到https 1. 静态资源在上游服务器上,而不是当前nginx直接提供学习环…

大型分布式网站架构设计--第1章 面向服务体系的架构

本章目录: 分布式Java应用图: 分布式Java应用:大型系统会被拆分成多个子系统来实现,对于Java来说,这些子系统可能部署在同一台机器上不同的JVM,或者部署在不同机器上,但是这些子系统之间要进行…

ASP.NET网站发布到IIS后验证码不能显示与IIS模式

在VS2012上调试运行都正常,把网站部署到IIS后,登陆界面的验证码不能显示了(验证码是通过另一个页面嵌入到登陆页面上的),在网上看到了好多解决方案,启用父路径,验证码的路径问题,登陆…

如何在电脑上测试手机网站(全)

最近公司要开发网站的移动版,让我准备准备知识,话说本人开发移动网站的经验还真不多,最悲剧的事情就是我的手机是个经典的诺基亚,而且公司还不给配手机,这是有多讨厌,没办法,没有手机只能用电脑…

基于WordPress搭建个人网站

文章目录阿里云服务器域名申请和备案安装Xshell和Xftp下载安装安装宝塔面板网站部署忘记密码欢迎来我的小站溜溜弯: life.yuweizhang.top 阿里云服务器 1.登录阿里云服务器官网,然后进行注册, 实名认证(如果是学生可以进行学生认证&#xff…

lnmp如何设置二级域名并绑定网站

1. 解析二级域名 我用的是阿里云esc,直接找到域名解析这个页面,然后添加下你要解析的二级域名前面的字母,我的是music,这个可以根据自己的需求来起。 2. 测试二级域名是否成功解析 这个我们直接用万能的ping来测试一下就好了&…

卢松松:SEO 3.0其实早就不是新鲜事

何为SEO3.0? SEO1.0:是否有好的内容? SEO2.0:是否有较高的权重? SEO3.0:是否满足用户需求? 从去年开始陆续看到国内外的SEO专家在谈SEO 3.0,大多的意思都是指SEO以内容为基础去提供使用者最佳的使用经验,我们来…

中秋国庆长假,SEO你在坚持吗?

中秋国庆长假,举国同庆,无数人准备了丰富的游玩和放松计划,苦逼的SEO们,你们又在干嘛呢,在坚持自己的这份爱好么?还是和好多人一样,拼命的去挤下这拥堵的马路,上无数商家设下的购物陷…

SEO职业生涯规划的参考意见

步入SEO行业的人都有一个梦想,都是依靠SEO技术去赚钱。然而笔者观察了附件很多朋友,其中不乏有SEO界大牛人物,其已经利用SEO赚到了钱,也依靠SEO工作维持自己的生活;但也有一些SEO爱好者,他学过SEO&#xff…

中国联通网上营业厅,12306式的网站?

就在今日下午,笔者登陆联通网上营业厅办理套餐变更业务时,发现了下图一个“迷魂阵”似的矩阵,笔者顿时眩晕,不知道点击何处,作为读者的你们,你们看到下图觉得我办理66元A套餐该点击哪里? 于是我发了一条微…

公网ip访问服务器网站(博客)

本博客是关于如何用服务器的公网ip访问在服务器搭建好的网站,本人是在用xampp wordpress搭建博客时,用公网ip无法访问博客,在网上找了很多博客,试了很多方法,还是没有解决,最终无奈,只能想服务…

android混淆 网站,android混淆-关于依赖第三方库

之前写过关于打包混淆的一个帖子《android项目混淆打包注意事项》,它介绍的是对第三方jar包进行混淆,基本上可以解决混淆问题了。还不知道的,可以去看看,地址在这:http://my.eoe.cn/smile_it/archive/3820.html。现在的…

html5手机网站需要加的那些meta/link标签,html5 meta全解

一、大众机型常用meta标签name的设置 1、name之viewport <meta name"viewport" content""> 说明&#xff1a;屏幕的缩放 content的几个属性&#xff1a; width viewport的宽度[device-width | pixel_value]width如果直接设置pixel_value数值&a…

我国十大盗版网站:百度占前三

日前&#xff0c;国务院发展研究中心所属中国企业评价协会在北京召开新闻发布会&#xff0c;发布了《知识产权白皮书出版业》。“白皮书”中称&#xff0c;目前我国网络数字化盗版严重&#xff0c;搜索引擎成为盗版内容的重要出口&#xff0c;其中百度、百度贴吧和百度文库成为…

8 个接私活的网站

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群2019互联网圈不好混&#xff0c;不是每个公司都能像腾讯云每人一部iPhone 11&#xff0c;不少公司今年已经没了年终奖&#xff0c;不要抱怨&#xff0c;因为有的小伙伴估计工作都没了。师长今天给大家推荐…

linq版本E-Commerce网站示例

在家把E-Commerce的代码换成了linq版本的,代码量少了很多,看来做的工作越来越少,程序员的工资又要跌了...代码不保证全部正确,只用于学习,需要的可以看看,运行环境当然是.net3.5了...值得注意的是,当表关系不存在一对一或多对多的时候,你还是需要手动创建实体.如购物车和产品两…

精选了国内外 6 个接私活的网站,供大家赚钱!

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群本文来自公众号&#xff1a;GitHubDaily整理&#xff1a;起笔文章会向大家推荐国内外几个接外包比较靠谱的平台&#xff0c;主旨是贵精不贵多。因此&#xff0c;像「猪x戒」这种会让程序员自贬身价&#…