SpringBoot实现Read Through模式

简介

Read Through模式通常是指一种缓存策略,其中当应用程序尝试读取数据时,缓存系统首先被检查以查看数据是否已经存在于缓存中。如果缓存中存在数据(即缓存命中),则直接从缓存中读取数据并返回给应用程序。如果缓存中不存在数据(即缓存未命中),则从底层的数据存储(如数据库)中读取数据,然后将数据加载到缓存中,最后再返回给应用程序。

这种模式的主要优点包括:

  1. 提高性能:通过减少对底层存储的直接访问次数,可以显著提高数据检索的性能。
  2. 减少延迟:缓存通常位于内存中,访问速度比磁盘存储快得多,因此可以减少数据检索的延迟。
  3. 减轻数据库负载:通过在缓存中存储频繁访问的数据,可以减少对数据库的查询压力,从而提高整个系统的吞吐量。

Read Through模式通常与Lazy Loading(懒加载)和Eager Loading(急加载)等策略相对比:

  • Lazy Loading:数据仅在需要时才加载,这可以减少不必要的数据加载,但可能会增加首次访问的延迟。
  • Eager Loading:预先加载数据,这可以减少首次访问的延迟,但可能会增加应用程序的内存使用和启动时间。

在实现Read Through模式时,可能需要考虑以下方面:

  • 缓存失效策略:确定何时从缓存中移除数据,例如基于时间(TTL)或基于空间(当缓存达到一定大小时)。
  • 并发控制:处理多个应用程序实例同时访问和修改缓存的情况。
  • 数据一致性:确保缓存中的数据与底层存储中的数据保持一致,特别是在数据更新时。

实现

在Spring Boot中实现Read Through模式,通常可以通过Spring Cache抽象来完成。Spring Cache提供了一个跨不同缓存实现的统一API,并且支持多种缓存解决方案,如EhCache、Hazelcast、Infinispan、Redis等。

  1. 添加依赖:首先,需要添加Spring Boot的缓存依赖和选择的缓存实现库(如Redis)

    <!-- Spring Boot Starter Cache -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    
    <!-- 以Redis为例,添加Redis的Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  2. 启用缓存注解:在Spring Boot的配置类上添加@EnableCaching注解,以启用缓存注解支持。

  3. 配置缓存管理器:配置一个或多个CacheManager,Spring Boot会自动配置一个简单的CacheManager,但你可以根据需要配置更复杂的缓存策略。

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.cache.RedisCacheConfiguration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    
    @Configuration
    public class RedisCacheConfig {
    
        @Bean
        public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer.json())))
    
    Map<String, RedisCacheConfiguration> customCacheConfigs = new HashMap<>();
    customCacheConfigs.put("mySpecialCache", 
        config.entryTtl(Duration.ofMinutes(15))); // 为特定缓存设置不同的过期时间
    
                    .disableCachingNullValues();
            return RedisCacheManager.builder(connectionFactory)
                    .cacheDefaults(config)
                // 在这里可以自定义添加缓存配置
                    .withInitialCacheConfigurations(customCacheConfigs)
                    .build();
        }
    }
  4. 使用缓存注解:在需要缓存的方法上使用@Cacheable注解来实现Read Through模式。如果缓存中没有数据,方法将被调用,结果将被缓存。
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    @Service
    public class MyService {
    
        @Cacheable(value = "myCache", key = "#id")
        public MyData getDataById(String id) {
            // 从数据库加载数据
            return myDataRepository.findById(id);
        }
    }
  5. 缓存键值:在@Cacheable注解中指定缓存的键值,这通常是基于方法参数的值。

  6. 缓存名称:指定缓存名称,这将用于区分不同的缓存域。

  7. 配置缓存参数:可以根据需要配置缓存的超时时间、条件、除非条件等

    1. value或cacheNames:指定缓存名称。可以指定一个或多个缓存名称,它们将用于存储缓存。

      @Cacheable(value = "myCacheName", key = "#id")
    2. key:定义缓存键值的生成策略。通常使用SpEL表达式(Spring Expression Language)来指定方法参数作为缓存键。

      @Cacheable(cacheNames = "myCache", key = "#id")
    3. condition:定义缓存的条件,只有满足条件时才进行缓存。

      @Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
    4. unless:定义不进行缓存的条件,与condition相反,用于排除某些情况。

      @Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
    5. keyGenerator:指定自定义的缓存键生成策略,如果需要更复杂的键生成逻辑,可以指定一个KeyGenerator的Bean名称。

      @Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
    6. cacheManager:指定使用哪个CacheManager,如果有多个CacheManager时使用。

      @Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
    7. expireAfterWrite:设置缓存项写入后过期时间(单位为毫秒)。这是一种常用的配置,用于定义缓存数据的生存时间。

      @Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
    8. expireAfterAccess:设置缓存项最后一次访问后过期时间,适用于缓存数据在最后一次被访问后多久过期。

    9. refreshAfterWrite:设置写入后多久刷新缓存,适用于动态刷新缓存的场景。

    10. sync:设置是否同步创建缓存项,防止并发环境下的竞态条件。

  8. 异常处理:确保处理缓存方法中可能抛出的异常,以避免影响应用程序的稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数仓]三、离线数仓(Hive数仓系统)

第1章 数仓分层 1.1 为什么要分层 DIM&#xff1a;dimensionality 维度 1.2 数据集市与数据仓库概念 1.3 数仓命名规范 1.3.1 表命名 ODS层命名为ods_表名DIM层命名为dim_表名DWD层命名为dwd_表名DWS层命名为dws_表名 DWT层命名为dwt_表名ADS层命名为ads_表名临时表命名为…

植物大战僵尸融合嫁接版 MAC 版本下载安装详细教程

继植物大战僵尸杂交版火了之后&#xff0c;PVZ改版可谓是百花齐放&#xff0c;最近又有一个非常好玩的模式被开发出来了&#xff0c;他们称为《植物大战僵尸融合嫁接版》 该版本并没有对植物卡牌做改动&#xff0c;而是可以将任意两种植物叠放到一起进行融合&#xff0c;产生新…

(附源码)springboot共享单车管理系统-计算机毕设 65154

springboot共享单车管理系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享单车管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了共享单车管理系…

ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头

特征 高性能多位 Delta-Σ 音频 ADC 102 dB 信噪比 -85 分贝 THDN 24 位&#xff0c;8 至 100 kHz 采样频率 I2S/PCM 主串行数据端口或从串行数据端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非标准音频系统时钟 低功耗待机模式 应用 麦克风阵列 智能音箱 远场语音捕获 订购…

桑基气泡图 – 5个维度展示KEGG通路富集结果

2022年发表在《Nature communication》上的文章Kir2.1-mediated membrane potential promotes nutrient acquisition and inflammation through regulation of nutrient transporters fig1i使用微生信平台绘制了一张图&#xff0c;我们将其命名为“桑基气泡图”。从此&#xff…

低代码和制造企业数字化转型成功的关系是什么

针对制造企业特别繁多的应用场景、特别大量的数据以及特别复杂的业务流程等特性&#xff0c;低代码能够更贴合制造企业的应用需求&#xff0c;更符合低代码平台为企业带来的价值&#xff0c;即(低代码平台)即服务。 用低代码与平台的融合力量搭建起企业敏捷的数字底座&#xff…

14-22 剑和远方2 - 深度神经网络中的学习机制

概论 在第一部分中&#xff0c;我们深入探讨了人工智能的兴衰简史以及推动人工智能发展的努力。我们研究了一个简单的感知器&#xff0c;以了解其组件以及简单的 ANN 如何处理数据和权重层。在简单的 ANN 中&#xff0c;不会对数据执行特定操作。ANN 中的激活函数是一个线性函…

Node.js_fs模块

文件删除 文件重命名和移动&#xff08;本质都是修改路径&#xff09; 文件夹操作 创建文件夹(mkdir) 读取文件夹(readdir) &#xff08;打印出来是该文件夹下名称的数组形式&#xff09; 读取当前的文件夹(readdir) 删除文件夹 &#xff08;rmdir&#xff09; 查看资源状态…

一家虚拟电厂繁忙的一天

早晨&#xff1a;准备与监控 7:00 AM - 起床与检查 虚拟电厂&#xff08;VPP&#xff09;团队的成员早起&#xff0c;开始检查电力系统的状态和最新的市场动态。使用专用的监控软件&#xff0c;查看分布式能源资源&#xff08;DERs&#xff09;的实时数据&#xff0c;包括太阳…

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天&#xff0c;我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看&#xff0c;我们首先要带着大家明白Linux网络的一些名词的概念&#xff0c;为之后的学习扫清障碍。然后我…

MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器)

概述 MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL主主复制管理器&#xff09; MMM是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理 MySQL Master-Master &#xff08;双主&#xf…

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…

GD 32中断系统实现

1.0 中断的概念 中断&#xff1a;简单来说就是打断的意思&#xff0c;在计算机系统中CPU在执行一个操作的时候&#xff0c;有一个比当前任务更为紧急的任务需要执行,cpu暂停当前任务转而去执行更为紧急任务的操作&#xff0c;执行完更为紧急任务之后再返回来执行原来未执行完的…

美股交易相关知识点 持续完善中

美股交易时间 美东时间&#xff1a;除了凌晨 03:50 ~ 04:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可以交易的。 如果是在香港或者北京时间下交易要区分两种: 美东夏令时&#xff1a;除了下午 15:50 ~ 16:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可…

1012-27SF 同轴连接器

型号简介 1012-27SF是Southwest Microwave的2.92 mm连接器。该连接器使用不锈钢合金外壳和镀金接触表面提供了良好的耐腐蚀性和耐磨损性&#xff0c;延长了连接器的使用寿命。适用于高频应用&#xff0c;最高可达 40 GHz&#xff0c;使其适用于微波和射频通信、雷达系统等领域。…

14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B

利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展&#xff0c;LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而&#xff0c;这些模型的庞大规模给其部署和实际使用带来了巨大挑战&#xff0c;尤其是在资源受限的设备上&#xff0c;例如内存…

pnpm介绍

PNPM 是一个 JavaScript 包管理器&#xff0c;类似于 npm 和 Yarn。它的全称是 "Performant npm"&#xff0c;主要设计目标是优化包的安装和管理过程&#xff0c;以提升速度和效率。PNPM 的主要特点包括&#xff1a; 符号链接&#xff08;Symlink&#xff09;&#x…

数据结构--二叉树相关题2(OJ)

1.比较对称二叉树&#xff08;镜像二叉树&#xff09; 二叉树相关题1中第二题的变形题。先去看1哦&#xff01; 左子树和右子树比较 bool _isSymmetric(struct TreeNode* p, struct TreeNode* q) {if (p NULL && q NULL)return true;//如果两个都为空则是相等的if …

【WEB前端】---HTML---结构---笔记

目录 1.标签---单标签和双标签 1.1单标签 1.2双标签 2.基本结构标签 2.1HTML标签 2.2文档头部标签 2.3文档标题标签 2.4文档的主题标签 3.常用的标题标签 (n∈[1,6]) 4.段落标签 5.换行标签 6.文本格式化标签 6.1粗体 6.2倾斜 6.3删除线 6.4下划线 7.div和spa…

Android:自定义View

一、简介 点击查看创建自定义视图组件中文官网 Android 提供了一个复杂而强大的组件化模型&#xff0c;用于基于基本布局类 View 和 ViewGroup 构建界面。该平台包含各种预构建的 View 和 ViewGroup 子类&#xff08;分别称为 widget 和布局&#xff09;&#xff0c;可供您用来…