Spring Boot | 集成Redis

211 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

一、Redis简介

Redis 是一个开源(BSD许可)的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs 7种数据类型的存储。

二、安装Redis

本篇文章的讲述的重点不在Redis本身,所以这里就采用了一种比较方便的安装方式——使用Docker安装Redis。这里安装的是当前最新版本的Redis。

# 安装
$ docker pull redis

# 运行
$ docker run -p 6379:6379 --name redis -v /Users/wanggc/Data/redis/data:/data -v /Users/wanggc/Data/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf

命令说明:

  • --name redis:指定容器的名称;
  • -p 6379:6379:端口映射,前一个是主机端口号,后一个是Docker容器端口号;
  • -v /Users/wanggc/Data/redis/data:/data:表示将主机的/Users/wanggc/Data/redis/data映射为Docker容器上的/data,这样/data中产生的数据就可以持久化到本地的目录下了;
  • -v /Users/wanggc/Data/redis/conf/redis.conf:/etc/redis/redis.conf表示将本地;/Users/wanggc/Data/redis/conf/redis.conf映射为Docker容器上的/etc/redis/redis.conf,这样再配合指令末尾的redis redis-server /etc/redis/redis.conf实现让Docker容器运行时使用本地配置的Redis配置文件的功能了;
  • redis redis-server /etc/redis/redis.conf表示运行redis服务器程序,并且指定运行时的配置文件;
  • -d:表示后台启动Redis。

三、集成步骤

2.1 添加Redis依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <version>${spring-boot.version}</version>
  <exclusions>
    <exclusion>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.9.0</version>
</dependency>

默认的情况下,spring-boot-starter-data-redis 会依赖 Lettuce 客户端驱动,笔者这里选择使用的是 Jedis 客户端驱动。所以在代码中需要使用了元素将其依赖排除了,同时引入了 Jedis 的依赖。

2.2 添加配置

在application.properties文件中加入如下代码:

#配置Redis服务器属性
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
#Redis连接超时时间,单位毫秒
spring.redis.timeout=1000
#配置连接池属性
spring.redis.jedis.pool.min-idle=5
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.max-wait=2000

这里我们配置了连接池和服务器的属性,用以连接Redis服务器。

2.3 编写Redis配置类

@Configuration
public class RedisConfig {

    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        RedisSerializer jackson2JsonRedisSerializer = getJacksonSerializer();
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson的序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    /**
     * redis的json序列化
     */
    private RedisSerializer getJacksonSerializer() {
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        return new GenericJackson2JsonRedisSerializer(om);
    }
}

2.4 使用RedisTemplate操作Redis数据类型

// 1. 注入RedisTemplate
@Resource
private RedisTemplate<String, User> redisTemplate;

// 2. 添加缓存
redisTemplate.opsForValue().set(redisKey, user);

// 3. 获取缓存数据
User user = redisTemplate.opsForValue().get(redisKey);