Redis實戰(zhàn)(10)-Hash實戰(zhàn)之借助命令行和代碼形式認識一下哈希
作者:
修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
摘要:對于哈希數(shù)據(jù)類型Hash,有些小伙伴在實際的項目開發(fā)中相對于Redis其他的數(shù)據(jù)結(jié)構(gòu)而言,可能用得并不多。然而,從“道”的層面上看,這絲毫不影響一個客觀事實、規(guī)律的存在,那就是哈希Hash本身也很強大,從本文開始我們將介紹數(shù)據(jù)類型~哈希Hash的相關(guān)特性及其相應(yīng)的API和命令行層面上的操作!
內(nèi)容:對于數(shù)據(jù)類型哈希Hash,可能有些小伙伴在實際的項目開發(fā)中用得并不是很多,而更多的替代性方案是采用前面篇章介紹的:字符串String、列表List、集合Set、有序集合SortedSet等數(shù)據(jù)結(jié)構(gòu)。
然而,用得少歸用得少,其作用還是很強大的,特別是在存儲“同種對象類型”的數(shù)據(jù)列表時哈希Hash更能提現(xiàn)其優(yōu)勢,除此之外,其最大的、直觀上的作用便是“減少了緩存Key的數(shù)量”,而這主要還得得益于哈希Hash底層存儲數(shù)據(jù)時的存儲方式,如下圖所示:
從上圖中可以看到,哈希Hash底層存儲數(shù)據(jù)的方式確實跟其他數(shù)據(jù)結(jié)構(gòu)有點不同,其他數(shù)據(jù)結(jié)構(gòu)幾乎都是:Key-Value的存儲,而Hash則是:Key – [Field-Value] 的存儲,也就是說其他數(shù)據(jù)結(jié)構(gòu)的Value一般是確切的值,而Hash的Value是一系列的鍵值對,通常我們是這樣子稱呼Hash的存儲的:大Key為實際的Key,小Key為Field,而具體的取值為Field對應(yīng)的值。
一、命令行的方式實戰(zhàn)哈希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對應(yīng)的一個或多個字段Field:
HDEL classOne 2010
(5)查看哈希表的key中,指定的字段是否存在:
HEXISTS classOne 2010
返回值:(integer) 0
(6)獲取哈希表中指定Key的所有字段Field:
HKEYS classOne
返回值:
1) "2011"
2) "2012"
3) "2013"
(7)獲取哈希表中指定Key的所有字段對應(yīng)的值Value:
HVALS classOne
返回值:
1) "xiaohong"
2) "debug"
3) "jack"
(8)獲取哈希表中指定Key的字段的數(shù)量:
HLEN classOne
返回值:(integer)3
(9)獲取所有給定字段Field的值Value:
HMGET classOne 2011 2012
返回值:
1) "xiaohong"
2) "debug"
二、Java單元測試-代碼的方式實戰(zhàn)Hash
同樣的道理,我們?nèi)匀恍枰捎么a的形式來實戰(zhàn)哈希Hash,將其常見的命令行與實際的代碼API方法結(jié)合起來,如此才能更好的理解哈希Hash相關(guān)命令的使用:
@Test
public void method5() {
log.info("----開始哈希Hash測試");
final String key = "SpringBootRedis:Hash:Key:v1";
redisTemplate.delete(key);
HashOperations<String,String,String> hashOperations=redisTemplate.opsForHash();
hashOperations.put(key,"10010","zhangsan");
hashOperations.put(key,"10011","lisi");
Map<String,String> 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-獲取列表元素個數(shù): {} ",hashOperations.size(key));
}
其運行結(jié)果如下圖所示:
好了,本篇文章我們就介紹到這里了,建議各位小伙伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了“空談?wù)摺保?/span>
對Redis相關(guān)技術(shù)棧以及實際應(yīng)用場景實戰(zhàn)感興趣的小伙伴可以前往Debug搭建的技術(shù)社區(qū)的課程中心進行學習觀看:https://www.fightjava.com/web/index/course/detail/12 !
其他相關(guān)的技術(shù),感興趣的小伙伴可以關(guān)注底部Debug的技術(shù)公眾號,或者加Debug的微信,拉你進“微信版”的真正技術(shù)交流群!一起學習、共同成長!
補充:
1、本文涉及到的相關(guān)的源代碼可以到此地址,check出來進行查看學習:
https://gitee.com/steadyjack/SpringBootRedis
2、目前Debug已將本文所涉及的內(nèi)容整理錄制成視頻教程,感興趣的小伙伴可以前往觀看學習:https://www.fightjava.com/web/index/course/detail/12
3、關(guān)注一下Debug的技術(shù)微信公眾號,最新的技術(shù)文章、課程以及技術(shù)專欄將會第一時間在公眾號發(fā)布哦!