網(wǎng)站上的logo怎么做有哪些網(wǎng)絡(luò)推廣平臺(tái)
文章目錄
- ?介紹
- ?命令
- ?RedisTemplate API
- ?應(yīng)用場(chǎng)景
?介紹
Hash類型,也叫散列,其value是一個(gè)無(wú)序字典,類似于Java中的 HashMap 結(jié)構(gòu)。
String結(jié)構(gòu)是將對(duì)象序列化為JSON字符串后存儲(chǔ),當(dāng)需要修改對(duì)象某個(gè)字段時(shí)很不方便:
key | value |
---|---|
snow:user:1 | {“id”:1, “name”: “Snow”, “age”: 88} |
snow:product:1 | {“id”:1, “name”: “Apple”, “price”: 9999} |
Hash結(jié)構(gòu)可以將對(duì)象中的每個(gè)字段獨(dú)立存儲(chǔ),可以針對(duì)單個(gè)字段做CRUD:
?命令
Hash 類型的常見(jiàn)命令🌈🌈
● HSET key field value
:添加或者修改 hash 類型 key 的 field 的值
● HGET key field
:獲取一個(gè)hash類型key的field的值
● HMSET
:批量添加多個(gè)hash類型key的field的值
● HMGET
:批量獲取多個(gè)hash類型key的field的值
● HGETALL
:獲取一個(gè)hash類型的key中的所有的field和value
● HKEYS
:獲取一個(gè)hash類型的key中的所有的field
● HVALS
:獲取一個(gè)hash類型的key中的所有的value
● HINCRBY
:讓一個(gè)hash類型key的字段值自增并指定步長(zhǎng)
● HSETNX
:添加一個(gè)hash類型的key的field值,前提是這個(gè)field不存在,否則不執(zhí)行
?RedisTemplate API
添加 put / putAll
// 初始數(shù)據(jù):
template.opsForHash().put("redisHash","name","tom");
template.opsForHash().put("redisHash","age",26);
template.opsForHash().put("redisHash","class","6");Map<String,Object> testMap = new HashMap();
testMap.put("name","jack");
testMap.put("age",27);
testMap.put("class","1");
template.opsForHash().putAll("redisHash1",testMap);
僅當(dāng)hashKey不存在時(shí)才設(shè)置散列hashKey的值。
System.out.println(template.opsForHash().putIfAbsent("redisHash","age",30));
System.out.println(template.opsForHash().putIfAbsent("redisHash","kkk","kkk"));
//結(jié)果:
false
true
刪除
template.opsForHash().delete("redisHash","name")
判斷key是否存在
template.opsForHash().hasKey("redisHash","age")
獲取
template.opsForHash().get("redisHash","age")
增加散列hashKey的值(整型)
System.out.println(template.opsForHash().get("redisHash","age"));
System.out.println(template.opsForHash().increment("redisHash","age",1));
// 結(jié)果:
26
27
獲取key所對(duì)應(yīng)的散列表的key
System.out.println(template.opsForHash().keys("redisHash1"));
//redisHash1所對(duì)應(yīng)的散列表為{class=1, name=jack, age=27}
//結(jié)果:[name, class, age]
獲取key所對(duì)應(yīng)的散列表的大小個(gè)數(shù)
template.opsForHash().size("redisHash1");
//redisHash1所對(duì)應(yīng)的散列表為{class=1, name=jack, age=27}
//結(jié)果:3
獲取整個(gè)哈希存儲(chǔ)的值
template.opsForHash().values("redisHash");
// 結(jié)果:[tom, 26, 6]
獲取整個(gè)哈希存儲(chǔ)
template.opsForHash().entries("redisHash");
// 結(jié)果:{age=26, class=6, name=tom}
使用Cursor在key的hash中迭代,相當(dāng)于迭代器。
Cursor<Map.Entry<Object, Object>> curosr = ops.scan("redisHash", ScanOptions.ScanOptions.NONE);while(curosr.hasNext()){Map.Entry<Object, Object> entry = curosr.next();System.out.println(entry.getKey()+":"+entry.getValue());}
//結(jié)果:
age:28.1
class:6
kkk:kkk
?應(yīng)用場(chǎng)景
下面列舉了幾個(gè)應(yīng)用場(chǎng)景:
-
存儲(chǔ)對(duì)象: 可以通過(guò)hash類型將一個(gè)對(duì)象的多個(gè)屬性以鍵值對(duì)(key-value)的形式存儲(chǔ), 方便快捷。舉例來(lái)說(shuō),可以把一個(gè)用戶的姓名、年齡、郵箱,保存為 Hash 類型,并以用戶編號(hào)為 Key,這樣在更新某一個(gè)屬性時(shí),就不需要重新寫(xiě)入整個(gè)對(duì)象。
-
緩存環(huán)境變量:當(dāng)使用 Redis 來(lái)做緩存系統(tǒng)時(shí),我們可以把那些常用的項(xiàng)目配置都放到 Redis 中去,比如域名、端口號(hào)、數(shù)據(jù)庫(kù)名稱、數(shù)據(jù)庫(kù)地址的 hash 設(shè)置等,利用 Redis hash 的特性,可以使得這些配置很容易被更新,且不會(huì)持續(xù)占用內(nèi)存空間。
-
購(gòu)物車:購(gòu)物車是一個(gè)經(jīng)典的以Hash方式實(shí)現(xiàn)的例子,每個(gè)用戶一個(gè)購(gòu)物車,每個(gè)購(gòu)物車用一個(gè)哈希來(lái)表示。
-
計(jì)數(shù)器:如果您想要更靈活地定義一個(gè)String類型的計(jì)數(shù)器(例如,基于某種“維度”進(jìn)行依次命名),則可以使用Hash。 每個(gè)待計(jì)數(shù)的“塊”可以用“鍵->Value”的方式存儲(chǔ)。
-
存儲(chǔ)對(duì)象屬性:同一個(gè)對(duì)象的不同屬性可以放在同一個(gè)hash類型中,例如,把一本書(shū)相關(guān)信息(作者、出版日期、價(jià)格)存成一個(gè)哈希。