Redis:代码实战之旁路缓存

2023-10-10 21:10

本文主要是介绍Redis:代码实战之旁路缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 【关于作者】
  • 1.(应用中)缓存的特征
  • 2.Redis作为旁路缓存的操作
    • 2.1.缓存的两种类型
      • 2.1.1.只读缓存(Cache Aside策略):
      • 2.2.2.读写缓存
    • 2.2.Redis可以作为哪些缓存使用?
    • 2.3.读写缓存发现缓存更新或数据库更新失败如何处理?

【关于作者】

关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(https://0522-isniceday.top/)联系我

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCPi0cze-1681039698870)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke/旁路缓存.png)]

1.(应用中)缓存的特征

  • 在一个层次化的系统中,缓存一定是一个快速子系统
  • 缓存系统的容量大小总是小于后端慢速系统的,不可能将所有数据都放置于缓存中,并且缓存中的数据需要按照一定的规则淘汰

2.Redis作为旁路缓存的操作

旁路缓存:读取缓存、读取数据库和更新缓存的操作都在代码中完成,redis只是一个独立的系统软件,也可以用来作为旁路缓存的一个选择

但是当一个系统引入缓存时,需要面临最大的问题就是,如何保证缓存和后端数据库的一致性问题,最常见的3个解决方案分别是Cache Aside、Read/Write Throught和Write Back缓存更新策略,也就是下面所描述的两张缓存类型

2.1.缓存的两种类型

只读缓存能够加速读的速度,读写缓存提供两种写回策略,并能够加速读写的速度

2.1.1.只读缓存(Cache Aside策略):

概念:redis作为读缓存时,会将写请求直接打向数据库,并且在操作完数据库之后,会从缓存中删除写请求的数据。当客户端读取该数据时发现数据缺失,则会再次将数据同步入缓存

优点:由于数据都持久化到了底层数据库,因此能够保证数据不丢失,数据能够保证一致性。当我们需要缓存图片、短视频这些用户只读的数据时,就可以使用只读缓存这个类型了。这种策略是我们在开发软件时最常用的,在使用Memcached或Redis时一般都采用这种方案

缺点:写操作会让缓存失效,再次读取时需要从数据库中加载。

img

2.2.2.读写缓存

概念:除了读请求会直接从缓存中读取之外,写请求包括增删改也是在缓存中完成。

两种回写策略

  • 同步直写:

    写请求缓存执行之外,也会发送给后端库,等两者都写入完毕才返回客户端。这样即便宕机,也能保证数据的可靠性,不过会降低缓存的访问性能。

    优点:对于应用层的使用非常友好,只需要操作缓存即可

    缺点:高并发下的同步直写可能会发生缓存和数据库不一致的情形,由于写入数据库后写入缓存操作存在竞态条件(更新覆盖,由于请求数据库可能先请求后返回),需要配合分布式锁。

  • 异步写回策略:

    所有写请求现在缓存处理,等增改的数据被从缓存中淘汰时,将需要淘汰的数据写入后端数据库。

    优点:写操作飞快,只有当缓存满了数据淘汰时才会将脏数据写回数据库

    缺点:如果缓存宕机了或异常了,数据又没有写回数据库,则会有数据丢失的风险

    img

关于是选择只读缓存,还是读写缓存,主要看我们对写请求是否有加速的需求。

  • 如果需要对写请求进行加速(例如秒杀等),我们选择读写缓存;
  • 如果写请求很少,或者是只需要提升读请求的响应速度的话,我们选择只读缓存。

2.2.Redis可以作为哪些缓存使用?

  • 只读缓存:写操作直接写入数据库,下次读如果出现数据确实则更新缓存
  • 读写缓存之同步直接:读请求直接请求缓存,写请求同时写数据库和redis,但是这里会存在并发问题,需要配合分布式锁
  • 读写缓存之异步写回策略:这种方式redis无法采取,因为redis再数据淘汰的时候代码无法嵌入同步脏数据的操作,所以无法采取。

2.3.读写缓存发现缓存更新或数据库更新失败如何处理?

还有一个问题就是操作缓存或数据库发生异常时如何处理?例如缓存操作成功,数据库操作失败,或者反过来,还是有可能会产生不一致的情况:

  • 根据业务制定好更新场景的顺序,或者给缓存设置较短的过期时间来降低不一致的时间
  • 如果需要保证强一致性,则需要涉及到分布式事务,常见的解决方案包括:两阶段提交(2PC)、三阶段提交(3PC)、TCC、消息队列等方式(具体见文章:)

这篇关于Redis:代码实战之旁路缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183112

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例