Redis三种常用的缓存读写策略步骤详解

目录
  • 一、Redis三种常用的缓存读写策略
  • 二、旁路缓存模式(Cache Aside Pattern)
    • 读写步骤
      • 写:
      • 读:
    • 自我思考
    • 缺点
  • 三、读写穿透(Read/Write Through Pattern)
    • 读写步骤
      • 写:
      • 读:
  • 四、异步缓存写入(Write Behind Pattern)

一、Redis三种常用的缓存读写策略

Redis有三种读写策略分别是:旁路缓存模式策略、读写穿透策略、异步缓存写入策略。

这三种缓存读写策略各有优势,不存在最佳,需要我们根据实际的业务场景选择最合适的。

二、旁路缓存模式(Cache Aside Pattern)

旁路缓存模式是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。

旁路缓存模式中服务端需要同时维护DBCache,并且是以DB的结果为准。

读写步骤

写:

  • 先更新DB
  • 然后直接删除cache

如下图:

读:

  • cache中读取数据,读取到就直接返回。
  • cache中读取不到的话,就从DB读取返回。
  • 再把数据写到cache中。

如下图:

自我思考

思考这样子的一个问题:“如果在写数据的过程中,可以先删除cache,再更新DB吗?

答案: 答案肯定是不行的,因为这样子可能造成数据库和缓存数据不一致的问题,比如这个时候有一个数据在DB和缓存都为100,请求1需要将这个数据更新写成200,如果先删除换出再更新数据库的话,在请求1已经删除缓存但是数据库还没写完的时候,有一个请求2读取数据,首先去缓存读取,发现缓存被删除了,然后去数据库读取得到100(这个时候请求1还没写完)再写入缓存,这个时候请求1写完了,这个时候数据库里数据为200,缓存里为100,不一致。

可以简单描述为:

请求1先把cache中的数据删除 -> 请求2从DB中读取数据 -> 请求1再把DB中的数据更新

紧接着思考:“在写数据的过程中,如果先写BD,再删除cache就不会造成数据不一致了吗?

答案: 理论上来说还是会出现数据不一致的问题,不过概率很小,因为缓存的写入速度是比数据库写入速度快很多。

比如请求1先读数据A,请求2随后写数据A,并且数据A不在缓存中存在的话就会去数据库读取,读取完请求2再更新完并删除缓存,然后请求1把数据A写入缓存,这个时候数据库和缓存就不一致了。

这个过程可以简单的描述为:

请求1从DB读取数据A -> 请求2写更新数据A到数据库再删除cache中的A数据 -> 请求1将数据A写入缓存

缺点

  • 首次请求的数据一定不在cache的问题

    解决办法:可以将热点数据提前写入cache中。

  • 写操作比较频繁的话导致cache中的数据会被频繁的删除,这样会影响缓存命中率。

    解决办法:

    • 数据库和缓存强一直场景:更新DB的时候同样更新cache,不过需要加一个锁/分布式锁来保证更新cache的时候不存在线程安全问题。
    • 可以短暂的允许数据库和缓存数据不一致的场景:更新DB的时候同样更新cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。

三、读写穿透(Read/Write Through Pattern)

读写穿透中服务端把cache视为主要数据存储,从中读取数据并将数据写入其中。cache服务负责将此数据读取和写入DB,从而减轻应用程序的职责。

读写步骤

写:

  • 先查cachecache中不存在,直接更新DB
  • cache中存在,则先更新cache,然后cache服务自己更新DB(同时更新DBcache)。

如下图:

读:

  • 先从cache中读取数据,读取到直接返回。
  • cache中读取不到,则先从DB加载写入到cache后返回响应。

如下图:

读写穿透实际是在旁路缓存之上进行了封装。在旁路缓存下,发生读请求的时候,如果cache中不存在对应的数据,是由客户端自己负责把数据写入cache,而读写穿透则是cache服务自己来写入缓存,这对客户端是透明的。

和旁路缓存一样,读写穿透也存在首次请求数据一定不在cache中的问题,对于热点数据可以提前写入缓存中。

四、异步缓存写入(Write Behind Pattern)

异步缓存写入和读写穿透很相似,两者都是由cache服务来负责cacheDB的读写。

两者最大的不同点就是:读写穿透是同步更新DBcache,而异步缓存写入则是只更新cache,不直接更新DB,而是改为异步批量的方式更新DB

很明显,这种方式对数据一致性带来了更大的挑战,比如cache数据可能还没异步更新DBcache服务可能就挂了。

这种策略在我们平时开发过程中也非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQLInnoDB Buffer Pool机制都用到了这种策略。

异步缓存写入的写性能非常高,非常适合写数据经常变化又对数据一致性要求没那么高的场景下使用,比如浏览量、点赞量等。

参考:javaguide.cn/database/re…

到此这篇关于Redis三种常用的缓存读写策略的文章就介绍到这了,更多相关Redis缓存读写策略内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Redis缓存常用4种策略原理详解

    我们都知道,提高系统性能的最简单也最流行的方法之一其实就是使用缓存.我们引入缓存,相当于对数据进行了复制.每当系统数据更新时,保持缓存和数据源(如 MySQL 数据库)同步至关重要,当然,这也取决于系统本身的要求,看系统是否允许一定的数据延迟. 最常见的几种缓存策略.它们的优缺点以及使用场景,分别是: Cache-Aside Read-Through Write-Through Write-Behind Cache-Aside 策略 Cache-Aside可能是最常用的缓存策略.在这种策略下,应

  • 缓存替换策略及应用(以Redis、InnoDB为例)

    1 概述 在操作系统的页面管理中,内存会维护一部分数据以备进程使用,但是由于内存的大小必然是远远小于硬盘的,当某些进程访问到内存中没有的数据时,必然需要从硬盘中读进内存,所以迫于内存容量的压力下迫使操作系统将一些页换出,或者说踢出,而决定将哪些(个)页面踢出就是内存替换策略. 我们考虑内存中的页实际上是整个系统页的子集,所以内存可以当成系统中虚拟内存的缓存(Cache),所以页面置换算法就是缓存替换的方法. 一般意义下,选取页面置换算法即选取一个缓存命中率更高的或者说缺页率更低的算法,但实际上有

  • 浅谈Redis缓存有哪些淘汰策略

    目录 Redis过期策略 定时删除 惰性删除 定期删除 Redis的内存淘汰机制 LRU和LFU的区别 LRU LFU Redis重启如何恢复数据呢? 总结 Redis过期策略 我们首先来了解一下Redis的内存淘汰机制. 定时删除 概述     redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除.注意这里是随机抽取的.为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会

  • Redis三种常用的缓存读写策略步骤详解

    目录 一.Redis三种常用的缓存读写策略 二.旁路缓存模式(Cache Aside Pattern) 读写步骤 写: 读: 自我思考 缺点 三.读写穿透(Read/Write Through Pattern) 读写步骤 写: 读: 四.异步缓存写入(Write Behind Pattern) 一.Redis三种常用的缓存读写策略 Redis有三种读写策略分别是:旁路缓存模式策略.读写穿透策略.异步缓存写入策略. 这三种缓存读写策略各有优势,不存在最佳,需要我们根据实际的业务场景选择最合适的.

  • Linux Redis 的安装步骤详解

     Linux Redis 的安装步骤详解 前言: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询. redis 是完全开源免费的,是一个高性能的key-value数据库.Re

  • laravel使用Redis实现网站缓存读取的方法详解

    redis的简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. Redis 优势 性能极高 – Red

  • SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)

    第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互.不熟悉真的折腾了好久,现在总结一下学习过程: 第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本.在网上海搜了一把,能找到的有点相关的寥寥无几. 有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现基于命令行调试的交互界面,输入调试命令去调试脚本.如下: 在终端输入命令:redis-cli.exe --ldb --eval LimitLoadTi

  • go实现Redis读写分离示例详解

    目录 我们为什么需要了解RESP协议? 什么是RESP协议 RESP协议规范 如何使用该协议请求Redis 使用go编写Redis中间件实现读写分离 总结 我们为什么需要了解RESP协议? 本篇文章目的为探究RESP协议,而非编写读写中间件,这点要清楚. 关于这个问题,我想通过一个实例来解释,我们编写Redis中间件,为什么需要了解RESP协议. 以上代码是编写了一个非常简单的TCP服务器,我们监听8888端口,尝试使用redis-cli -p 8888连接服务器后,而后查看打印出来的应用层报文

  • Spring Boot整合EhCache的步骤详解

    本文讲解Spring Boot与EhCache的整合. 1 EhCache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 2 Spring Boot整合EhCache步骤 2.

  • Windows上CLion的配置步骤详解

    一 概述 下载CLion 二 免费使用策略 1. 通过免费试用30天福利,30天福利时间过后,通过清除个人电脑缓存,继续享受福利 2. 通过学生证.教师证或者edu邮箱获取,在校学生的福利: 3. 也可以通过自己的开源项目来进行申请,这个对于初学者要求比较高: 二 配置本地C编译工具MinGW 在配置Clion的环境之前,我们需要在Windows系统上安装编译工具MinGW 根据我的博客进行安装配置:使用MinGW使Windows通过gcc实现C或C++程序本地编译执行 三 配置Clion开发环

  • Rainbond云原生快捷部署生产可用的Gitlab步骤详解

    目录 Gitlab简介 准备工作 部署步骤 部署Postgresql组件 部署Redis组件 部署Gitlab-Server组件 配置网关访问策略 FAQ Gitlab简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释.同时Gitlab集成了一系列的CI功能.不得不说,Gitlab在企业中是的使用率非常高. Rainbond非常推荐

  • mysql 5.7.20解压版安装方法步骤详解(两种方法)

    我来讲解下window64位下MySQL的安装,MySQL是在5.7开始安装版就只有32位下载服务了,这里我讲解解压版的MySQL如何安装,在安装MySQL解压版时对于新手的小编来说也是头疼得很,各种问题各种来没有安装版的一键轻松搞定的方便,安装时需要注意三点:1.路径配置,2.安装时MySQL端口被占用这时需要关闭被占用端口,3.cmd必须是在管理员环境下设置MySQL信息. MySQL官网: https://www.mysql.com/downloads/ http://www.jb51.n

  • 使用Redis有序集合实现IP归属地查询详解

    工作中经常遇到一类需求,根据 IP 地址段来查找 IP 对应的归属地信息.如果把查询过程放到关系型数据库中,会带来很大的 IO 消耗,速度也不能满足,显然是不合适的. 那有哪些更好的办法呢?为此做了一些尝试,下面来详细说明. 构建索引文件 在 GitHub 上看到一个ip2region 项目,作者通过生成一个包含有二级索引的文件来实现快速查询,查询速度足够快,毫秒级别.但如果想更新地址段或归属地信息,每次都要重新生成文件,并不是很方便. 不过还是推荐大家看看这个项目,其中建索引的思想还是很值得学

随机推荐