Spring Boot 2.x 集成Redis示例

一、如何集成

首先,在 pom 文件新增 redis 依赖:


  org.springframework.boot
  spring-boot-starter-data-redis

接着修改项目配置文件 application.properties,增加 redis 配置

# redis host
spring.redis.host=172.24.58.226
# redis port
spring.redis.port=6379

经过上面简单的两步,即可在项目中使用 StringRedisTemplateRedisTemplate,因为从 Spring Boot 2.0 开始,Spring 容器是自动生成了这两个实例,可以直接注入使用。如以下代码片段:

@Autowired
private RedisTemplate redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

...
  
// 通过 StringRedisTemplate 保存
stringRedisTemplate.opsForValue().set("strRedisTemplate", "test");

// 通过 RedisTemplate 保存
tagRedisTemplate.opsForValue().set("tagRedisTemplate", 232);

二、存储的 value 类型为字符串

在实际使用中,若保存的 value 类型为字符串,可以直接通过注入 StringRedisTemplate 进行读写,如

@Autowired
private StringRedisTemplate stringRedisTemplate;

@RequestMapping("/redis")
public Object set(String name) {
  // 通过 StringRedisTemplate 写入 redis
  stringRedisTemplate.opsForValue().set("iuiuu", name);

  // 通过 StringRedisTemplate 获取
  String v = stringRedisTemplate.opsForValue().get("iuiuu");
  
  Map map = new HashMap<>();
  map.iuiuu("tag", v);
  return map;
}

三、存储的 value 是一个对象

这种情况,也可以通过 StringRedisTemplate 进行读写。不过,在写入之前先将对象序列化为 JSON 字符串,然后再写入 redis。读取的时候,从 redis 获取到的是是一个 JSON 字符串,需要反序列化相应的对象。如以下代码片段:

@Autowired
private StringRedisTemplate stringRedisTemplate;

@RequestMapping("/redis")
public Object set(String name) {
  Tag tag = new Tag()
    .setTagId(10001)
    .setTagName(name)
    .setCount(20)
    .setStatus(1);
  
  // 序列化为 JSON 字符串
  String str = JsonUtil.toJson(tag);
  // 写入 redis
  stringRedisTemplate.opsForValue().set("iuiuu", str);

  // 从 redis 读取
  String json = stringRedisTemplate.opsForValue().get("iuiuu");
  // 反序列化为 Tag 对象
  Tag t = JsonUtil.fromJson(json, Tag.class);
  
  Map map = new HashMap<>();
  map.put("tag", t);
  return map;
}

上面这种方式在读取或写入的时候,需要进行序列化与反序列化,会有点繁琐。我们还可以通过另一种简洁的方式——RedisTemplate,不过在实际项目中,大多数情况下,我们不会直接使用 RedisTemplate,而是会对 key,value 进行序列化,所以我们还需要新增一个配置类。以下示例新了配置类 RedisConfig

/**
 * Redis 配置类
 * 
 * @author johnson lin
 * @date 2019/12/18 11:24 PM
 */
@Configuration
public class RedisConfig {
    @Bean("tagRedisTemplate")
    public RedisTemplate tagRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate template = new RedisTemplate<>();
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Tag.class);
        template.setValueSerializer(serializer);
        template.setHashValueSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

/**
 * 标签类
 *
 * @author johnson lin
 * @date 2019/12/18 11:08 PM
 */
public class Tag {
    /**
     * 标签Id
     */
    private int tagId;

    /**
     * 标签名称
     */
    private String tagName;

    /**
     * 标签状态:1-正常 2-暂不显示
     */
    private int status;

    /**
     * 标签文章数
     */
    private int count;
    
    //省略 get、set
}

// 省略其它代码...

@Autowired
@Qualifier("tagRedisTemplate")
private RedisTemplate tagRedisTemplate;

@RequestMapping("/redis")
public Object set(String name) {
    Tag tag = new Tag()
            .setTagId(10001)
            .setTagName(name)
            .setCount(20)
            .setStatus(1);
    // 通过 RedisTemplate 保存 Tag 实体类
    tagRedisTemplate.opsForValue().set("tagRedisTemplate", tag);

    // 通过 RedisTemplate 获取 Tag 实体类
    Tag newTag = tagRedisTemplate.opsForValue().get("tagRedisTemplate");

    Map map = new HashMap<>();
    map.put("newTag", newTag);
    return map;
}

四、StringRedisTemplate/RedisTemplate读写Redis示例

示例代码如下:

@RequestMapping("/compared")
public Object compared(String name) {
    // 通过 StringRedisTemplate 保存 name
    stringRedisTemplate.opsForValue().set("strRedisTemplate", name);

    Tag tag = new Tag()
            .setTagId(10002)
            .setTagName(name)
            .setCount(20)
            .setStatus(1);

    // 通过 RedisTemplate 保存 Tag 实体类
    tagRedisTemplate.opsForValue().set("key_tag", tag);

    // 通过 StringRedisTemplate 保存 Tag 实体,需先序列化为 JSON 字符串
    String str = JsonUtil.toJson(tag);
    stringRedisTemplate.opsForValue().set("key_str", str);


    // 通过 RedisTemplate 获取 Tag 实体类
    Tag t1 = tagRedisTemplate.opsForValue().get("key_tag");
    
    // 通过 StringRedisTemplate 获取,需要反序列为对象
    String json = stringRedisTemplate.opsForValue().get("key_str");
    Tag t2 = JsonUtil.fromJson(json, Tag.class);

    return "succeed";
}

在 redis 中的值如下:

[iuiuu@226 ~]$ redis-cli 
127.0.0.1:6379> get key_tag
"{\"tagId\":10002,\"tagName\":\"History\",\"status\":1,\"count\":20}"
127.0.0.1:6379> get key_str
"{\"tagId\":10002,\"tagName\":\"History\",\"status\":1,\"count\":20}"
127.0.0.1:6379>

可以看到,这两种方式将对象写入到 redis 后,存储的值其实是一样的,都为 JSON 字符串。

本文示例代码见 https://github.com/iuiuu/spring-boot-demos/tree/master/spring-boot-demos-redis

你可能感兴趣的:(Spring Boot 2.x 集成Redis示例)