SpringBoot集成Redis及SpringCache缓存管理

news2024/11/18 9:21:50

1.集成Redis

1.导入依赖

<!--spirngboot springdata对redis支持-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置信息

#数据源配置
spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    jedis:
      pool:
        max-wait: 2000ms
        max-active: 8

3.注入redisTemplate使用

@RunWith(SpringRunner.class)  //使用springboot2.6.13的版本可以省略这个注解
@SpringBootTest(classes = App.class) //如果测试类和启动不在同一个包下classes必须要写
public class SpringbootDataRedisApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test() throws Exception{
        redisTemplate.opsForValue().set("name","zs");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }
}

4.自定义配置redis中key和value的序列化

@Configuration
public class RedisConfig {

    // 注入Redis连接工厂
    @Resource
    private RedisConnectionFactory factory;

    /**
     * @Description: 自定义RedisTemplate对象注入Bean容器中
     * @Author: Neuronet
     * @Date: 2023/10/22 18:49
     **/
    @Bean
    public RedisTemplate<Object, Object> redisTemplate() {
        // 1.创建一个RedisTemplate对象
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        // 2.指定Redis连接工厂
        redisTemplate.setConnectionFactory(factory);
        // 3.创建一个JSON格式序列化对象,此处使用的是Redis自己的的序列化器
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        // 4.指定除开hash数据类型之外的数据key和value使用什么序列化器
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
        // 5.指定hash数据类型的key和value序列化器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(serializer);
        return redisTemplate;
    }
} 

2.SpringCahe缓存管理

1. SpringCache概述

Spring 3.1 引入了激动人心的基于注解(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(比如EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中加入少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果

Spring 的缓存技术还具备相当的灵活性。不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存暂时存储方案,也支持和主流的专业缓存比如 EHCache 集成

说人话:SpringCahce对缓存流程进行了简化封装,提供了一些注解,我们通过简单的打注解就能实现缓存的添加,修改,删除等,注解如下:

  • @Cacheable:触发缓存写入
  • @CacheEvict:触发缓存清除
  • @CachePut:更新缓存(不会影响到方法的运行)
  • @Caching:重新组合要应用于方法的多个缓存操作
  • @CacheConfig:设置类级别上共享的一些常见缓存设置

2.SpringCache大致原理

  • 1.Spring Cache利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了,做到了对代码侵入性做小。
  • 2.由于市面上的缓存工具实在太多,SpringCache框架还提供了CacheManager接口,可以实现降低对各种缓存框架的耦合。它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案,比如Caffeine、Guava Cache、Ehcache。

3.SpringCache注解

3.1. @Cacheable:写缓存
  • 方式一:@Cacheable可以用来进行缓存的写入,先也会根据缓存名和key去查询,如果没有查询到,自动将方法的返回结果存储在缓存中,以便于在后续调用的时候可以直接返回缓存中的值,而不必再执行实际的方法
@Cacheable(cacheNames=“books”,key=”’book1’”)   // books::book1
public Book findBook(ISBN isbn) {.
  //查询数据库
  return 数据;
}
  • 方式二:一个方法可以对应多个缓存名称
@Cacheable(cacheNames={“books”, “isbns”},key=”’book1’”)
public Book findBook(ISBN isbn) {..…}
  • 方式三@Cacheable的缓存名称是可以配置动态参数的,比如选择传入的参数,如下: (以下示例是使用SpEL声明,如果您不熟悉SpEL,可以阅读Spring Expression Language)
@Cacheable(cacheNames=“books”, key=“#isbn”) //参数值作为Key
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

  
@Cacheable(cacheNames=“books”, key=“#isbn.rawNumber”)
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
  • 方式四

@Cacheable还可以设置根据条件判断是否需要缓存

condition:取决于给定的参数是否满足条件
unless:取决于返回值是否满足条件(除非)

以下是一个简单的例子:key有默认的名字

@Cacheable(cacheNames=“book”, condition=“#name.length() < 32”) 
public Book findBook(String name)

@Cacheable(cacheNames=“book”,condition=“#name.length()<32”, unless=“#result.hardback”) 
public Book findBook(String name)
3.2. @CachePut:修改缓存

@CachePut:当需要更新缓存而不干扰方法的运行时 ,可以使用该注解。也就是说,始终执行该方法,并将结果放入缓存(已经有缓存就更新缓存),注解参数与@Cacheable相同。 以下是一个简单的例子:

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor) {
    
}

通常强烈建议不要对同一方法同时使用@CachePut和@Cacheable注解,因为它们具有不同的行为。可能会产生不可思议的BUG哦

3.3. @CacheEvict:删除缓存

@CacheEvict:删除缓存的注解,这对删除旧的数据和无用的数据是非常有用的。这里还多了一个参数(allEntries),设置allEntries=true时,可以对整个条目进行批量删除。 以下是个简单的例子:

@CacheEvict(cacheNames="books", key="'book1'") 
public void loadBooks(InputStream batch)

//对cacheNames进行批量删除
@CacheEvict(cacheNames="books", allEntries=true) 
public void loadBooks(InputStream batch)
3.4. @Caching:组合注解

@Caching在使用缓存的时候,有可能会同时进行更新和删除,会出现同时使用多个注解的情况。而@Caching可以实现。 以下是个简单的例子:

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)
3.5. @CacheConfig: 统一配置

@CacheConfig:缓存提供了许多的注解选项,但是有一些公用的操作,我们可以使用@CacheConfig在类上进行全局设置。 以下是个简单的例子:

@CacheConfig(cacheName="books") 
public class BookRepositoryImpl implements BookRepository {
    //注意:如果没有指定key的话,keyGenerator会自动生成key导致删除缓存失败,所以下面的缓存操作需要指定key
    @Cacheable(key="'book1'")
    public Book findBook(ISBN isbn) {...}
}

4.SpringCache实战

1.导入依赖
<!-- SpringCache依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.配置SpringCache集成redis
/**
 * @Description: SpringCache配置
 * @Author: Neuronet
 * @Date: 2023/10/22 19:32
 **/
@Configuration
public class CacheConfig extends CachingConfigurerSupport {

    @Resource
    private RedisConnectionFactory factory;

    @Bean
    @Override
    public CacheResolver cacheResolver() {
        return new SimpleCacheResolver(cacheManager());
    }

    @Bean
    @Override
    public CacheErrorHandler errorHandler() {
        // 用于捕获从Cache中进行CRUD时的异常的回调处理器。
        return new SimpleCacheErrorHandler();
    }

    //缓存管理器
    @Bean
    @Override
    public CacheManager cacheManager() {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                        .disableCachingNullValues() //不允许空值
                        .serializeValuesWith(RedisSerializationContext.SerializationPair
                                             //值使用JSON序列化
                                             .fromSerializer(new GenericJackson2JsonRedisSerializer()));
        return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
    }
}
3.开启springCache
在启动类注解:@EnableCaching
4.添加缓存

缓存注解不能加在内部方法上,比如:方法A调用方法B,给方法B加上缓存注解会失效,因为内部方法调用代理会失效,在A方法上打注解即可

//会先根据articleType::typeTree从redis获取,如果有直接用缓存的。如果没有就执行方法体的代码查询数据库
@Cacheable(cacheNames = "articleType", key = "'typeTree'")
public List<ArticleType> getTypeTree() {
    Object obj = redisTemplate.opsForValue().get("typeTree");
        if(obj == null){//redis没有
            List<ArticleType> typeTree = typeTree();
            redisTemplate.opsForValue().set("typeTree",typeTree);
            return typeTree;
        }
    return typeTree();
}

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

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

相关文章

基于SSM的高校实验室管理系统【附源码】

基于SSM的高校实验室管理系统&#xff08;源码L文说明文档&#xff09; 目录 4.系统设计 4.1 设计原则 4.2 功能结构设计 4.3 数据库设计 4.3.1 数据库概念设计 4.3.2 数据库物理设计 5.系统实现 5.1 管理员功能实现 5.1.1 实验室管理 5.1.2 实验课…

心理咨询展示网站建设渠道拓展

心理问题长期以来都受到关注&#xff0c;每个城市里也都有相关服务商家&#xff0c;除了进店外&#xff0c;线上也可以开展咨询服务&#xff0c;对需求者来说需要找到靠谱的品牌&#xff0c;而商家也需要触达到更多客户获取转化。 网站是品牌线上工具&#xff0c;利于商家通过…

C++黑暗迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; struct near {int i;int ia;int ix;int iy;int iwalk; }; v…

【无人机设计与控制】基于蚁群算法的三维无人机航迹规划+无人机路径规划

摘要 无人机航迹规划是无人机任务中至关重要的一部分&#xff0c;其目标是为无人机设计出一条安全、经济且高效的飞行路线&#xff0c;避开障碍物并达到指定目标。本文基于蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;&#xff0c;提出了一种三维空间中的无…

k8s搭建双主的mysql8集群---无坑

《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从&#xff0c;我们能理解到主节点只有1个&#xff0c;那么承担增删改主要还是主节点&#xff0c;如果你在从节点上去操作增删改操作&#xff0c;数据不会同步到其他节点。本章我们将实现多主&#xff08;双主&a…

引入Scrum激发研发体系活力

引言 在当今快速变化的技术环境中&#xff0c;IT企业面临着持续的市场压力和竞争&#xff0c;传统的瀑布式开发模式已经难以满足现代企业的需要。瀑布模型过于僵化&#xff0c;缺乏灵活性&#xff0c;导致项目经常延期&#xff0c;成本增加&#xff0c;最终可能无法达到预期效果…

【机器学习(十)】时间序列案例之月销量预测分析—Holt-Winters算法—Sentosa_DSML社区版

文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…

Chromium 设置页面打开系统代理源码分析c++

1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…

Java Statement SqlTemplate 源码分析

Java Statement SqlTemplate 源码分析 目录概述需求&#xff1a; 设计思路实现思路分析1. 概述2. 关键类3. 主要功能4. 源码结构5. 示例代码6. 性能考虑7. 常见问题8. 总结&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show y…

Meta AI 发布 Llama 3.2

Llama 3.2新闻 Meta公司在其Connect大会上宣布了Llama 3.2的发布&#xff0c;这是其首款能够理解图像和文本的旗舰视觉模型。Llama 3.2包含中型和小型两个版本&#xff08;分别拥有11B与90B参数&#xff09;&#xff0c;以及更轻量化的纯文本模型&#xff08;分别拥有1B与3B参数…

安全的价值:构建现代企业的基础

物理安全对于组织来说并不是事后才考虑的问题&#xff1a;它是关键的基础设施。零售商、医疗保健提供商、市政当局、学校和所有其他类型的组织都依赖安全系统来保障其人员和场所的安全。 随着安全技术能力的不断发展&#xff0c;许多组织正在以更广泛的视角看待他们的投资&am…

element plus block报错

解决&#xff1a; ::v-deep input[aria-hidden"true"] {display: none !important }

二叉树进阶oj题【二叉树相关10道oj题的解析和c++代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历&#xff0c;非递归迭代实现9.二叉树中序遍历 &…

日志工具spdlog全解析:理论、安装、使用与实践(C++)

文章目录 前言spdlog 与 glog spdlog介绍内容日志等级输出格式 使用步骤同步日志输出异步日志输出封装一个日志输出类对日志输出类的测试 安装 前言 在编写项目时&#xff0c;通过日志追踪程序错误或其他情况出现的位置是十分重要的&#xff0c;对于不太复杂的场景&#xff0c…

突发:Sam万字长文,OpenAI o1超越人类,o1模型训练原理、微调、能力来源-AI已死,大模型当立

OpenAl o1大模型&#xff1a;原理、突破、前景及影响 北京时间2024年9月13日凌晨&#xff0c;OpenAI正式发布了新的人工智能模型o1&#xff08;o是orion猎户座&#xff0c;1代表从头再来&#xff0c;也意味着后续将出现更多序列&#xff09;&#xff0c;就是此前OpenAI一直在高…

烟雾污染云层检测系统源码分享

烟雾污染云层检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

嵌入式学习--LinuxDay04

嵌入式学习--LinuxDay04 shell脚本 1.1数组 1.1.1数组的赋值 1.1.2数组的调用 1.2函数 1.2.1函数的定义方式 1.2.2函数的调用 2.分文件编程 2.1源文件 2.2头文件 3.编译工具 3.1 gcc编译工具 3.2 gdb调试 4.make工具 4.1定义 4.2Makefile格式 4.3Makefile管理多个文件 4.4Makef…

【笔记】X射线的衍射方向

X射线在晶体中的衍射&#xff0c;实质是大量原子散射波互相干涉的结果。 衍射花样有两个特征&#xff1a; 衍射方向&#xff08;衍射线在空间的分布规律&#xff09;&#xff1a;由晶胞的大小、形状和位向决定。 衍射强度&#xff1a;由原子的种类以及它在晶胞中所处的位置决…

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元&#xff08;GRU&#xff09;门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元&#xff08;GRU&#xff09; 之前我们讨论了如何在循环神经网络中计算梯…

PREDATOR: Registration of 3D Point Clouds with Low Overlap

Abstract 这篇文章介绍了一种新的点云配准模型-Predator。该模型专注于处理低重叠的点云对&#xff0c;它更加关注于重叠区域的处理&#xff0c;其新颖之处在于一个重叠的注意块&#xff0c;作用是用于两个点云的潜在编码之间的早期信息交换。该模型大大提高了低重叠场景下的配…