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

經(jīng)過上面簡單的兩步,即可在項目中使用 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 進(jìn)行讀寫,如

@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 進(jìn)行讀寫。不過,在寫入之前先將對象序列化為 JSON 字符串,然后再寫入 redis。讀取的時候,從 redis 獲取到的是是一個 JSON 字符串,需要反序列化相應(yīng)的對象。如以下代碼片段:

@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;
}

上面這種方式在讀取或?qū)懭氲臅r候,需要進(jìn)行序列化與反序列化,會有點繁瑣。我們還可以通過另一種簡潔的方式——RedisTemplate<Object, Object>,不過在實際項目中,大多數(shù)情況下,我們不會直接使用 RedisTemplate<Object, Object>,而是會對 key,value 進(jìn)行序列化,所以我們還需要新增一個配置類。以下示例新了配置類 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;
    }
}

/**
 * 標(biāo)簽類
 *
 * @author johnson lin
 * @date 2019/12/18 11:08 PM
 */
public class Tag {
    /**
     * 標(biāo)簽Id
     */
    private int tagId;

    /**
     * 標(biāo)簽名稱
     */
    private String tagName;

    /**
     * 標(biāo)簽狀態(tài):1-正常 2-暫不顯示
     */
    private int status;

    /**
     * 標(biāo)簽文章數(shù)
     */
    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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.Java對Redis的操作 如果不使用任何框架,Java 使用 Jedis操作數(shù)據(jù)庫.屬于最原始的一種方式; ...
    liangxifeng833閱讀 3,128評論 0 1
  • 原文鏈接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao閱讀 4,895評論 0 9
  • Redis 本身的一些概念 Redis 支持的數(shù)據(jù)結(jié)構(gòu) String 字符串 Hash 字典 List 列表 Se...
    yzbyzz閱讀 1,538評論 5 1
  • 作者:江南一點雨 [牧碼小子]在 Redis 出現(xiàn)之前,我們的緩存框架各種各樣,有了 Redis ,緩存方案基本上...
    拉提娜的爸爸閱讀 330評論 0 0
  • 田奶奶伸伸胳膊,努力的睜開眼,看見爬在床也睡著的大女,五十七的人多半白發(fā),滿臉疲倦。田奶奶想起了自己好腦溢血了,她...
    宋立新閱讀 181評論 0 0

友情鏈接更多精彩內(nèi)容