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

知識星球