前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot集成Redis

SpringBoot集成Redis

原创
作者头像
大发明家
发布2021-12-15 15:21:34
4040
发布2021-12-15 15:21:34
举报
文章被收录于专栏:技术博客文章

1.引入依赖

根据SpringBoot的版本引入对应的依赖,本文采用版本为2.4.5

代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-data-redis</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- 如果不引入此依赖,项目启动连接redis会报错,错误信息如下-->
代码语言:txt
复制
          <dependency>
代码语言:txt
复制
            <groupId>org.apache.commons</groupId>
代码语言:txt
复制
            <artifactId>commons-pool2</artifactId>
代码语言:txt
复制
        </dependency>    
代码语言:txt
复制
//没有引入commons-pool2依赖报错
代码语言:txt
复制
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig

说明:在SpringBoot2.x之后,原来依赖中使用的jedis被替换成了lettuce?

jedis:采用的直连方式,多线程操作时,是不安全的。如果想要避免不安全,使用jedis pool连接池,比较繁琐。更像BIO模式

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况。可以减少线程数据,性能更高。更像NIO模式

2.添加配置

  • SpringBoot所有的配置,都会有一个自动配置类。undefined我们可以在spring-boot-autoconfigure-2.x.x.jar中META- INF目录下的spring.factories文件中找到对应的自动配置类。undefined例如Redis:
代码语言:txt
复制
/**
代码语言:txt
复制
 * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Redis support.
 *
 * @author Dave Syer
 * @author Andy Wilkinson
 * @author Christian Dupuis
 * @author Christoph Strobl
 * @author Phillip Webb
 * @author Eddú Meléndez
 * @author Stephane Nicoll
 * @author Marco Aust
 * @author Mark Paluch
 * @since 1.0.0
 */
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class) //此处绑定为对应的配置内容,所有的配置信息都在此类中
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    @ConditionalOnMissingBean(name = "redisTemplate")
代码语言:txt
复制
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
代码语言:txt
复制
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
代码语言:txt
复制
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
代码语言:txt
复制
        template.setConnectionFactory(redisConnectionFactory);
代码语言:txt
复制
        return template;
代码语言:txt
复制
    }
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    @ConditionalOnMissingBean
代码语言:txt
复制
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
代码语言:txt
复制
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
代码语言:txt
复制
        StringRedisTemplate template = new StringRedisTemplate();
代码语言:txt
复制
        template.setConnectionFactory(redisConnectionFactory);
代码语言:txt
复制
        return template;
代码语言:txt
复制
    }
代码语言:txt
复制
}
  • 自动配置类都会绑定一个properties配置文件类 RedisProperties,里面有我们可以配置的内容信息.undefined大致配置内容如下,可根据实际情况自由配置
代码语言:txt
复制
spring:
代码语言:txt
复制
  redis:
代码语言:txt
复制
    # redis所在服务器ip
代码语言:txt
复制
    host: 192.168.225.132
代码语言:txt
复制
    # redis服务的端口号
代码语言:txt
复制
    port: 6379
代码语言:txt
复制
    # redis链接密码,没有可忽略不填
代码语言:txt
复制
    password:
代码语言:txt
复制
    # 使用的数据库 Redis默认使用db0
代码语言:txt
复制
    database: 0
代码语言:txt
复制
    # 连接池最大连接数
代码语言:txt
复制
    lettuce:
代码语言:txt
复制
      pool:
代码语言:txt
复制
        # 连接池最大连接数(使用负值表示没有限制)
代码语言:txt
复制
        max-active: 20
代码语言:txt
复制
        # 连接池中的最小空闲连接
代码语言:txt
复制
        min-idle: 2
代码语言:txt
复制
        # 连接池中的最大空闲连接
代码语言:txt
复制
        max-idle: 3
代码语言:txt
复制
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
代码语言:txt
复制
        max-wait: -1
代码语言:txt
复制
      # 在关闭客户端连接之前等待任务处理完成的最长时间,在这之后,无论任务是否执行完成,都会被执行器关闭,默认100m
代码语言:txt
复制
      shutdown-timeout: 100
代码语言:txt
复制
  cache:
代码语言:txt
复制
    redis:
代码语言:txt
复制
      # redis是否缓存空值
代码语言:txt
复制
      cache-null-values: true

3.自定义RedisTemplate模板操作类

代码语言:txt
复制
@Configuration
代码语言:txt
复制
public class RedisConfig {
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
代码语言:txt
复制
        RedisTemplate<String, Object> template = new RedisTemplate<>();
代码语言:txt
复制
        // 配置连接工厂
代码语言:txt
复制
        template.setConnectionFactory(factory);
代码语言:txt
复制
        // 值采用json序列化
代码语言:txt
复制
        template.setValueSerializer(RedisSerializer.json());
代码语言:txt
复制
        //使用StringRedisSerializer来序列化和反序列化redis的key值
代码语言:txt
复制
        template.setKeySerializer(new StringRedisSerializer());
代码语言:txt
复制
        // 设置hash key 和value序列化模式
代码语言:txt
复制
        template.setHashKeySerializer(new StringRedisSerializer());
代码语言:txt
复制
        template.setHashValueSerializer(RedisSerializer.json());
代码语言:txt
复制
        template.afterPropertiesSet();
代码语言:txt
复制
        return template;
代码语言:txt
复制
    }
代码语言:txt
复制
}

测试

代码语言:txt
复制
   //注入我们配置好的RedisTemplate
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private RedisTemplate<String,Object> redisTemplate;
代码语言:txt
复制
    @Test
代码语言:txt
复制
    void test() {
代码语言:txt
复制
        UserPo userPo = UserPo.builder()
代码语言:txt
复制
                .username("wuhan")
代码语言:txt
复制
                .password("wuhan520")
代码语言:txt
复制
                .age(25)
代码语言:txt
复制
                .build();
代码语言:txt
复制
        redisTemplate.opsForValue().set("key:user", userPo);
代码语言:txt
复制
        System.out.println(redisTemplate.opsForValue().get("key:user"));
代码语言:txt
复制
    }

输出结果:

代码语言:txt
复制
UserPo(username=wuhan, password=wuhan520, age=25)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档