SpringBoot整合Redis的实现示例

 更新时间:2023年01月25日 08:42:43   作者:llp1110  
本文主要介绍了SpringBoot整合Redis的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.需求说明

  • 在 springboot 中 , 整合 redis
  • 可以通过 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、如果没有提供 RedisConfig 配置类 , springboot 会使用默认配置, 也可以使用

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java中Collections.sort对List排序的两种方法

    浅谈Java中Collections.sort对List排序的两种方法

    本文介绍了Java中Collections.sort对List排序的两种方法以及Comparable 与Comparator区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 自定义的Troop<T>泛型类( c++, java和c#)的实现代码

    自定义的Troop<T>泛型类( c++, java和c#)的实现代码

    这篇文章主要介绍了自定义的Troop<T>泛型类( c++, java和c#)的实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • 详解关于springboot-actuator监控的401无权限访问

    详解关于springboot-actuator监控的401无权限访问

    本篇文章主要介绍了详解关于springboot-actuator监控的401无权限访问,非常具有实用价值,有兴趣的可以了解一下
    2017-09-09
  • Java 中 hashCode() 与 equals() 的关系(面试)

    Java 中 hashCode() 与 equals() 的关系(面试)

    这篇文章主要介绍了Java中hashCode()与equals()的关系,ava中hashCode()和equals()的关系是面试中的常考点,文章对hashCode与equals的关系做出详解,需要的小伙伴可以参考一下
    2022-09-09
  • Spring存储与读取Bean对象方法

    Spring存储与读取Bean对象方法

    在Spring中,要想更简单的存储和读取对象的核心是使用注解,这篇文章主要给大家介绍了关于Spring如何通过注解存储和读取对象的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Sharding-Jdbc 自定义复合分片的实现(分库分表)

    Sharding-Jdbc 自定义复合分片的实现(分库分表)

    本文主要介绍了Sharding-Jdbc 自定义复合分片的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java工具jsch.jar实现上传下载

    Java工具jsch.jar实现上传下载

    这篇文章主要为大家详细介绍了Java操作ftp的一款工具,利用jsch.jar针对sftp的上传下载工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 如何使用Docker部署Java项目

    如何使用Docker部署Java项目

    在接触了docker后,干什么都想用docker来弄,这篇文章主要给大家介绍了关于如何使用Docker部署Java项目的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java设计模式之中介者模式

    Java设计模式之中介者模式

    这篇文章介绍了Java设计模式之中介者模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • SpringBoot整合Guava Cache实现全局缓存的示例代码

    SpringBoot整合Guava Cache实现全局缓存的示例代码

    这篇文章主要介绍了SpringBoot整合Guava Cache实现全局缓存,Guava Cache是Google Guava库中的一个模块,提供了基于内存的本地缓存实现,文中介绍了SpringBoot整合使用Guava Cache的具体步骤,需要的朋友可以参考下
    2024-03-03

最新评论