文章目錄
- ?介紹
- ?命令
- ?RedisTemplate API
- ?應用場景
?介紹
Hash類型,也叫散列,其value是一個無序字典,類似于Java中的 HashMap 結構。
String結構是將對象序列化為JSON字符串后存儲,當需要修改對象某個字段時很不方便:
key | value |
---|---|
snow:user:1 | {“id”:1, “name”: “Snow”, “age”: 88} |
snow:product:1 | {“id”:1, “name”: “Apple”, “price”: 9999} |
Hash結構可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD:
?命令
Hash 類型的常見命令🌈🌈
● HSET key field value
:添加或者修改 hash 類型 key 的 field 的值
● HGET key field
:獲取一個hash類型key的field的值
● HMSET
:批量添加多個hash類型key的field的值
● HMGET
:批量獲取多個hash類型key的field的值
● HGETALL
:獲取一個hash類型的key中的所有的field和value
● HKEYS
:獲取一個hash類型的key中的所有的field
● HVALS
:獲取一個hash類型的key中的所有的value
● HINCRBY
:讓一個hash類型key的字段值自增并指定步長
● HSETNX
:添加一個hash類型的key的field值,前提是這個field不存在,否則不執行
?RedisTemplate API
添加 put / putAll
// 初始數據:
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);
僅當hashKey不存在時才設置散列hashKey的值。
System.out.println(template.opsForHash().putIfAbsent("redisHash","age",30));
System.out.println(template.opsForHash().putIfAbsent("redisHash","kkk","kkk"));
//結果:
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));
// 結果:
26
27
獲取key所對應的散列表的key
System.out.println(template.opsForHash().keys("redisHash1"));
//redisHash1所對應的散列表為{class=1, name=jack, age=27}
//結果:[name, class, age]
獲取key所對應的散列表的大小個數
template.opsForHash().size("redisHash1");
//redisHash1所對應的散列表為{class=1, name=jack, age=27}
//結果:3
獲取整個哈希存儲的值
template.opsForHash().values("redisHash");
// 結果:[tom, 26, 6]
獲取整個哈希存儲
template.opsForHash().entries("redisHash");
// 結果:{age=26, class=6, name=tom}
使用Cursor在key的hash中迭代,相當于迭代器。
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());}
//結果:
age:28.1
class:6
kkk:kkk
?應用場景
下面列舉了幾個應用場景:
-
存儲對象: 可以通過hash類型將一個對象的多個屬性以鍵值對(key-value)的形式存儲, 方便快捷。舉例來說,可以把一個用戶的姓名、年齡、郵箱,保存為 Hash 類型,并以用戶編號為 Key,這樣在更新某一個屬性時,就不需要重新寫入整個對象。
-
緩存環境變量:當使用 Redis 來做緩存系統時,我們可以把那些常用的項目配置都放到 Redis 中去,比如域名、端口號、數據庫名稱、數據庫地址的 hash 設置等,利用 Redis hash 的特性,可以使得這些配置很容易被更新,且不會持續占用內存空間。
-
購物車:購物車是一個經典的以Hash方式實現的例子,每個用戶一個購物車,每個購物車用一個哈希來表示。
-
計數器:如果您想要更靈活地定義一個String類型的計數器(例如,基于某種“維度”進行依次命名),則可以使用Hash。 每個待計數的“塊”可以用“鍵->Value”的方式存儲。
-
存儲對象屬性:同一個對象的不同屬性可以放在同一個hash類型中,例如,把一本書相關信息(作者、出版日期、價格)存成一個哈希。