Redis操作哈希結(jié)構(gòu)數(shù)據(jù)

今天帶來的是Redis操作Hash??傮w上來講與操作字符串的方式基本相同。hash類似于java中的map,存儲(chǔ)的基本上都是String類型的key和value的鍵值對(duì),在內(nèi)存足夠大的情況下,一個(gè)hash結(jié)構(gòu)可以存儲(chǔ)2的32次方-1個(gè)鍵值對(duì)。但是需要注意的是,由于 redis是一個(gè)內(nèi)存數(shù)據(jù)庫, 所有數(shù)據(jù)基本上都存在于內(nèi)存當(dāng)中, 會(huì)定時(shí)以追加或者快照的方式刷新到硬盤中。所以當(dāng)我們讀取大量數(shù)據(jù)的時(shí)候,我們要考慮到對(duì)JVM內(nèi)存的影響。?
同時(shí)在接下來我們的操作中我們會(huì)看到,Redis對(duì)hash 的操作與對(duì)字符串的操作相比,都會(huì)多一個(gè)hash名作為參數(shù),這是需要注意的。
Redis存hash數(shù)據(jù)
添加整個(gè)Hash?
@RequestMapping("hmset")
????@ResponseBody
????public?Map<String,Object> hmset(){
????????Map<String,Object> map = new?HashMap<>();
????????map.put("f1","value1");
????????map.put("f2","value2");
????????stringRedisTemplate.opsForHash().putAll("hash",map);
????????return??map;
????}由于此時(shí)我們存取的都是String類型的數(shù)據(jù),所以我使用的依然是StringRedisTemplete,上述操作完成后在可視化工具中可見

向已經(jīng)存在的hash結(jié)構(gòu)中添加或修改數(shù)據(jù) ?
@RequestMapping("hset")
????@ResponseBody
????public?Map<String,Object> hset(){
????????Map<String,Object> map = new?HashMap<>();
????????stringRedisTemplate.opsForHash().put("hash","f1","new value1");
????????return??map;
????}
可以看到數(shù)據(jù)已經(jīng)被修改
為hash添加數(shù)據(jù)??
@RequestMapping("hsetnx")
????@ResponseBody
????public?void?hsetnx(){
????????Boolean?success = stringRedisTemplate.opsForHash().putIfAbsent("hash","f5","9");
????????System.out.println(success);
????}putIfAbsent表示如果已經(jīng)存在對(duì)應(yīng)的key則不會(huì)添加,沒有對(duì)應(yīng)的key則添加,如圖

判斷Hash結(jié)構(gòu)中是否有輸入的key ?
@RequestMapping("hexsit")
????@ResponseBody
????public?void?hexsit(){
??????Boolean?exsit = stringRedisTemplate.opsForHash().hasKey("hash","f3");
??????System.out.println(exsit);
????}根據(jù)我們插入的數(shù)據(jù),最后控制臺(tái)輸出了false
獲取hash中的所有鍵值對(duì) ??
@RequestMapping("hgetall")
????@ResponseBody
????public?Map<Object,Object> hgetall(){
???????Map<Object,Object> map= stringRedisTemplate.opsForHash().entries("hash");
????????return??map;
????}結(jié)果可見如圖

hash實(shí)現(xiàn)加法
@RequestMapping("hincrby")
????@ResponseBody
????public?void?hincrby(){
????????stringRedisTemplate.opsForHash().put("hash","f4","8");
?????????Long f4 = stringRedisTemplate.opsForHash().increment("hash","f4",6);
?????????System.out.println(f4);
????}
hash實(shí)現(xiàn)獲取所有key的值?
@RequestMapping("hvals")
????@ResponseBody
????public?void?hvals(){
????????List可見控制臺(tái)輸出

hash實(shí)現(xiàn) 刪除元素??
@RequestMapping("hdel")
????@ResponseBody
????public?void?hdel(){
????????//返回真實(shí)刪除的個(gè)數(shù)
????????Long count = stringRedisTemplate.opsForHash().delete("hash","f2","f3");
????????System.out.println(count);//此處返回1
????}此時(shí)數(shù)據(jù)庫中不存在f3,控制臺(tái)中輸出了1.
出處:csdn.net/u011342403/article/details/79080968
