《Redis Mysql 双写一致性问题》
一:序
- 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题。
- 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案。
二:(更新策略)- 先更新数据库,后更新缓存
- 产生的问题
-
- 由上面流程图可知道,请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。
- 这就导致了脏数据,因此不考虑 先更新数据库,后更新缓存 这个更新策略。
三:(更新策略)- 先删除缓存,在更新数据库
- 产生的问题
-
- 如果同时有一个请求A进行更新操作,另一个请求B进行查询操作。
- 就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。
四:(更新策略)- 先更新数据库,在删除缓存
- FaceBook 也是采用这种方式。
- 当然,这种方式也会产生数据不一致问题。
- (1)缓存刚好失效
-(2)请求A查询数据库,得一个旧值
-(3)请求B将新值写入数据库
-(4)请求B删除缓存
-(5)请求A将查到的旧值写入缓存
- 前提是 写操作耗时一定是低于 读操作的,在一般的条件下,这时不可能得。
五:小结
- 这里只分析了平常可能想到的更新策略的分析。
- 其实,要解决数据一致性的问题,还是要根据具体业务来具体判断。
- 强一致性的,那么就需要悲观锁,使得一致。
- 同时还有 延时双写/延时双删 等策略。其实都是为了根据自身业务来进行的操作。
- 知道了这些策略可能带来的问题,也就可以在合适的业务下选择合适的策略来满足我们的需求。
《Redis Mysql 双写一致性问题》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- LeetCode 1043. Partition Array for Maximum Sum
原题链接在这里:https://leetcode.com/problems/partition-array-for-maximum-sum/ 题目: Given an integer array A, ...
- Collecting metrics with the PostgreSQL and TimescaleDB output plugin for Telegraf
转自:https://docs.timescale.com/v1.3/tutorials/telegraf-output-plugin 文章演示了如何使用pg output 插件 以及Telegraf ...
- pip崩了, 解决 ModuleNotFoundError: No module named 'pip'.
今天 在windows下用pip 安装数据库模块pymysql 把pip 弄崩了,直接出现下面的错误.都是红字, 再输入pip install pymysql ,会报错ModuleNotFound ...
- Linux 把进程为D(不可中断进程)转换成其他状态
问题现象:当前集群跑hadoop的时候,,任务失败,但是跑任务的容器没有正常退出,显示一大堆的YarcChild进程,,more /proc/进程/status 查看其状态,进程为D(disk s ...
- 拉格朗日插值法(c++)
已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,计算sin0.3367的值 #include <iostream> #includ ...
- JavaWeb项目启动过程与ServletContext
ServletContext的官方名称叫Servlet上下文,服务器会为每一个工程创建一个对象,这个对象就是ServletContext.一个项目只有一个ServletContext对象,工程内的所有 ...
- 微信小程序上架需要增值电信业务经营许可证ICP?
很多小程序的开发者最近都遇到了类似的问题,那就是辛辛苦苦开发出来的小程序上线不了,要求提供一些特殊资质,比方说:增值电信业务许可证(下面有数十种分类),网络文化经营许可证等类似证件,这对于创业团队来说 ...
- Python语言编写BP神经网络
Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135 人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...
- uniapp - 微信公众号授权登录
[缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程 [摸索] ...
- c# winform访问 带有windows身份验证的webservice
1 将webservice设置为windows身份验证iis10中,要确认已安装windows身份验证在 控制面板 - >打开或关闭Windows功能 - >万维网服务 - >安全性 ...