irpas技术客

springboot缓存管理器(CacheManager)

网络投稿 545

springboot缓存管理器(CacheManager)讲解——超详细!!! 一、引入 ?随着java的慢慢学习,缓存的使用也越来越多。我们使用缓存大多数是通过api的方式来操作,厉害的人也可以自己自定义注解来简化操作,但是看完这篇博客,以后操作注解就不会辣么麻烦了。因为spring中提供了CacheManager接口和一些注解方便我们来操作。

? 在我们接触的缓存大致两种,本地缓存与中间件缓存。spring对常用的缓存都进行了一些封装。可以通过ctrl+h查看CacheManager的继承类,主要有SimplerCacheManager(内部一个CurrentMap)与RedisCacheManager、EhCacheManager等。

二、demo操作技巧 ? 在自己动手写demo之前,希望能知道一些基础知识。我们操作缓存是需要CacheManager与以下四种注解配合的:

EnableCache

开启Cache注解功能。

Cacheable

根据键从缓存中取值,存在获取到后直接返回。

键不存在则执行方法,将返回结果放入到缓存中。

CachePut

根据键从缓存中取值,无论如何,方法都会被执行,

且返回值存入缓存中

CacheEvict

执行方法后,删除缓存中数据

以上四种注解,除去第一个写在类上,后面三个都是写在方法上,常用的参数如下:

value/cacheNames

定义缓存的名字

定义缓存的名字

key

key 属性是来指定缓存数据所使用的的 key,默认使用的是方法调用传过来的参数作为 key

condition、unless

支持SqEl表达式,都是判断条件,是否使用缓存

案列:

@Cacheable(cacheNames="test",,key = "#test = 3")

此时给注解表示会获取键值为test::3的key,如果不存在,就执行方法,将结果放入缓存中。

三、代码实操 案例代码:

@SpringBootApplication @EnableCaching public class App { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(App.class, args); Demo bean = run.getBean(Demo.class); while (true){ Scanner scanner = new Scanner(System.in); if (scanner.hasNext()){ String next = scanner.next(); if ("1".equals(next)) bean.test1("demo"); if ("2".equals(next)) bean.test2("demo"); if ("3".equals(next)) bean.test3("demo"); } } }

}

@Component public class Demo { @Cacheable(cacheNames = "test") public String test1(String test){ System.out.println("i am run"); return "test1"; } @CacheEvict("test") public String test2(String test){ System.out.println("i am run"); return "test2"; } @CachePut(cacheNames = "test",key = "#test = 3") public String test3(String test){ System.out.println("i am run"); return "test3"; }

}

操作结果:

1 ->输入 i am run 缓存中添加新的缓存 3 ->输入 i am run 缓存中的内容刷新 2 ->输入 i am run 缓存被删除

四、缺点 ? 当我们使用缓存中间件的时候,我们不能使用比较复杂的数据结构,都是用string键值对来存去。

五、拓展提高 ? 当我们操作cahche且使用redis默认配置的时候,我们经常会发现我们存入缓存中的数据通过工具查看会乱码,看不懂,这里是因为我们没有配置Cache,将redis作为缓存的话,默认是使用jdk序列化器,所以会乱码看不懂。

这里我们可以通过自定义CacheManager来解决问题。

@Configuration public class RedisConfig { @Autowired private LettuceConnectionFactory lettuceConnectionFactory; @Bean public RedisCacheManager redisCacheManager(){ RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(1))//设置缓存过期时间 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); //设置序列化器 RedisCacheManager build = RedisCacheManager.builder(lettuceConnectionFactory) .cacheDefaults(config) .build(); return build; }

}


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #springboot #缓存管理器