自定义 CacheManager |学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 快速学习自定义 CacheManager

开发者学堂课程【SpringBoot 快速掌握 - 高级应用:自定义 CacheManager】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/613/detail/9297


自定义 CacheManager

内容介绍:  

一、缓存数据的原理

二、员工的数据缓存

三、部门的数据查询及缓存

四、用编码的方式获取缓存数据


一、缓存数据的原理

CacheManager===Cache 缓存组件给实际缓存存取数据。将自动配置的报告打开,启动整个应用,自动配置报告里有许多缓存配置类,默认开启的是 simpleCacheConfiguration ,引入 Redis 后搜素,

发现RadisCacheConfiguration 可以匹配上,而 simpleCacheConfiguration 不会匹配上,这是因为 simpleCacheConfiguration 起作用的条件是容器中没有 Cachemanager 。引入 redis 以后,相应的条件就满足了,RedisTemplate也可以使用了。

Redis配置中如果没有 Cachemanager ,就相当于完成判断并在容器中放置一个缓存管理器(RedisCachemanager)。


二、员工的数据缓存

1、引入 redis 的 starter  

容器中保存的是 RediscacheManager;

2、RedisCacheManager 创建 RedisCache  

RedisCache作为缓存组件,通过操作 redis 缓存数据;

3、默认保存数据 k-v 都是 object:利用序列化保存

启动应用进行测试,缓存1号员工的信息,发出请求 emp1 ,第一次查询一号员工,此时控制台打印了 SQL 语句,表明查询了数据库,刷新后再次查询发现没有查询数据库,说明已经缓存了,且存在于 redis 中,在 redis 中显示的是序列化后的结果。

4、自动保存为 json 数据

引入 redis 的 starter ,cacheManager 变为 redisCacheManager。redisCacheManager 是由 redisConfiguration 创建的,默认创建的redisCacheManager 操作 redis 的时候使用的是 RedisTemplate<0bject, 0bjec> ,而 RedisTemplate<0bject, 0bjec> 利用 redis auto configuration 创建的,它默认使用的序列化机制是 JDK 。

5、自定义 CacheManager

在 redis 配置创建一个 CacheManager。输入 public redisCacheManager ,称作employeeCacheManager,在 redisCacheConfiguration 中新建一个redisCacheManager,即可将自定义的 CacheManager 放在容器中。

将 template 传进来,在配置类里将新建内容复制过来,再输入 return CacheManager 即可。

通过观察可以发现系统默认缓存管理器的条件是没有 CacheManager ,而我们创建的含有 CacheManager ,启动并刷新后查询员工一号张三,

第一次查询了数据库,

刷新后第二次没有查数据库,在 redis 里发现 emp 中有一个前缀 emp:1 ,它的值是通过 json 的方式序列化过来的,这个前缀是因为默认使用的是传输参数(ID)值,而在这里配置了 redisCacheManager ,我们设置了一个使用前缀,这样就会默认将 Cache name 作为 key 的前缀。


三、部门的数据查询及缓存

1、部门数据查询

创建 Deptservice,引用 @Service,写一个查询方法,把 DepartmentMapper  注入进来,让它来操作数据库。

通过 public Department getDepById 传入 Integer ID,创建并调用 DepartmentMapper.getDepById,

创建出来以后要标记上 SQL 语句 @Select("SELECT * FROM department WHERE id = #{id}"), Service 中将查询结果返回到 department 中。

2、部门数据缓存

标记可缓存的注解 @Cacheable(cacheNames = "dept"),输入 System.out-println ("查询部门"+id),启动后测试,查询部门并加上 controller,为了测试方便新建一个 class,命名为 DeptController。

标记注解 @RestController 并输入以下代码:

public class Deptcontroller {

@Autowired

DeptService deptService;

@GetNapping("/dept/{id}"

)

public Department getDept(@PathVariable("id") Integer id){

return deptService.getDeptById(id);}

}

重新启动进行测试,查询第一次有结果,刷新后查看第二次,redis中存有dept 数据,且含有1号部门的json数据。第二次查询通过缓存进行,但是不能读取 json 数据。

这是因为需要映射的数据是反映员工的,但是我们查出来的数据是部门的,而使用的redisCacheManager是用来缓存员工数据的,所以缓存的数据只能存入 redis ,但不能在第二次缓存查询中反序列化回来。

因此我们需要新建一个部门的缓存管理器,

代码如下:

@Bean

public RedisCacheManager deptCacheManager(RedisTemplate<Object,Department> deptRedisTemplate)

RedisCacheManager cacheManager = new RedisCacheManager(deptRedisTemplate);

此时,部门与员工分别有了各自的CacheManager ,进行部门缓存检测时,将deptCacheManager设为默认缓存管理器(通过标记注解@Primary),同理进行员工缓存检测时将employeeCacheManager设为默认缓存管理器。

重新启动后发现存储了部门数据且在第二次查询时反序列化成功


四、用编码的方式获取缓存数据

使用缓存管理器得到缓存,进行api调用

利用编码查处部门,向给缓存中放入redis Cachemanager,即将Cache manager注入进来,redis Cachemanager有很多类,我们就注入deptCachemanager,主注入部门的缓存管理器。

以获取部门缓存数据为例  

核心代码如下:

@Autowired

DepartmentMapper departmentMapper;

@Qualifier("deptCacheManager")

@Autowired

RedisCacheManager deptCacheManager;

指定过来以后,通过:

Cache dept = deptCacheManager.getCache( name:"dept");

dept.put( "dept: 1" ,department); 获取某个缓存。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
Java Spring
flowable 监听器无法获取spring bean ,自动注入bean为null,解决方案
flowable 监听器无法获取spring bean ,自动注入bean为null,解决方案
|
Java 数据库 开发者
@ConfigurationProperties 与 @Value区别 | 学习笔记
快速学习 @ConfigurationProperties 与 @Value 区别
@ConfigurationProperties 与 @Value区别 | 学习笔记
|
JSON API 分布式数据库
Bean 方式|学习笔记
快速学习 Bean 方式。
120 0
|
分布式数据库 流计算 开发者
bean 方式 | 学习笔记
快速学习 bean 方式
|
XML Java API
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
|
XML Java 数据格式
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
|
XML Java 测试技术
Sping中的配置Bean的几种方式
Sping中的配置Bean的几种方式
257 0
|
XML Java 数据格式
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(中)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(中)
|
JSON 缓存 数据格式
REDIS12_Spring Cache概述、@Cacheable、@CacheEvict、@Caching、@CachePut的使用(四)
REDIS12_Spring Cache概述、@Cacheable、@CacheEvict、@Caching、@CachePut的使用(四)
153 0
|
Java Spring
REDIS12_Spring Cache概述、@Cacheable、@CacheEvict、@Caching、@CachePut的使用(二)
REDIS12_Spring Cache概述、@Cacheable、@CacheEvict、@Caching、@CachePut的使用(二)
115 0