热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)_java

这篇文章主要介绍了SpringBoot+SpringCache实现两级缓存(Redis+Caffeine),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价

1. 缓存、两级缓存

1.1 内容说明

Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明
springboot+spring cache:rediscache实现中的缺陷
caffeine简介
spring boot+spring cache实现两级缓存

使用缓存时的流程图

在这里插入图片描述

1.2 Sping Cache

spring cache是spring-context包中提供的基于注解方式使用的缓存组件,定义了一些标准接口,通过实现这些接口,就可以通过在方法上增加注解来实现缓存。这样就能够避免缓存代码与业务处理耦合在一起的问题。spring cache的实现是使用spring aop中对方法切面(MethodInterceptor)封装的扩展,当然spring aop也是基于Aspect来实现的。
spring cache核心的接口就两个:Cache和CacheManager

1.2.1 Cache接口

提供缓存的具体操作,比如缓存的放入,读取,清理,spring框架中默认提供的实现有

在这里插入图片描述

1.2.2 CacheManager接口

主要提供Cache实现bean的创建,每个应用里可以通过cacheName来对Cache进行隔离,每个CaheName对应一个Cache实现,spring框架中默认提供的实现与Cache的实现都是成对出现的

1.2.3 常用的注解说明

  • @Cacheable:主要应用到查询数据的方法上
  • @CacheEvict:清除缓存,主要应用到删除数据的方法上
  • @CachePut:放入缓存,主要用到对数据有更新的方法上
  • @Caching:用于在一个方法上配置多种注解
  • @EnableCaching:启用spring cache缓存,作为总的开关,在spring boot的启动类或配置类上需要加入次注解才会生效

2.实战多级缓存的用法

package com.xfgg.demo.config;

import lombok.AllArgsConstructor;
import com.github.benmanes.caffeine.cache.Caffeine;

import org.springframework.cache.CacheManager;

import org.springframework.cache.caffeine.CaffeineCacheManager;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Configuration
@AllArgsConstructor
//把定义的缓存加入到Caffeine中
public class CacheConfig {
    @Bean
    public CacheManager cacheManager(){
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                //使用refreshAfterWrite必须要设置cacheLoader
                //在5分钟内没有创建/覆盖时,会移除该key,下次取的时候从loading中取【重点:失效、移除Key、失效后需要获取新值】
                .expireAfterWrite(5, TimeUnit.MINUTES)
                //初始容量
                .initialCapacity(10)
                //用来控制cache的最大缓存数量
                .maximumSize(150)
        );
        return cacheManager;
    }
}

package com.xfgg.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

//生成的redis连接
public class RedisConfig {
    @Value("${spring.redis1.host}")
    private String host;
    @Value("${spring.redis1.port}")
    private Integer port;
    @Value("${spring.redis1.password}")
    private String password;
    @Value("${spring.redis1.database}")
    private Integer database;

    @Value("${spring.redis1.lettuce.pool.max-active}")
    private Integer maxActive;
    @Value("${spring.redis1.lettuce.pool.max-idle}")
    private Integer maxIdle;
    @Value("${spring.redis1.lettuce.pool.max-wait}")
    private Long maxWait;
    @Value("${spring.redis1.lettuce.pool.min-idle}")
    private Integer minIdle;


    @Bean
    public RedisStandaloneConfiguration redis1RedisConfig() {
        RedisStandaloneConfiguration cOnfig= new RedisStandaloneConfiguration();
        config.setHostName(host);
        config.setPassword(RedisPassword.of(password));
        config.setPort(port);
        config.setDatabase(database);
        return config;
    }
    //配置序列化器
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory){
        RedisTemplatetemplate=new RedisTemplate<>();
        //关联
        template.setConnectionFactory(factory);
        //设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化器
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
}

一个使用cacheable注解,一个使用redistemplate进行缓存
因为公司项目中用到的是jedis和jediscluster所以这里只是做个了解,没有写的很细


推荐阅读
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
author-avatar
卧龙先生八斗才
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有