《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

news2024/10/5 21:20:00

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流,欢迎留言评论。👍

文章目录

    • 写在前面的话
    • 背景说明
    • 方案介绍
    • 具体实现
    • 总结陈词

写在前面的话

笔者所在公司由于存在大量业务场景,是借助Redis缓存实现的,因此缓存的健康状态对框架整体的影响较大。
针对这一问题,在框架封装过程中,采用了基于 Lettuce 事件总线实现的缓存容错策略和环境监测。
本篇博文鉴于此方案,展开描述,让我们絮絮道来。


背景说明

在高并发场景中,通常会引入Reids缓存机制,以此减轻数据库的查询压力,增加系统吞吐量。
例如,以Spring开发框架为例,开发者通常会选择采用@Cacheable等注解方式,便捷实现缓存的快速利用。
在传统的开发模式下,当Redis缓存宕机的时候,该注解所标注的方法会直接抛出异常,对功能调用方不太友好,并且针对缓存环境恢复的情况下,没有自动切换缓存策略的机制。开发人员往往要对单独接口进行缓存降级策略的编写,往往容易出现疏漏。开发者即使采用其他缓存客户端代码的使用方式,都不可避免的需要面对这个问题。
同时,由于Redis集群部署成本较高,部分企业并不会采用集群模式,往往不能保障Redis的高可用。
综上所述,Redis在宕机情况下的容错应对机制,是框架设计人员必须要考虑的。

【@Cacheable 技术简介】
@Cacheable 是 Spring 自带的注解,便捷操作缓存的。对于使用 @Cacheable 标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。

【关于缓存容错策略增强】
传统使用Cacheable注解Redis方法时,如果Redis服务器挂了,就直接抛出异常了,
java.net.ConnectException: Connection refused: connect
新框架对Spring的@Cacheable功能进行了增强,支持毫秒级故障自动降级与自动恢复已支持组件。


方案介绍

本方案通过自定义拓展 SpringRedisCacheManager 缓存处理器,设置不同环境的缓存处理策略,并且基于 LettuceEventBus 机制实现缓存环境监测和策略切换,以此增强单机模式下的 Redis容错性。通过这种方式,解决了传统缓存运用的弊端,开发人员可以正常使用@Cacheable,当缓存宕机的话,可以根据项目级配置,指定想要的缓存策略,比如按包装异常抛出策略、或执行原逻辑策略等。当缓存恢复的时候,会自动恢复切换到正常的缓存策略,不影响用户操作,切换不需要人工干预。当然,这一过程,对业务开发人员也是不需要特别关注的,开发人员只需要正常使用缓存场景,不需要为单独接口考虑缓存降级策略。同时,本方案支持采用延迟任务模式,不断确保缓存健康状态下缓存处理器的正确性,并做出相应响应。


具体实现

本方案自定义拓展缓存处理器,基于 Lettuce 的 EventBus 机制实现缓存环境监测和缓存策略切换。完成了对缓存宕机情况下,可以定制缓存容错策略。同时可以根据缓存环境的健康,自动切换缓存策略,增强了系统的稳定性,减少了人工运维成本。
本方案的缓存服务端不局限于Redis,缓存操作方式也不局限于Spring的@Cacheable方式,为方便理解,下文暂以这两种模式声明。
Step1、自定义缓存管理器,继承Spring自带的CacheManager,在其构造函数中,设置失败时的缓存处理器,成功时缓存处理器,当前激活缓存处理器等属性,并重写获取缓存的相关方法,同时新增同步缓存处理器的切换方法;
Step2、定义失败时缓存处理器,读取服务的项目级策略配置,示例代码如下,根据指定的缓存策略枚举,激活对应的缓存容错策略;

xxxx:
  cache:
    # degrade=自动降级
    # 当Redis服务出现故障时,不再查询Redis缓存,直接执行原有的方法逻辑
    # fail_fast=快速失败
    # 当Redis服务出现故障时,调用被标记了@Cacheable的方法将直接抛出 
    cache-fail-strategy: degrade  

Step3、同理,类似步骤2,定义成功时的缓存处理器;
Step4、在程序初始化的时候,利用Lettuce的客户端API,检查缓存当前健康状态,选择对应的缓存处理器为当前激活的缓存处理器;
Step5、在程序初始化的时候,利用Lettuce的EventBus事件总线监听机制,包含但不限于监听ConnectionActivatedEvent和ConnectionDeactivatedEvent等事件,并做出相应处理;
Step6、当监听到ConnectionDeactivatedEvent事件时,代表当前缓存状态异常,此时将触发步骤1的自定义缓存管理器的up方法,将失败时缓存处理器设定为当前激活状态,此时若逻辑执行到@Cacheable等注解方式标注的方法,将根据缓存容错策略,例如进行异常报错或直接执行原方法等;
Step7、当监听到ConnectionActivatedEvent事件时,代表当前缓存状态健康,此时将触发步骤1的自定义缓存管理器的down方法,将失败时缓存处理器设定为当前激活状态,此时若逻辑执行到@Cacheable等注解方式标注的方法,将继续正常优先从缓存加载数据;
Step8、同时,在事件监听逻辑中,利用ScheduledThreadPoolExecutor线程池的scheduleAtFixedRate方法,开启间隔延迟任务,不断检查缓存状态,确保上述缓存切换的准确性,并将结果输出日志;

缓存容错


总结陈词

上文介绍了博主所在公司采用的缓存容错策略方案,仅供参考。
从内容上看,主要是方案介绍(PS:因为是技术交底书口吻编写),有需要源代码的欢迎留言交流。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LinkedList底层原理

LinkedList特有方法 源码分析

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存,提前响应,降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

Python基础002

Python数据类型 1、字符串&#xff08;str&#xff09; str3 """I miss you so much""" print("str3 ", str3,type(str3)) str3 I miss you so much <class str>2、整数&#xff08;int&#xff09; str1 55 print(&quo…

什么是定时器?

前言&#x1f440;~ 上一章我们介绍了阻塞队列以及生产者消息模式&#xff0c;今天我们来讲讲定时器 定时器 标准库中的定时器 schedule()方法 扫描线程 手动实现定时器 任务类 存储任务的数据结构 定时器类 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&am…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

手机电脑能实现无缝共享的记事软件是什么

在这个信息爆炸的时代&#xff0c;记事软件已成为我们日常生活中不可或缺的工具。然而&#xff0c;我曾深深困扰于手机与电脑之间记事内容无法无缝共享的问题。 记得有一次&#xff0c;我在手机上匆匆记下了一个重要的想法&#xff0c;打算稍后在电脑上展开。但当我坐在电脑前…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

C语言的数据结构:图的操作

&#x1f6fa;图的遍历&#xff1a; 注意&#xff1a;在遍历的过程中&#xff0c;可能会出现 回路 ( 已经访问过的节点还要重新访问一次 ) \color{orange}回路(已经访问过的节点还要重新访问一次) 回路(已经访问过的节点还要重新访问一次). 当从A开始访问时&#xff0c;先访问…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

秒懂设计模式--学习笔记(4)【创建篇-工厂方法模式】

目录 3、工厂方法模式3.1 介绍3.2 工厂的多元化与专业化3.3 游戏角色建模(建模)3.4 简单工厂不简单(实例化、初始化)3.5 制定工业制造标准3.6劳动分工 3、工厂方法模式 3.1 介绍 程序设计中的工厂类往往是对对象构造、实例化、初始化过程的封装&#xff0c;而工厂方法&#x…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…

借教室(题解)

P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;二分前缀和 我们将和质检员那题差不多&#xff0c;只需要将候选人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…

精准检测,守护安全:可燃气体报警器检测范围探讨

随着工业化进程的加快&#xff0c;易燃易爆气体的使用日益普遍&#xff0c;其安全隐患也愈发凸显。可燃气体报警器作为一种重要的安全监测设备&#xff0c;能够在气体泄漏时及时发出警报&#xff0c;预防火灾和爆炸事故的发生。 在这篇文章中&#xff0c;佰德将对可燃气体报警…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

自动驾驶---Motion Planning之多段五次多项式

1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件

章节内容 上一节完成&#xff1a; HDFS的简介内容HDFS基础原理HDFS读文件流程HDFS写文件流程 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没留下…

从零开始学量化~Ptrade使用教程——安装与登录

PTrade交易系统是一款高净值和机构投资者专业投资软件&#xff0c;为用户提供普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘等各种交易工具&#xff0c;满足用户的各种交易需求和交易场景&#xff0c;帮助用户提高交易效率。 运行环境及安装 操作系统&…

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;滤波器组多载波)&#xff0c;是一种类似于OFDM的调制方式&#xff0c;用滤波器抑制子载波的旁瓣大小&#xff0c;使用FFT/IFFT或多相滤波器实现&#xff0c;其应用于5G的主要优势&#xff1a; 子载波信号带限&#xff0c;带外泄漏小…