首页 > 数据库 >redis 缓存的模式

redis 缓存的模式

时间:2022-10-03 09:55:10浏览次数:46  
标签:缓存 数据库 redis 更新 并发 模式 操作 数据

一:读

1:缓存边缘化(cache aside)

应用程序先读取缓存,如果缓存没有,再去读数据库,然后更新缓存

 

 

 2:通读(Read-through)

在上面的基础上抽象一层缓存层,让缓存层去读缓存数据库

 

 

 

二:写

1:通写(Write-through)

 

 

 2:缓存之后在去写数据库(适合写数据频繁的操作)

 

 

 

三:更新

1:先跟新数据库。再更新缓存,最大问题两个并发的写操作会导致脏数据

如下图(以Redis和Mysql为例),两个并发更新操作,数据库先更新的反而后更新缓存,数据库后更新的反而先更新缓存。这样就会造成数据库和缓存中的数据不一致,应用程序中读取的都是脏数据。

 

 

 2:先删除数据库。再更新缓存。 逻辑错误,两个读和写的操作导致脏数据

如下图(以Redis和Mysql为例)。假设更新操作先删除了缓存,此时正好有一个并发的读操作,没有命中缓存后从数据库中取出老数据并且更新回缓存,这个时候更新操作也完成了数据库更新。此时,数据库和缓存中的数据不一致,应用程序中读取的都是原来的数据(脏数据)。

 

 

 

3:先更新缓存。再删除数据库。推荐使用这种方法。

但是这种方式理论上还是可能存在问题。如下图(以Redis和Mysql为例),查询操作没有命中缓存,然后查询出数据库的老数据。此时有一个并发的更新操作,更新操作在读操作之后更新了数据库中的数据并且删除了缓存中的数据。然而读操作将从数据库中读取出的老数据更新回了缓存。这样就会造成数据库和缓存中的数据不一致,应用程序中读取的都是原来的数据(脏数据)。

 

 但是,仔细想一想,这种并发的概率极低。因为这个条件需要发生在读缓存时缓存失效,而且有一个并发的写操作。实际上数据库的写操作会比读操作慢得多,而且还要加锁,而读操作必需在写操作前进入数据库操作,又要晚于写操作更新缓存,所有这些条件都具备的概率并不大。但是为了避免这种极端情况造成脏数据所产生的影响,我们还是要为缓存设置过期时间。

 

标签:缓存,数据库,redis,更新,并发,模式,操作,数据
From: https://www.cnblogs.com/Live-up-to-your-youth/p/16750047.html

相关文章

  • Redis详解
    Redis介绍1.Redis是一个基于内存的高性能key-value数据库。是完全开源免费的,用C语言编写的,遵守BSD协议2.Redis特点:1)Redis是基于内存......
  • Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器
    缓存穿透解决方案设置空值布隆过滤器优点可以将存在的缓存,位置设置为1,然后当不存在的参数过来的时候,会匹配到0上,这样就会直接返回不存在缺点存......
  • Redis的架构演进过程
    Redis架构演进一主二从这也是常用的架构,,MASTER用于写服务,SLAVE提供读服务但是存在弊端,就是主MASTER宕机后,SLAVE无法升级,导致无法提供写服务哨兵监控为了......
  • SpringBoot整合Redis[哨兵版]
    SpringBoot整合Redis[哨兵版]修改配置文件server:port:8080spring:application:name:redisredis:#host:192.168.247.141#port:6379......
  • Redis5.0.5 安装与配置
    哎,本来想的是10.1回家呢,结果突然本地多了一例的疫情,所以只能把票都退了,已经将近一年都没有回家,思念如泉~,只能静下心来继续学习, 路漫漫其修远兮吾将上下而求......
  • Redis的线程模型
      我觉得这个图就非常清晰,如果是懂BIO/Netty的人看起来应该很容易,是的没错Redis的线程模型就是基于多路复用器做的,采用非阻塞的IO模型,当前是6.x之前的版本,6.......
  • SpringBoot整合Redis[单机版]
    SpringBoot整合Redis[单机版]添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>......
  • 一文读懂Apache Geode缓存中间件
    目录一、对缓存中间件的诉求1.1我们为什么需要缓存中间件1.2缓存的分类1.1.1弱势缓存1.1.2强势缓存二、什么是ApacheGeode2.1ApacheGeode的架构......
  • redis-shake
    https://github.com/alibaba/RedisShake/wiki/%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7redis-shakeisatoolforRedisdatamigrationanddatafiltering.Feature......
  • Redis基本操作
    Redis数据类型:redis自身是一个map,其中所有数据都是采用key:vlue的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串redis所有的操作都......