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