当前位置:

首页 > 编程开发 > springboot缓存之redis整合的方法

springboot缓存之redis整合的方法

默认使用的是ConcurrentMapCacheManager的ConcurrentMapCache作为缓存组件。使用ConcurrentMap的时候,是将数据保存在ConcurrentMap当中的。实际在开发过程中,我们经常使用的,是一些缓存中间件的。比如我们经常使用的redis,memcache,包括我们使用的ehcache,等等,我们都是使用一些缓存中间件。我们之前讲解原理的时候,也发现了,springboot是支持很多的缓存配置的:如下图所示的:默认开始的配置的是:SimpleCacheConfi

    默认使用的是ConcurrentMapCacheManager的ConcurrentMapCache作为缓存组件。

    使用ConcurrentMap的时候,是将数据保存在ConcurrentMap当中的。

    实际在开发过程中,我们经常使用的,是一些缓存中间件的。

    比如我们经常使用的redis,memcache,包括我们使用的ehcache,等等,我们都是使用一些缓存中间件。

    我们之前讲解原理的时候,也发现了,springboot是支持很多的缓存配置的:

    如下图所示的:

    springboot缓存之redis整合的方法

    默认开始的配置的是:SimpleCacheConfiguration。

    其他的缓存是在什么时候开启呢?

    我们可以ctrl+n搜索一下,这些配置类,然后进去看看他们的conditional条件:

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    这些都是表示,当你导入了相应的包的时候,这些配置才会是生效的哦。

    整合redis作为缓存

    如果有不会redis这个技术的同学,尚硅谷当中有周阳老师发布的redis系列的讲解视频。或者大家可以最快地访问redis的官方网站,来进行学习,redis.cn是redis学习的中文网。

    安装redis

    搜索redis镜像

    springboot缓存之redis整合的方法

    这个是连接国外的仓库,速度是比较慢的。

    我们推荐使用docker 中国。

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    docker pull registry.docker-cn.com/library/redis

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    启动redis镜像

    docker run -d -p 6379:6379 --name myredis [REPOSITORY]
    docker ps

    为了测试,打开redis的连接工具。

    redis desktop manager

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    测试redis常用的数据操作

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    redis操作list

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    redis的set操作

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    引入redis的starter

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    配置redis

    springboot缓存之redis整合的方法

    简单说下redis原理

    我们引入了redis的starter之后,redisAutoConfiguration就起作用了。

    springboot缓存之redis整合的方法

    这个RedisAutoConfiguration是给容器当中加入了两个组件:

    springboot缓存之redis整合的方法

    给容器中加入的组件,一个是叫做RedisTemplate,一个是叫做StringRedisTemplate,两个东西。

    这两个东西就是用来操作redis的。

    这就跟大家以前用的jdbcTemplate一样,用来操作数据库的东西。

    这就是spring用来简化操作redis的两个template,如果在程序当中想要用这两个东西,就自动注入就可以了。

    springboot缓存之redis整合的方法

    redis测试

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    redis操作list:

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    redis测试保存对象

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    这些看不懂的玩意,全部都是序列化的结果。

    redisTemplate默认的序列化规则

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    默认的序列化器,就是使用的JdkSerializationRedisSerializer。

    默认的序列化器,就是使用的JDK的序列化器。

    我们来切换成json的序列化器,就可以了。

    redis配置

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    在测试类当中,自动注入我们自己配置的redisTemplate。

    springboot缓存之redis整合的方法

    然后我们再次测试保存对象。

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    这就说明了,我们的序列化器修改成功了。

    这就说明白了,如果我们后面要保存对象的时候,我们经常是要修改序列化器的。

    springboot缓存之redis整合的方法

    测试缓存

    springboot缓存之redis整合的方法

    我们之前使用的是ConCurrentMap的缓存管理器的。
    这个缓存管理器,帮我们来创建出来缓存组件的。
    缓存组件来实际给缓存中,进行CRUD的工作的。

    现在我们引入了redis之后,会发生什么样的效果呢?
    我们还是在application.properties当中将debug=true,这样就可以将自动配置报告来打开。
    这样的时候,我们重新启动我们的程序,在控制台当中,我们去搜索一下。
    看看是哪一个自动配置类,是生效的呢?

    springboot缓存之redis整合的方法

    原来默认开启的是:SimpleCacheConfiguration的。

    现在我们引入了redis相关的starters之后,程序默认开启的是RedisCacheConfiguration了。

    springboot缓存之redis整合的方法

    启动程序,直接进行测试就可以了。

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    说明第一次查询的时候,是查询数据库了。

    第二次查询的时候,控制台是没有任何输出的,说明是查询了缓存了。

    缓存默认是只有redis开启的。

    那么肯定是在redis当中了。

    我们可以查看一下:

    springboot缓存之redis整合的方法

    这个说明一个问题,在k和v都是object的时候,默认保存对象的时候,利用序列化来保存的。我们是想要让redis自动保存为json的。

    我们应该怎么做呢?

    我们先来分析一下这些过程当中的原理。

    1、我们是引入了redis的starter,所以我们的cachemanager变为了rediscachemanager了,

    2、默认创建的rediscachemanager在操作我们的数据的时候,传入了一个redistemplate的东西。

    springboot缓存之redis整合的方法

    3、这个redistemplate是redisautoconfiguration帮我们创建的。这个redistemplate默认使用的序列化机制是jdkserializationredisserializer的。这个就是相当于,redis默认给我们防止的redisCacheManager还不太符合我们的要求的。

    我们怎么办呢?

    我们应该自定义CacheManager的。

    自定义redisCacheManager

    springboot缓存之redis整合的方法

    这个时候,我们再启动项目,来进行测试,这个时候,我们就可以看到redis当中的结果,是我们想要的了。

    springboot缓存之redis整合的方法

    韫秋下次面试的时候,就可以问那些想要来软件园的人,说,你知道redis starter保存对象的时候,redisTemplate默认的序列化规则是什么吗?

    如果我们在使用redis的过程中,我们想要修改默认的序列化规则,我们应该怎么做呢?

    我们可以自定义redisCacheManager,然后自定义redisTemplate,在redisTemplate当中传入json相关的序列化器的哦。

    springboot缓存之redis整合的方法

    遗留的小问题

    数据库

    我们在数据库当中的,department表当中,放进去一条数据:

    springboot缓存之redis整合的方法

    mapper

    我们写一个对应的department操作的mapper。

    springboot缓存之redis整合的方法

    service

    我们再写一个对应的service

    springboot缓存之redis整合的方法

    controller

    springboot缓存之redis整合的方法

    启动项目测试

    springboot缓存之redis整合的方法

    然后我们看看redis当中,是否是有数据的呢?

    springboot缓存之redis整合的方法

    我们看了,redis当中dept相关的数据,是有的。

    我们第二次来查询dept的时候,就应该走缓存redis了。

    但是我们第二次去查询的,时候,出现了下面的错误。

    错误

    springboot缓存之redis整合的方法

    上面报错的意思就是说,不能够去读取json的。

    因为是要把部门的json对象,转换成为员工的json对象,这是不可以的。

    这个就是因为,我们放置的redisCacheManager是操作员工的。

    springboot缓存之redis整合的方法

    所以,现在我们看到的这个效果,就是很神奇的哦。

    缓存的数据,能够存入到redis当中。

    但是我们第二次从缓存中查询的时候,就不能够反序列化回来了。

    原来就是,我们存的是dept的json的数据,我们的cachemanager,默认是用employee的template来操作redis的。

    这个东西只能够将employee的数据反序列化过来的。

    解决错误

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    这个时候,就等于有了2个redisCacheManager了,我们用哪个呢?

    我们在service当中,是可以指定的。

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    然后我们重启项目,结果是报错了:

    springboot缓存之redis整合的方法

    如果,我们是有多个cacheManager的话,我们一定是要把某一个cacheManager作为,我们的默认配置的缓存管理器的。

    比如,我们可以进行下面的操作,来修复这个启动报错的内容的呢:

    springboot缓存之redis整合的方法

    重新启动进行项目测试

    这个时候,看看,我们在进行第二次部门查询的时候,能不能够正常地,成功地,从redis当中反序列化地读取到,我们的部门信息呢?

    springboot缓存之redis整合的方法

    springboot缓存之redis整合的方法

    这个时候,我们就发现,不管是员工还是部门,我们都是可以从redis当中反序列化成功查询的。

    这个就是很完美的啦。

    编码的方式操作缓存

    前面我们说的,全部都是使用注解的方式,来给缓存当中,来放置数据的。

    但是,在开发当中,我们经常会,遇到这样的情况。

    就是,我们开发进行到某个阶段,我们是需要将一些数据,放到缓存当中的。

    我们是需要,使用编码的方式,来操作缓存的。

    比如我们在查询出来了部门的信息之后,就希望把这个信息,放入到redis当中。

    我们可以把部门的cacheManager注入进来。

    springboot缓存之redis整合的方法

    然后我们在编码的过程中,可以通过操作这个cacheManager来获取缓存,

    然后,再操作缓存组件,来对数据进行增删改查。

    springboot缓存之redis整合的方法

    我们对上面的代码,启动项目进行测试,发现是可以的,是成功地给redis当中放进去了数据的:

    springboot缓存之redis整合的方法

    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    using namespace 使用中遇到的问题怎么解决
    using namespace 使用中遇到的问题怎么解决

    命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

    c语言函数递归 实操经验总结:这些技巧很实用
    c语言函数递归 实操经验总结:这些技巧很实用

    理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

    c语言函数递归 怎么选?常见方案对比分析
    c语言函数递归 怎么选?常见方案对比分析

    递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

    Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
    Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

    理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

    如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
    如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

    理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

    深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
    深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

    内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

    理解 native2ascii:Java 国际化开发中的字符编码工具
    理解 native2ascii:Java 国际化开发中的字符编码工具

    native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

    如何使用 native2ascii 转换中文字符为 Unicode 转义序列
    如何使用 native2ascii 转换中文字符为 Unicode 转义序列

    理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

    Java native2ascii 命令详解:解决属性文件乱码问题
    Java native2ascii 命令详解:解决属性文件乱码问题

    native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

    一个 memwatch 实战案例:定位野指针问题
    一个 memwatch 实战案例:定位野指针问题

    内存监控工具的价值与挑战在软件开发,尤其是使用C/C++这类手动管理内存的语言时,内存错误是程序员最常遭遇的难题之一。其中,野指针问题因其隐蔽性和破坏性,往往成为最难定位的“幽灵”缺陷。它可能潜伏在代码中,在特定条件下才被触发,导致程序崩溃、数据损坏或难以预测的行为。传统的调试手段,如打印日志或使用

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘
    Windows/macOS/iOS/Android

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。