更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題
Redis的五大數據結構,前面講述了String和List的使用姿式,而Hash數據結構,也是比較經常使用的,接下來看下hash數據結構的讀取,刪除,塞入的基本使用姿式java
原文鏈接: 181202-SpringBoot高級篇Redis之Hash數據結構使用姿式git
在開始以前,序列化的指定須要額外處理,上一篇已經說起,相關內容能夠參考:github
hash數據結構和咱們理解jdk中的hash差很少,使用的姿式也沒什麼區別,須要注意的是須要,定位一個元素,須要由緩存的key + hash的key-field
redis
/** * 獲取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(); }
/** * 添加or更新hash的值 * * @param key * @param field * @param value */ public void hset(String key, String field, String value) { redisTemplate.opsForHash().put(key, field, value); }
hash最好的一個地方,我我的感受就是在刪除時特別方便,好比將同類的數據彙集在一個hash中,刪除key就能夠實現所有都刪除,清理數據就比較方便了;除此以外,另一種就是刪除hash中的部分keyspring
/** * 刪除hash中field這一對kv * * @param key * @param field */ public void hdel(String key, String field) { redisTemplate.opsForHash().delete(key, field); }
批量查詢有兩種,一個是所有撈出來,一個是撈出指定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; }
hash的value若是是數字,提供了一個自增的方式,和String中的incr/decr差很少的效果緩存
// hash 結構的計數 public long hincr(String key, String field, long value) { return redisTemplate.opsForHash().increment(key, field, value); }
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); }
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛spring-boot
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激學習
一灰灰blog
知識星球