zoukankan      html  css  js  c++  java
  • springboot缓存管理器(CacheManager)讲解——超详细!!!

    一、引入

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

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

    二、demo操作技巧

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

    1. EnableCache

      开启Cache注解功能。

    2. Cacheable

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

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

    3. CachePut

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

      且返回值存入缓存中

    4. CacheEvict

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

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

    1. value/cacheNames

      定义缓存的名字

    2. 定义缓存的名字

    3. key

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

    4. 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;
        }
    }
    

    ​ 希望能帮到你,如有不存请留言相互提高。

  • 相关阅读:
    HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛
    VC++中的头文件包含问题
    php调用com组件配置 以openoffice为例
    Android 进程和线程
    文件队列 QueueFile
    Android zip文件压缩解压缩
    Internet Explorer 11(IE11)无法切换第三方输入法
    非递归实现快速排序
    class_create()
    字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
  • 原文地址:https://www.cnblogs.com/theStone/p/15435626.html
Copyright © 2011-2022 走看看