SpringBoot系列教程之RedisTemplate Hash數據結構使用教程

更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題

Redis的五大數據結構,前面講述了String和List的使用姿式,而Hash數據結構,也是比較經常使用的,接下來看下hash數據結構的讀取,刪除,塞入的基本使用姿式java

原文鏈接: 181202-SpringBoot高級篇Redis之Hash數據結構使用姿式git

I. 基本使用

在開始以前,序列化的指定須要額外處理,上一篇已經說起,相關內容能夠參考:github

1. 查詢元素

hash數據結構和咱們理解jdk中的hash差很少,使用的姿式也沒什麼區別,須要注意的是須要,定位一個元素,須要由緩存的key + hash的key-fieldredis

/**
 * 獲取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中的部分keyspring

/**
 * 刪除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. 項目

1. 一灰灰Blog

一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛spring-boot

2. 聲明

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

3. 掃描關注

一灰灰blog

QrCode

知識星球

goals

相關文章
相關標籤/搜索