基於SpringBoot2.0 實戰緩存Redis數據結構 Hash

摘要

對於哈希數據類型Hash,有些小夥伴在實際的項目開發中相對於Redis其他的數據結構而言,可能用得並不多。然而,從"道"的層面上看,這絲毫不影響一個客觀事實、規律的存在,那就是哈希Hash本身也很強大,從本文開始我們將介紹數據類型~哈希Hash的相關特性及其相應的API和命令行層面上的操作!

內容

對於數據類型哈希Hash,可能有些小夥伴在實際的項目開發中用得並不是很多,而更多的替代性方案是採用前面篇章介紹的:字符串String、列表List、集合Set、有序集合SortedSet等數據結構。

然而,用得少歸用得少,其作用還是很強大的,特別是在存儲"同種對象類型"的數據列表時哈希Hash更能體現其優勢,除此之外,其最大的、直觀上的作用便是"減少了緩存Key的數量",而這主要還得得益於哈希Hash底層存儲數據時的存儲方式,如下圖所示:

基於SpringBoot2.0 實戰緩存Redis數據結構 Hash

從上圖中可以看到,哈希Hash底層存儲數據的方式確實跟其他數據結構有點不同,其他數據結構幾乎都是:Key-Value的存儲,而Hash則是:Key – [Field-Value] 的存儲,也就是說其他數據結構的Value一般是確切的值,而Hash的Value是一系列的鍵值對,通常我們是這樣子稱呼Hash的存儲的:大Key為實際的Key,小Key為Field,而具體的取值為Field對應的值。

一、命令行的方式實戰哈希Hash

接下來,我們先採用命令行的方式來認識認識這位大佬,如下圖所示,debug給各位小夥伴羅列出了常見、常用的命令行列表:

基於SpringBoot2.0 實戰緩存Redis數據結構 Hash

(1)往哈希表指定的Key添加File-Value對(單獨添加Field-Value:HSET key field value;HSETNX key field value):

HMSET classOne 2010 xiaoming 2011 xiaohong 2012 debug 2013 jack

(2)獲取哈希表中指定 Key的所有字段和值

HGETALL classOne返回值:1) "2010"2) "xiaoming"3) "2011"4) "xiaohong"5) "2012"6) "debug"7) "2013"8) "jack"

(3)獲取存儲在哈希表中Key指定字段的值

HGET classOne 2010返回值:"xiaoming"

(4)刪除哈希表中key對應的一個或多個字段Field

HDEL classOne 2010

(5)查看哈希表的key中,指定的字段是否存在

HEXISTS classOne 2010返回值:(integer) 0

(6)獲取哈希表中指定Key的所有字段Field

HKEYS classOne返回值:1) "2011"2) "2012"3) "2013"

(7)獲取哈希表中指定Key的所有字段對應的值Value

HVALS classOne返回值:1) "xiaohong"2) "debug"3) "jack"

(8)獲取哈希表中指定Key的字段的數量

HLEN classOne返回值:(integer)3

(9)獲取所有給定字段Field的值Value

HMGET classOne 2011 2012返回值:1) "xiaohong"2) "debug"

二、Java單元測試-代碼的方式實戰Hash

同樣的道理,我們仍然需要採用代碼的形式來實戰哈希Hash,將其常見的命令行與實際的代碼API方法結合起來,如此才能更好的理解哈希Hash相關命令的使用:

@Test    public void method5() {        log.info("----開始哈希Hash測試");        final String key = "SpringBootRedis:Hash:Key:v1";        redisTemplate.delete(key);        HashOperations hashOperations=redisTemplate.opsForHash();        hashOperations.put(key,"10010","zhangsan");        hashOperations.put(key,"10011","lisi");        Map dataMap= Maps.newHashMap();        dataMap.put("10012","wangwu");        dataMap.put("10013","zhaoliu");        hashOperations.putAll(key,dataMap);        log.info("---哈希hash-獲取列表元素: {} ",hashOperations.entries(key));        log.info("---哈希hash-獲取10012的元素: {} ",hashOperations.get(key,"10012"));        log.info("---哈希hash-獲取所有元素的field列表: {} ",hashOperations.keys(key));        log.info("---哈希hash-10013成員是否存在: {} ",hashOperations.hasKey(key,"10013"));        log.info("---哈希hash-10014成員是否存在: {} ",hashOperations.hasKey(key,"10014"));        hashOperations.putIfAbsent(key,"10020","sunwukong");        log.info("---哈希hash-獲取列表元素: {} ",hashOperations.entries(key));        log.info("---哈希hash-刪除元素10010 10011: {} ",hashOperations.delete(key,"10010","10011"));        log.info("---哈希hash-獲取列表元素: {} ",hashOperations.entries(key));        log.info("---哈希hash-獲取列表元素個數: {} ",hashOperations.size(key));    } 

其運行結果如下圖所示:

基於SpringBoot2.0 實戰緩存Redis數據結構 Hash

好了,本篇文章我們就介紹到這裡了,建議各位小夥伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了"空談者"!

對Redis相關技術棧以及實際應用場景實戰感興趣的小夥伴可以前往Debug搭建的技術社區的課程中心進行學習觀看:http://www.fightjava.com/web/index/course/detail/12

其他相關的技術,感興趣的小夥伴可以私信Debug!


分享到:


相關文章: