Cache Aside Pattern(旁路缓存模式)

读:从cache中读取数据,若读取到则直接返回;cache中不存在则去database中读取,然后更新到cache。

写:先更新database然后删除cache中的数据。

缓存一致性

多并发情况下,需要延时双删,否则数据会不一致。

出现不一致的情况

1. 事务一往database更新数据
2. 事务二往database更新数据
3. 事务二完成database更新,删除cache中数据
4. 此时接口被访问,更新database数据到cache(此时还在读取未更新到cache)
5. 事务一完成database更新,删除cache中缓存
5. 接口被访问的数据更新到cache 结果:导致cache中的数据是database事务二更新完的数据,事务一的数据尚未更新到cache,此时出现缓存一致性失效。

解决办法:延时双删

  1. 删除cache中的数据
  2. 更新database数据
  3. 延时500ms(延时时间要大于更新数据库时间)
  4. 删除cache中的数据

此时保证读到的数据必定是最新的。

Read/Write Through Pattern(读写穿透)

读:从cache中读取数据,若读取到则直接返回;cache中不存在则去database中读取,然后更新到cache。

写:先更新cache中的数据,若cache中不存在,则更新database,更新database时同步更新cache。

Write Behind Pattern(异步缓存写入)

读:从cache中读取数据,若读取到则直接返回;cache中不存在则去database中读取,然后更新到cache。

写:先更新cache中的数据,若cache中不存在,则更新database,更新database时异步更新cache。

Redis - 读写模式 - 缓存一致性的更多相关文章

  1. 分布式-技术专区-Redis和MySQL缓存一致性问题

    1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...

  2. Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性

    一.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求 ...

  3. redis,缓存雪崩,粗粒度锁,缓存一致性

    1, redis单线程为什么快 io多路复用技术 单线程避免多线程的频繁切换问题 memcache缺点 kv形式数据 没有持久化mongodb 海量数据的访问效率 mr的计算模型文档就是类似json的 ...

  4. Redis缓存穿透、击穿、雪崩,数据库与缓存一致性

    Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...

  5. Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存

    本片文章续<Spring Boot 入门(九):集成Quartz定时任务>.本文主要基于redis实现了mybatis二级缓存.较redis缓存,mybaits自带缓存存在缺点(自行谷歌) ...

  6. redis读写分离及可用性设计

    Redis缓存架构设计 对于下面两个架构图,有如下想法: 1)redis主从复制模式,为了解决master读写压力,对master进行写操作,对slave进行读操作. 2)而在分片集群中,如果对部分分 ...

  7. NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩

    1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...

  8. SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存

    系统环境: Redis 版本:5.0.7 SpringBoot 版本:2.2.2.RELEASE 参考地址: Redus 官方网址:https://redis.io/ 博文示例项目 Github 地址 ...

  9. 缓存一致性(Cache Coherency)入门

    作者: Fabian “ryg” Giesen  来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...

随机推荐

  1. 《头号玩家》AI电影调研报告(四)

    五. 现实中对于技术的实现 1.自由变身 电影中,主人公借助"魔幻眼镜"让自己快速变成另一个人的模样,现实中我们一样也能做到! 在今年游戏开发者大会(GDC)上,一个名为" ...

  2. Java习题

    public class ClassTest{ String str = new String("hello"); char[] ch = {'a','b','c'}; publi ...

  3. Springcloud报错:java.lang.IllegalStateException: Service id not legal hostname (/a-service)

    今天在做springcloud链路追踪的时候,报错java.lang.IllegalStateException: Service id not legal hostname (/a-service) ...

  4. OllyDbg---比较、条件跳转指令

    比较和条件跳转 CMP 比较两个操作数,相当于SUB指令,但是相减的结果不保存到第一个操作数,而是根据相减的结果来改变零标志位.当两个操作数相等时,零标志位Z置为1. 两个操作数不相等时,零标志位Z被 ...

  5. Mysql各版本号的含义

    1)MySQL Community Server 社区版本,开源免费,但不提供官方技术支持2)MySQL Enterprise Edition企业版本,需付费,可以试用30天3)MySQL Clust ...

  6. 获取ul中li的value值

    <script> $(function(){ $(".month-list").find("li").click(function(){ var t ...

  7. vue3 监听路由($route)变化

      setup() {      // ...   },   watch: {     $route(m, n) {       console.log('mm', m)       console. ...

  8. 用于激光雷达的 APD,SPAD 和 SiPM 分析

    1. 术语及定义 1.1 激光雷达,Light Detection And Range, LiDAR  发射激光光束,并接收回波以获取目标三维和/或速度信息的系统: 1.2 机械旋转激光雷达,Mech ...

  9. Math内置对象 常用的方法

    属性: Math.Pi 方法: Math.max()   最大值 Math.min()  最小值 Math.ceil()  向上取整 Math.floor() 向下取整 Math.random()   ...

  10. 转换为布尔类型 Boolean

    1. js 代码 console.log(Boolean('')); // false console.log(Boolean(0)); // false console.log(Boolean(Na ...