Spring Boot 2.x 集成Redis示例

一、如何集成

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

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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

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

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

@Autowired
private RedisTemplate<Object, Object> redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

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

// 通过 RedisTemplate<Object, Object> 保存
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<String, Object> 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<String, Object> map = new HashMap<>();
  map.put("tag", t);
  return map;
}

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

/**
 * Redis 配置类
 * 
 * @author johnson lin
 * @date 2019/12/18 11:24 PM
 */
@Configuration
public class RedisConfig {
    @Bean("tagRedisTemplate")
    public RedisTemplate<String, Tag> tagRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Tag> template = new RedisTemplate<>();
        Jackson2JsonRedisSerializer<Tag> 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<String, Tag> tagRedisTemplate;

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

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

    Map<String, Object> 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<String, Tag> 保存 Tag 实体类
    tagRedisTemplate.opsForValue().set("key_tag", tag);

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


    // 通过 RedisTemplate<String, Tag> 获取 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容