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)載請附上原文出處鏈接和本聲明。
摘要:對于哈希數(shù)據(jù)類型Hash,有些小伙伴在實(shí)際的項(xiàng)目開發(fā)中相對于Redis其他的數(shù)據(jù)結(jié)構(gòu)而言,可能用得并不多。然而,從“道”的層面上看,這絲毫不影響一個(gè)客觀事實(shí)、規(guī)律的存在,那就是哈希Hash本身也很強(qiáng)大,從本文開始我們將介紹數(shù)據(jù)類型~哈希Hash的相關(guān)特性及其相應(yīng)的API和命令行層面上的操作!
內(nèi)容:對于數(shù)據(jù)類型哈希Hash,可能有些小伙伴在實(shí)際的項(xiàng)目開發(fā)中用得并不是很多,而更多的替代性方案是采用前面篇章介紹的:字符串String、列表List、集合Set、有序集合SortedSet等數(shù)據(jù)結(jié)構(gòu)。
然而,用得少歸用得少,其作用還是很強(qiáng)大的,特別是在存儲(chǔ)“同種對象類型”的數(shù)據(jù)列表時(shí)哈希Hash更能提現(xiàn)其優(yōu)勢,除此之外,其最大的、直觀上的作用便是“減少了緩存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ǔ),也就是說其他數(shù)據(jù)結(jié)構(gòu)的Value一般是確切的值,而Hash的Value是一系列的鍵值對,通常我們是這樣子稱呼Hash的存儲(chǔ)的:大Key為實(shí)際的Key,小Key為Field,而具體的取值為Field對應(yīng)的值。
一、命令行的方式實(shí)戰(zhàn)哈希Hash
接下來,我們先采用命令行的方式來認(rèn)識(shí)認(rèn)識(shí)這位大佬,如下圖所示,debug給各位小伙伴羅列出了常見、常用的命令行列表:
(1)往哈希表指定的Key添加File-Value對(單獨(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對應(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的所有字段對應(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單元測試-代碼的方式實(shí)戰(zhàn)Hash
同樣的道理,我們?nèi)匀恍枰捎么a的形式來實(shí)戰(zhàn)哈希Hash,將其常見的命令行與實(shí)際的代碼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-獲取列表元素個(gè)數(shù): {} ",hashOperations.size(key));
}
其運(yùn)行結(jié)果如下圖所示:
好了,本篇文章我們就介紹到這里了,建議各位小伙伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了“空談?wù)摺保?/span>
對Redis相關(guān)技術(shù)棧以及實(shí)際應(yī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í)、共同成長!
補(bǔ)充:
1、本文涉及到的相關(guān)的源代碼可以到此地址,check出來進(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ā)布哦!