摘要
對於哈希數據類型Hash,有些小夥伴在實際的項目開發中相對於Redis其他的數據結構而言,可能用得並不多。然而,從"道"的層面上看,這絲毫不影響一個客觀事實、規律的存在,那就是哈希Hash本身也很強大,從本文開始我們將介紹數據類型~哈希Hash的相關特性及其相應的API和命令行層面上的操作!
內容
對於數據類型哈希Hash,可能有些小夥伴在實際的項目開發中用得並不是很多,而更多的替代性方案是採用前面篇章介紹的:字符串String、列表List、集合Set、有序集合SortedSet等數據結構。
然而,用得少歸用得少,其作用還是很強大的,特別是在存儲"同種對象類型"的數據列表時哈希Hash更能體現其優勢,除此之外,其最大的、直觀上的作用便是"減少了緩存Key的數量",而這主要還得得益於哈希Hash底層存儲數據時的存儲方式,如下圖所示:
從上圖中可以看到,哈希Hash底層存儲數據的方式確實跟其他數據結構有點不同,其他數據結構幾乎都是:Key-Value的存儲,而Hash則是:Key – [Field-Value] 的存儲,也就是說其他數據結構的Value一般是確切的值,而Hash的Value是一系列的鍵值對,通常我們是這樣子稱呼Hash的存儲的:大Key為實際的Key,小Key為Field,而具體的取值為Field對應的值。
一、命令行的方式實戰哈希Hash
接下來,我們先採用命令行的方式來認識認識這位大佬,如下圖所示,debug給各位小夥伴羅列出了常見、常用的命令行列表:
(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)); }
其運行結果如下圖所示:
好了,本篇文章我們就介紹到這裡了,建議各位小夥伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了"空談者"!
對Redis相關技術棧以及實際應用場景實戰感興趣的小夥伴可以前往Debug搭建的技術社區的課程中心進行學習觀看:
http://www.fightjava.com/web/index/course/detail/12 !其他相關的技術,感興趣的小夥伴可以私信Debug!
閱讀更多 程序員實戰基地 的文章