天天看點

SpringBoot進階篇Redis之Hash資料結構使用姿勢

Redis的五大資料結構,前面講述了String和List的使用姿勢,而Hash資料結構,也是比較常用的,接下來看下hash資料結構的讀取,删除,塞入的基本使用姿勢

I. 基本使用

在開始之前,序列化的指定需要額外處理,上一篇已經提及,相關内容可以參考:

  • 181109-SpringBoot進階篇Redis之List資料結構使用姿勢

1. 查詢元素

hash資料結構和我們了解jdk中的hash差不多,使用的姿勢也沒什麼差別,需要注意的是需要,定位一個元素,需要由緩存的key + hash的key-

field

/**
 * 擷取hash中field對應的值
 *
 * @param key
 * @param field
 * @return
 */
public String hget(String key, String field) {
    Object val = redisTemplate.opsForHash().get(key, field);
    return val == null ? null : val.toString();
}
           

2. 添加元素

/**
 * 添加or更新hash的值
 *
 * @param key
 * @param field
 * @param value
 */
public void hset(String key, String field, String value) {
    redisTemplate.opsForHash().put(key, field, value);
}
           

3. 删除

hash最好的一個地方,我個人感覺就是在删除時特别友善,比如将同類的資料聚集在一個hash中,删除key就可以實作全部都删除,清理資料就比較友善了;除此之外,另外一種就是删除hash中的部分key

/**
 * 删除hash中field這一對kv
 *
 * @param key
 * @param field
 */
public void hdel(String key, String field) {
    redisTemplate.opsForHash().delete(key, field);
}
           

4. 批量查詢

批量查詢有兩種,一個是全部撈出來,一個是撈出指定key的相關資料

public Map<String, String> hgetall(String key) {
    return redisTemplate.execute((RedisCallback<Map<String, String>>) con -> {
        Map<byte[], byte[]> result = con.hGetAll(key.getBytes());
        if (CollectionUtils.isEmpty(result)) {
            return new HashMap<>(0);
        }

        Map<String, String> ans = new HashMap<>(result.size());
        for (Map.Entry<byte[], byte[]> entry : result.entrySet()) {
            ans.put(new String(entry.getKey()), new String(entry.getValue()));
        }
        return ans;
    });
}

public Map<String, String> hmget(String key, List<String> fields) {
    List<String> result = redisTemplate.<String, String>opsForHash().multiGet(key, fields);
    Map<String, String> ans = new HashMap<>(fields.size());
    int index = 0;
    for (String field : fields) {
        if (result.get(index) == null) {
            continue;
        }
        ans.put(field, result.get(index));
    }
    return ans;
}
           

5. 自增

hash的value如果是數字,提供了一個自增的方式,和String中的incr/decr差不多的效果

// hash 結構的計數

public long hincr(String key, String field, long value) {
    return redisTemplate.opsForHash().increment(key, field, value);
}
           

6. hash + list

hash的value如果另外一種場景就是數組,目前沒有找到特别友好的操作方式,隻能在業務層進行相容

/**
 * value為清單的場景
 *
 * @param key
 * @param field
 * @return
 */
public <T> List<T> hGetList(String key, String field, Class<T> obj) {
    Object value = redisTemplate.opsForHash().get(key, field);
    if (value != null) {
        return JSONObject.parseArray(value.toString(), obj);
    } else {
        return new ArrayList<>();
    }
}

public <T> void hSetList(String key, String field, List<T> values) {
    String v = JSONObject.toJSONString(values);
    redisTemplate.opsForHash().put(key, field, v);
}
           

II. 其他

0. 項目

  • 工程:spring-boot-demo

1. 一灰灰Blog

  • 一灰灰Blog個人部落格 https://blog.hhui.top
  • 一灰灰Blog-Spring專題部落格 http://spring.hhui.top

一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛

2. 聲明

盡信書則不如,以上内容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

  • 微網誌位址: 小灰灰Blog
  • QQ: 一灰灰/3302797840

3. 掃描關注

一灰灰blog

SpringBoot進階篇Redis之Hash資料結構使用姿勢

知識星球

SpringBoot進階篇Redis之Hash資料結構使用姿勢

繼續閱讀