解決Java Redis刪除HashMap中的key踩到的坑
Java使用Redis刪除HashMap中的key時(shí),取出對(duì)應(yīng)的HashMap后通過(guò)Java中HashMap的remove方法移除key然后重新調(diào)用redis的Hmset方法將覆蓋無(wú)效
示例代碼//通過(guò)key取出對(duì)應(yīng)的HashMapMap<String, String> ruleMap = jedisCluster.hgetAll('HashKey');//通過(guò)java中移除HashMap中的KeyruleMap.remove('ruleA');//將移除后的HashMap重新存入redis的hashmap中jedisCluster.hmset(key, ruleMap);//問(wèn)題來(lái)了,這里通過(guò)HashKey從redis中取出HashMap時(shí)發(fā)現(xiàn)ruleA的key的內(nèi)容還在存在Map<String, String> newRuleMap = jedisCluster.hgetAll('HashKey');System.out.println(newRuleMap);解決方案
通過(guò)hdel命令刪除指定HashMap中指定Key:
使用HDEL key field [field …]:
刪除哈希表 key 中的一個(gè)或多個(gè)指定域,不存在的域?qū)⒈缓雎?/p>示例代碼
//通過(guò)redis中針對(duì)hashmap移除指定key函數(shù)進(jìn)行處理jedisCluster.hdel('HashKey', 'ruleA');原理
redis中的散列表在進(jìn)行存儲(chǔ)值時(shí),只會(huì)將客戶端上送的hashmap中存在的key在redis中查找對(duì)應(yīng)的key值進(jìn)行覆蓋重寫,
至于通過(guò)Java代碼對(duì)該HashMap進(jìn)行的remove操作在redis中并不會(huì)感知到,
所以在通過(guò)HMSET函數(shù)進(jìn)行操作時(shí),redis只會(huì)找到key覆寫,不會(huì)執(zhí)行del操作,實(shí)際針對(duì)redis中的hashmap key的刪除只能通過(guò)HDEL函數(shù)
示例代碼我們通過(guò)Jedis包中 redis.clients.jedis.BinaryClient.hmset方法的源碼來(lái)看,最終發(fā)往redis服務(wù)器執(zhí)行的命令時(shí)的操作
//實(shí)際上在發(fā)往redis執(zhí)行命令前,會(huì)將HashMap中的轉(zhuǎn)成字節(jié)數(shù)據(jù)集合public void hmset(byte[] key, Map<byte[], byte[]> hash) { List<byte[]> params = new ArrayList(); params.add(key); Iterator i$ = hash.entrySet().iterator(); while(i$.hasNext()) { Entry<byte[], byte[]> entry = (Entry)i$.next(); params.add(entry.getKey()); params.add(entry.getValue()); } this.sendCommand(Command.HMSET, (byte[][])params.toArray(new byte[params.size()][]));}
實(shí)際對(duì)應(yīng)的redis命令即為:
redis 127.0.0.1:6379> HSET HashKey 'ruleA' 'valA' 'ruleB' 'valB'
補(bǔ)充:redis整體刪除,整個(gè)hash刪除,批量刪除,單個(gè)刪除,正則刪除
對(duì)于redis的hash數(shù)據(jù)結(jié)構(gòu)的刪除:pool = redis.ConnectionPool(host=’127.0.0.1’,port=6381,db=0,decode_responses=True)r = redis.Redis(connection_pool=pool)pool = redis.ConnectionPool(host=’127.0.0.1’,port=6381,decode_responses=True)r = redis.Redis(connection_pool=pool)r = redis.Redis(host=’127.0.0.1’,port=6381,db=0,decode_responses=True)
以上三種連接數(shù)據(jù)庫(kù)的方式都測(cè)試過(guò)有效,主要是后面的decode_responses參數(shù)可以省去二進(jìn)制寫入。
整個(gè)數(shù)據(jù)庫(kù)的刪除:r.fushall()批量刪除hash整體的大字典:
r.delete(*r.keys(’^test’)) #表示刪除以test開頭的hash大字典。r.delete(key1,key2)#表示刪除key1字典和key2字典整個(gè)hash字典刪除:
r.delete(dict_name)批量刪除具體某個(gè)hash字典的多個(gè)鍵:
r.hdel(dict_name,key1)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. ASP.NET MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)2. ASP.NET MVC使用JSAjaxFileUploader插件實(shí)現(xiàn)單文件上傳3. 使用ajax跨域調(diào)用springboot框架的api傳輸文件4. Python dict的常用方法示例代碼5. 使用AJAX實(shí)現(xiàn)上傳文件6. Python Matplotlib簡(jiǎn)易教程(小白教程)7. PHP數(shù)組操作詳細(xì)解釋8. java中redis增刪查以及清理緩存的案例9. Android實(shí)現(xiàn)下載進(jìn)度條效果10. 解決python logging遇到的坑 日志重復(fù)打印問(wèn)題
