自定义 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数据库实现在线游戏中的游戏玩家积分排行榜功能。
相关文章
|
SQL 存储 开发框架
数据库必知词汇:用户定义函数(UDF)
用户定义函数(UDF) 由一个或多个SQL语句组成的子程序,可用于封装代码以便重新使用。通常情况下不将用户限制在定义为SQL语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
2579 0
|
4月前
|
缓存 Java 数据库
SpringBoot集成Ehcache缓存使用指南
以上是SpringBoot集成Ehcache缓存的基本操作指南,帮助你在实际项目中轻松实现缓存功能。当然,Ehcache还有诸多高级特性,通过学习和实践,你可以更好地发挥它的威力。
425 20
|
6月前
|
存储 大数据 BI
场景题:有40亿个QQ号如何去重?仅1GB内存
在处理大数据去重问题时,如40亿QQ号的去重(仅1GB内存),可采用Bitmap和布隆过滤器两种方法。Bitmap利用位图存储,每个QQ号占1位,总需512MB内存,适用于整型数据;布隆过滤器通过多个哈希函数计算下标,适合字符串或对象去重,但存在误判率。在线人员统计等场景也可使用类似思路,将ID作为偏移值标记在线状态或视频存在性。
200 3
|
11月前
|
编解码 前端开发 UED
多屏幕适配方案
【10月更文挑战第7天】
277 1
|
自然语言处理 索引
es-DSL语句基础操作(Elasticseach)
es-DSL语句基础操作(Elasticseach)
314 1
|
监控 Java API
如何将不同业务模块产生的日志 分多文件记录
如何将不同业务模块产生的日志 分多文件记录
164 0
|
缓存 NoSQL Java
Spring Cache之本地缓存注解@Cacheable,@CachePut,@CacheEvict使用
SpringCache不支持灵活的缓存时间和集群,适合数据量小的单机服务或对一致性要求不高的场景。`@EnableCaching`启用缓存。`@Cacheable`用于缓存方法返回值,`value`指定缓存名称,`key`定义缓存键,可按SpEL编写,`unless`决定是否不缓存空值。当在类上使用时,类内所有方法都支持缓存。`@CachePut`每次执行方法后都会更新缓存,而`@CacheEvict`用于清除缓存,支持按键清除或全部清除。Spring Cache结合Redis可支持集群环境。
930 6
Intellij IDEA运行报Command line is too long的解决办法
Intellij IDEA运行报Command line is too long的解决办法
1152 1
|
Java 测试技术 Spring
MultipartFile介绍
MultipartFile介绍
355 0