likes
comments
collection
share

SpringBoot中集成Redis

作者站长头像
站长
· 阅读数 70

1. Redis

Redis作为非关系型数据库,在项目开发中被大量的使用,尤其是作为数据的缓存来保证请求数据的快速响应,提升服务的用户体验。

今天就来学习一下Spring Boot项目中如何集成Redis作为缓存数据库。

1.1 引入Redis相关依赖

SpringBoot中对Redis的集进行了封装,提供了Spring Data Redis框架支持,Spring Data Redis在底层Spring的架构中定义与Redis数据库交互的逻辑,用户在使用时不需要关心如何管理,只需要在应用程序层面去操作Redis。

使用时需要引starter-data-redis依赖:

<!-- redis依赖信息 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

1.2 依赖包含信息

依赖引入后,可以看到maven projects中相关的依赖包信息,其中包括了spring-data-redis和lettuce-core两个依赖包。

  • spring-data-redis包含了Spring对data处理的一些公共包
  • lettuce-core包是starter-data-redis中对lettuce的默认支持

SpringBoot中集成Redis

1.3 Jedis客户端依赖

如果需要使用Jedis来操作Redis,只需要将lettuce的依赖替换为Jedis即可。

<!--导入jedis-->        
<dependency>            
    <groupId>redis.clients</groupId>            
    <artifactId>jedis</artifactId>        
</dependency>

2. Redis配置

Spring Boot在org.springframework.boot.autoconfigure.data.redis包中为redis提供了自动配置。其中定义有:

  • RedisAutoConfiguration自动配置类
  • RedisPropertiesRedis属性信息读取类
  • RedisConnectionConfiguration连接配置基类
    • JedisConnectionConfiguration,Jedis连接配置类
    • LettuceConnectionConfiguration,Lettuce连接配置类

2.1 配置文件中定义Redis信息

有了RedisProperties,并于Spring Boot配置文件中定义Redis相关属性后,就会在项目启动时会注入到Redis中去。Redis可以自定义的配置项内容有:

# Redis配置项,以spring.redis为前缀
# 数据库索引(默认为0)
spring.redis.database=0
# 服务器地址
spring.redis.host=127.0.0.1
# 端口
spring.redis.port=6379
# 密码(默认为空,为空时不设置该属性)
spring.redis.password=redis
# 超时时间(毫秒)
spring.redis.timeout=30000

# 建议使用lettuce 可以换成jedis,spring默认集成lettuce
spring.redis.client-type=lettuce

# 如果使用jedis客户端,则下面定义的内容需要将lettuce换成jedis
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=10
# 最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-2
# 最大空闲连接数
spring.redis.lettuce.pool.max-idle=10
# 最小空闲连接
spring.redis.lettuce.pool.min-idle=0

2.2 自定义Redis配置类

前面说到spring中为redis定义了专门的RedisAutoConfiguration自动配置类,其中定义创建泛型为<Object, Object>的RedisTemplate对象,为了允许自定义配置Bean,自动配置类使用@ConditionalOnMissingBean注解,表示当其他地方定义一个RedisTemplate的Bean时,会替代自动配置中的结果。

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        return new StringRedisTemplate(redisConnectionFactory);
    }
}

为了使用操作更方便,我们定义一个<String, Object>泛型的RedtTemplate,这样对于数据的存放和读取都更合适。

  • RedisTemplate序列化默认是采用JDK的序列化策略,可以在配置类中设置为其他策略
//自定义RedisConfig
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        //采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        return redisTemplate;
    }
}

3. 使用Redis

3.1 SpringBoot项目使用Redis

在项目中配置Redis完成后,直接执行项目即可,运行时需要注意在配置文件中定义的Redis信息是否正确,如果Redis无法连接则项目启动报错。

  • 服务器地址要时Redis运行的服务地址,如果是本地则为127.0.0.1
  • 设置Redis启动的端口号,默认是6379
  • Redis连接密码即服务器中启动Redis服务的密码,如果没有密码则不要配置该属性,否则也会报错

项目成功启动后,为了验证Redis是否可用,可以在单元测试中使用redisTemplate来存储和获取数据到redis中。

@Autowired
private RedisTemplate redisTemplate;

@Test
public void testRedis(){
    ValueOperations<String, String> operations = redisTemplate.opsForValue();
    operations.set("name", "tom");
    System.out.println(operations.get("name"));
}

执行单元测试后输出存储的tom值,说明数据已经存储在Redis中了。

SpringBoot中集成Redis

3.2 Windows下安装Redis

如果还没有安装Redis服务,或者想要在Redis服务中查看存入的数据,可以参照windows本地Redis服务的创建方法。

Redis官方并不建议在Windows下使用Redis,因此没有提供windows版本,而微软官方却为windows用户提供了可用的redis应用。

windows下Redis版本 ,下载时可以选择安装包或免安装版本。

下载安装完成后得到Redis目录,可以使用其中的redis-server和redis-cli程序来运行redis

  • redis-server作为服务端,启动后开启命令行来运行redis服务
  • redis-cli作为客户端,可以执行redis相关命令查看和存储数据

SpringBoot中集成Redis

如果是免安装版,每次redis服务都在前台运行不够简洁,还可以通过windows命令行将redis-server设置为后台启动。相关命令有:

  1. 将redis程序解压后放到合适的位置
  2. 打开一个命令窗口,进入到解压目录,输入命令:redis-server redis.windows.conf
  3. 再打开一个新的命令窗口,输入命令:redis-server --service-install redis.windows.conf
    • 这样就可以将redis部署为windows下的一个服务
  4. 安装完成后,使用命令启动服务:redis-server --service-start
  5. 如果想要停止或卸载redis服务,只需要执行相关命令
    • 停止服务命令:redis-server --service-stop
    • redis的卸载命令:redis-server --service-uninstall

进入redis客户端后,可以使用redis命令来查看存储的数据:

SpringBoot中集成Redis

转载自:https://juejin.cn/post/7035272968762556452
评论
请登录