SpringBoot整合Redis的实现示例

目录
1.需求说明2.整合实现2.1.创建Springboot工程2.2.redis配置3.编写测试类4.注意事项和细节

1.需求说明

    在>可以通过 RedisTemplate 完成对 redis 的操作, 包括设置数据/获取数据比如添加和读取数据

    2.整合实现

    2.1.创建Springboot工程

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- spring2.X 集成 redis 所需 common-pool-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <!--不要带版本号,防止冲突-->
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.2.2</version>
    </dependency>
    

    2.2.redis配置

    配置连接信息

    spring:
      redis:
        host: 192.168.79.202
        port: 6379
        #Redis 数据库索引(默认为 0)
        database: 0
        #连接超时时间(毫秒)
        timeout: 1800000
        lettuce:
          pool:
            #连接池最大连接数(使用负值表示没有限制)
            max-active: 20
            #最大阻塞等待时间(负数表示没限制)
            max-wait: -1
            #连接池中的最大空闲连接
            min-idle: 0
            #密码
        password: foobared
    

    redis 配置类

    如果不配置, springboot 会使用默认配置, 这个默认配置, 会出现一些问题, 比如:
    redisTemplate 的 key 序列化等, 问题所以通常我们需要配置

    @EnableCaching
    @Configuration
    public class RedisConfig extends CachingConfigurerSupport {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> template =
                    new RedisTemplate<>();
            //这里可以验证..
            //System.out.println("template=>" + template);
            RedisSerializer<String> stringRedisSerializer =
                    new StringRedisSerializer();
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
                    new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.activateDefaultTyping(
                    LaissezFaireSubTypeValidator.instance,
                    ObjectMapper.DefaultTyping.NON_FINAL,
                    JsonTypeInfo.As.WRAPPER_ARRAY);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            template.setConnectionFactory(factory);
            //key序列化方式
            template.setKeySerializer(stringRedisSerializer);
            //value序列化
            template.setValueSerializer(jackson2JsonRedisSerializer);
            //value hashmap序列化
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            return template;
        }
    
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory factory) {
            RedisSerializer<String> stringRedisSerializer =
                    new StringRedisSerializer();
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            //解决查询缓存转换异常的问题
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.activateDefaultTyping(
                    LaissezFaireSubTypeValidator.instance,
                    ObjectMapper.DefaultTyping.NON_FINAL,
                    JsonTypeInfo.As.WRAPPER_ARRAY);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            // 配置序列化(解决乱码的问题),过期时间600秒
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    .entryTtl(Duration.ofSeconds(600))
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                    .disableCachingNullValues();
            RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                    .cacheDefaults(config)
                    .build();
            return cacheManager;
        }
    }
    

    3.编写测试类

    @RestController
    @RequestMapping("/redisTest")
    public class RedisTestController {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        //编写一个测试方法,演示设置数据和获取数据
        @GetMapping("/t1")
        public String t1(){
            //设置值到redis
            redisTemplate.opsForValue().set("book","西游记");
            //从redis获取值
            String book = (String)redisTemplate.opsForValue().get("book");
            return book;
        }
    
    }
    

    测试结果

    //编写方法,演示如何操作list,hash,set,zset
    //opsForList、opsForHash、opsForSet、opsForZSet
    @GetMapping("/t2")
    public String t2(){
        redisTemplate.opsForList().leftPushAll("books","西游记","java");
        List books = redisTemplate.opsForList().range("books", 0, -1);
        StringBuilder builder = new StringBuilder();
        for (Object book : books) {
            builder.append(book.toString()).append(" ");
            System.out.println("书名:"+book.toString());
        }
        return builder.toString();
    }
    

    输出结果

    书名:java
    书名:西游记

    4.注意事项和细节

    1、如果没有提供>

    2、如果没有提供 RedisConfig 配置类 , springboot 会使用默认配置, 但是会存在问题,比如 redisTemplate 模糊查找 key 数据为空

    //编写一个方法获取所有的key
    @GetMapping("/t3")
    public String t3(){
        Set keys = redisTemplate.keys("*");
        System.out.println(keys.size());
        System.out.println(keys);
        return "ok";
    }
    //输出结果
    0
    []

    3、Unrecognized token ‘beijing’: was expecting (‘true’, ‘false’ or ‘null’)看报错,是 jason 转换异常,实际上是因为 redisTemplate 在做数据存储的时候会把存储的内容序列化,所以,redisTemplate 读取的时候也会反序列化,而在 redis 客户端set 的时候并不会做序列化,因此 set 的进去的值在用 redisTemplate 读的时候就会报类型转换异常了

    //编写方法获取客户端设置的key
    //问题描述:在客户端设置了key,通过redisTemplate获取会报错
    @GetMapping("/t4")
    public String t4(){
        String name = (String)redisTemplate.opsForValue().get("name");
        System.out.println("name = "+name);
        return name;
    }
    

    4、解决方案 : 最简单的就是用程序重新 set 一遍即可

    到此这篇关于SpringBoot整合Redis的实现示例的文章就介绍到这了,更多相关SpringBoot整合Redis内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

延伸阅读:

上一篇:IDEA2022创建SpringBoot项目的图文教程

下一篇:详解SpringBoot中的统一功能处理的实现