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

📢 大家好,我是 【战神刘玉栋】,有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.rhkb.cn/news/367141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野 flyfish 在卷积神经网络(CNN)中,可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的…

用MySQL+node+vue做一个学生信息管理系统(一):配置项目

先用npm init -y生成配置文件 在项目下新建src文件夹,app.js文件。src目录用来放静态资源文件,app.js是服务器文件,index.js是vue的入口文件 使用npm install express下载express框架 在app.js文件夹开启node服务,监听的端口为…

鸿蒙开发设备管理:【@ohos.multimodalInput.touchEvent (触摸输入事件)】

触摸输入事件 设备上报的触屏事件。 说明: 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import {Action,ToolType,SourceType,Touch,TouchEvent} from ohos.multimodalInput.touchEvent;…

FL Studio 21.0.3.3517中文破解版2024最新Keygen免费下载安装激活教程

你们是否也是音乐制作爱好者呢?如果是,那就仔细阅读文章收集对自己有帮助的操作技巧吧~~ FL Studio 21.2.3 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 .2.3Mac-安装包下载如下: https://wm.makeding.com/iclk/?…

【GD32F303红枫派使用手册】第二十八节 USB-虚拟串口实验

28.1 实验内容 通过本实验主要学习以下内容: CDC虚拟串口协议原理及使用 CDC虚拟串口通信操作 28.2 实验原理 USB的CDC类是USB通信设备类 (Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备使用的USB子类。该设备类采用批量传输…

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛,以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景,可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展,我们可以期待在未来看到更多创新应用。北京木奇移…

Linux中的库

什么是库? 库是一组预先编译好的方法/函数的集合,其他程序想要使用源文件中的函数时,只需在编译可执行程序时,链接上该源文件生成的库文件即可。 库分为两类:静态库和动态库 在Linux系统中,以.a为后缀的…

day09了 加油

浅拷贝 指向同一个地址空间 右边不可取地址 左边一定是到了具体的位置 右值引用std&#xff1a;&#xff1a; move 相信大家默认构造函数都没有问题&#xff0c;所以就不贴例子了 浅拷贝构造函数 只负责复制地址&#xff0c;而不是真的把完整的内存给它 #include <iostre…

Nginx主配置文件---Nginx.conf

nginx主配置文件的模块介绍 全局块&#xff1a; 全局块是配置文件从开始到 events 块之间的部分&#xff0c;其中指令的作用域是 Nginx 服务器全局。主要指令包括&#xff1a; user&#xff1a;指定可以运行 Nginx 服务的用户和用户组&#xff0c;只能在全局块配置。例如&…

怎么解决C++不支持字符串枚举?

首先&#xff0c;有两种方法&#xff1a;使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性&#xff0c;运行时发现错误高 - 编译期类型检查&#xf…

基于正点原子FreeRTOS学习笔记——时间片调度实验

目录 一、时间片调度介绍 二、实验演示 1、宏修改 1.1、滴答定时器宏 1.2、调度器宏 2、实验程序 2.1.1、任务1&#xff0c;任务2不加临界区程序 2.1.2 实验现象 2.2.1、任务1&#xff0c;任务2加临界区程序 2.2.2 实验现象 一、时间片调度介绍 时间片&#xff1a;同…

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…

vue+element-ui简洁完美实现个人博客“​响石潭 ​”

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.生活 ​编辑 4.文章详情 ​编辑 5.关于我 ​编辑 ​编辑 三、源码实现 1.项目依赖package.json 2.项目启动 3.首页源码 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 参考官网&#xff1…

数据库操作语言(DML)

数据库操作语言&#xff08;DML&#xff09; 文章目录 数据库操作语言&#xff08;DML&#xff09;一、四种操作二、数据的插入&#xff08;增&#xff09;三、数据的删除&#xff08;删&#xff09;四、数据的修改&#xff08;改&#xff09;五、数据的查询&#xff08;查&…

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…

如何理解MySql的MVCC机制

MVCC是什么 MySQL的MVCC机制&#xff0c;全称为多版本并发控制&#xff08;Multi-VersionConcurrency Control&#xff09;&#xff0c;是一种提高数据库并发性能的技术。MVCC的主要目的是在保证数据一致性的同时&#xff0c;提高数据库的并发性能。 它通过为每个读操作创建数…

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕&#xff0c;又一批新鲜血液即将注入大学校园。面对陌生的环境&#xff0c;如何快速适应、准确找到目标地点&#xff0c;成为新生们的一大难题。同时&#xff0c;对于学校而言&#xff0c;如何向报考人员直观展示校园环境&#xff0c;提供沉浸式参观体验&#xf…

Vue跨域获取ip和ip位置城市等归属地信息

由于端口设置与查询服务器不一致&#xff0c;所以不能直接从ip138网上抓取&#xff0c;只能跨域查询。实现跨域查询&#xff0c;简单的方法是使用jsonp方式&#xff0c;只支持get请求&#xff0c;同时也需要查询的服务器支持jsonp。这时找到了腾讯位置服务。参考文章&#xff0…

第 27 篇 : 搭建maven私服nexus

官网文档 1. 下载应该很慢, 最好是能翻墙 nexus-3.69.0-02-java8-unix.tar.gz 2. 上传到/usr/local/src, 解压及重命名 tar -zxvf nexus-3.69.0-02-java8-unix.tar.gz rm -rf nexus-3.69.0-02-java8-unix.tar.gz mv nexus-3.69.0-02 nexus ls3. 修改配置 cd /usr/local/sr…

2024最新版Redis常见面试题包含详细讲解

Redis适用于哪些场景&#xff1f; 缓存分布式锁降级限流消息队列延迟消息队 说一说缓存穿透 缓存穿透的概念 用户频繁的发起恶意请求查询缓存中和数据库中都不存在的数据&#xff0c;查询积累到一定量级导致数据库压力过大甚至宕机。 缓存穿透的原因 比如正常情况下用户发…