zoukankan      html  css  js  c++  java
  • Spring Boot 学习----SpringBoot整合Redis

    SpringBoot整合Redis

    说明:由于使用的是window系统,所以本文中使用的redis是再Docker中运行的。

    至于如何启动redis这里不再说明,需要的请自行百度。

    配置pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    

    编写redis配置类

    /**
     * redis配置类
     */
    @Configuration
    //开启缓存
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
        /**
         * 自定义生成key的规则
         * @return
         */
        @Override
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    //格式化缓存key字符串
                    StringBuilder sb = new StringBuilder();
                    //追加类名
                    sb.append(o.getClass().getName());
                    //追加方法名
                    sb.append(method.getName());
                    System.out.println("调用Redis缓存Key : " + sb.toString());
                    return sb.toString();
                }
            };
        }
    
        /**
         * 采用RedisCacheManager作为缓存管理器
         * @param connectionFactory
         */
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
            RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
            return  redisCacheManager;
        }
    
        @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            // 解决键、值序列化问题
            StringRedisTemplate template = new StringRedisTemplate(factory);
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            template.setValueSerializer(jackson2JsonRedisSerializer);
            template.afterPropertiesSet();
            return template;
        }
    }
    
    • 上面的redisTemplate可以使用其他序列化的实现。
    • key的生成规则可以由自己定义,返回值会成为redis的key。

    编写redis操作工具类

    redis工具类主要使用redisTemplate类进行操作,至于怎么操作这里不再阐述。你可以找网上大佬封装好的,也可以自己封装。

    使用缓存

    这里主要讲解一下 @Cacheable、@CachePut、@CacheEvict

    • @Cacheable(在执行 @Cacheable 标注的方法前先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,执行该方法并将方法返回值放进缓存。)
    @Cacheable(key = "#id",value = "key",unless = "#id==null")
    @PostMapping("/{id}/{value}")
    public String setKey(@PathVariable String value,@PathVariable String id){
        return value+id;
    }
    

    PS:若去掉value属性则会抛错。若没有key则会进入到配置类中的key生成策略中生成对应key。

    最后进入redis中的key格式回事 key::value

    • @CacheEvict(方法执行成功后会从缓存中移除相应数据)
    @CacheEvict(value = "key",key = "#id")
    @DeleteMapping("/{id}")
    public String clear(@PathVariable String id){
        return null;
    }
    
    • @CachePut(主要用于数据新增和修改方法)
    @CachePut(value = "value", key = "#id")  
    @PutMapping("/{id}/{value}")
    public User save(){ 
        return null;
    }
    

    PS:参数, value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件

    具体又哪些参数根据注解的参数来对照。

  • 相关阅读:
    dll相对路径设置
    OPC UA Error: Could not add self-signed certificate to certficate store.
    PB调用C#封装的视频插件中拍照方法不生效的问题
    net反射加载出现错误: ex = {“无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。”}
    xtralayout模式下,修改 layOutcontrolgroup分组框表头背景颜色步骤
    abap 本地包 生成请求号
    PB调用SAP的Web Service结构体数组参数方法详解(使用C#调用Web Service生成dll)
    zookeeper NIOServerCnxn: Too many connections from IP- max i
    mysql 10038错误解决方案
    PHP获取文件夹内所有文件包括子目录文件的名称或路径
  • 原文地址:https://www.cnblogs.com/bananafish/p/12347035.html
Copyright © 2011-2022 走看看