Redis 大Key的刪除的實(shí)現(xiàn)策略
1 定義
Redis大Key其實(shí)不是指的是Key,而是指Key對(duì)應(yīng)的Value。
Redis的String類型,最大可以存512MB的值,List、Hash、Set、ZSet等,可以存儲(chǔ)232個(gè)元素(大約42億多點(diǎn)),那么多大的Key算大Key呢?
一般來(lái)說(shuō),我們String需要控制在10KB以下,而集合類型的控制元素個(gè)數(shù)在5000個(gè)以下。
2 如何導(dǎo)致的大Key
一種,比如社交類的場(chǎng)景,如粉絲數(shù)增多,另外一種,可能由于報(bào)表等常年累月的積累,有可能導(dǎo)致大Key。
我們知道,由于Redis工作線程是單線程的,大Key刪除會(huì)導(dǎo)致網(wǎng)絡(luò)瀏覽阻塞、超時(shí)等一系列問(wèn)題,那么我們就應(yīng)該去防止大KEY的產(chǎn)生
3 如何檢測(cè)大Key
一般來(lái)說(shuō),有兩種方法:
- 使用
--bigkeys
:掃描所有的鍵,給出每種數(shù)據(jù)結(jié)構(gòu)Top 1 bigkey
[root@localhost ~]# redis-cli -a Redis密碼 --bigkeys Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed). [00.00%] Biggest string found so far '"k5889"' with 5 bytes [00.00%] Biggest string found so far '"k607267"' with 7 bytes [00.00%] Biggest string found so far '"k1802564"' with 8 bytes [50.00%] Sampled 1000000 keys so far [100.00%] Sampled 2000000 keys so far -------- summary ------- Sampled 2000000 keys in the keyspace! Total key length in bytes is 14888896 (avg len 7.44) Biggest string found '"k1802564"' has 8 bytes 0 lists with 0 items (00.00% of keys, avg size 0.00) 0 hashs with 0 fields (00.00% of keys, avg size 0.00) 2000000 strings with 14888896 bytes (100.00% of keys, avg size 7.44) 0 streams with 0 entries (00.00% of keys, avg size 0.00) 0 sets with 0 members (00.00% of keys, avg size 0.00) 0 zsets with 0 members (00.00% of keys, avg size 0.00)
- 使用
Memery Usage
:獲取一個(gè)鍵的所占內(nèi)存
127.0.0.1:6379> MEMORY USAGE k10000 (integer) 64
4 大Key的刪除
4.1 String類型
String類型一般用Del
即可,如果過(guò)于龐大可以使用Unlink
4.2 Hash類型
使用hscan
每次獲取少量field-value
,再使用hdel
刪除每個(gè)field
public void delBigHash(String bigHashKey) { ScanParams scanParams = new ScanParams().count(100); String cursor = "0"; do { ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams); List<Entry<String, String>> entryList = scanResult.getResult(); if (CollectionUtils.isNotEmpty(entryList)) { for (Entry<String, String> entry : entryList) { jedis.hdel(bigHashKey, entry.getKey()); } } cursor = scanResult.getCursor(); } while (!"0".equals(cursor)); jedis.del(bigHashKey); }
4.3 List類型
使用ltrim
漸進(jìn)式逐步刪除,直到全部刪除完成
public void delBigList(String bigListKey){ long llen = jedis.llen(bigListKey); int counter = 0; int left = 100; while (counter < llen) { jedis.ltrim(bigListKey, left, llen); counter += left; } jedis.del(bigListKey); }
4.4 Set類型
使用sscan
每次獲取部分元素,再使用srem
命令刪除每個(gè)元素
public void delBigSet(String bigSetKey){ ScanParams scanParams = new ScanParams().count(100); String cursor = "0"; do { ScanResult<String> scanResult = jedis.sscan(bigSetKey, cursor, scanParams); List<String> memberList = scanResult.getResult(); if (CollectionUtils.isNotEmpty(memberList)) { for (String member : memberList) { jedis.srem(bigSetKey, member); } } cursor = scanResult.getCursor(); } while (!"0".equals(cursor)); jedis.del(bigSetKey); }
4.5 ZSet類型
使用zscan
每次獲取部分元素,再使用ZREMRANGEBYRANK
命令刪除每個(gè)元素
public void delBigZSet(String bigZSetKey){ ScanParams scanParams = new ScanParams().count(100); String cursor = "0"; do { ScanResult<Tuple> scanResult = jedis.zscan(bigZSetKey, cursor, scanParams); List<Tuple> tupleList = scanResult.getResult(); if (CollectionUtils.isNotEmpty(tupleList)) { for (Tuple tuple : tupleList) { jedis.zrem(bigZSetKey, tuple.getElement()); } } cursor = scanResult.getCursor(); } while (!"0".equals(cursor)); jedis.del(bigZSetKey); }
到此這篇關(guān)于Redis 大Key的刪除的實(shí)現(xiàn)策略的文章就介紹到這了,更多相關(guān)Redis 大Key刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析Redis中String數(shù)據(jù)類型及其底層編碼
這篇文章主要介紹?Redis?中?String?數(shù)據(jù)類型及其底層編碼,文中有詳細(xì)的代碼示例,對(duì)大家的工作及學(xué)習(xí)有一定的幫助,需要的朋友可以參考下2023-05-05redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹
本文主要向大家介紹了redis實(shí)現(xiàn)計(jì)數(shù)器防止刷單的方法和有關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11解決redis服務(wù)啟動(dòng)失敗的問(wèn)題
今天小編就為大家分享一篇解決redis服務(wù)啟動(dòng)失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用
這篇文章主要為大家介紹了Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Redis大key多key拆分實(shí)現(xiàn)方法解析
這篇文章主要介紹了Redis大key多key拆分實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11基于Redis的分布式鎖的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了基于Redis的分布式鎖的簡(jiǎn)單實(shí)現(xiàn)方法,Redis官方給出兩種思路,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫(kù)管理詳解
這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫(kù)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Redis數(shù)據(jù)一致性問(wèn)題的三種解決方案
Redis(Remote?Dictionary?Server?),是一個(gè)高性能的基于Key-Value結(jié)構(gòu)存儲(chǔ)的NoSQL開源數(shù)據(jù)庫(kù),大部分公司采用Redis來(lái)實(shí)現(xiàn)分布式緩存,用來(lái)提高數(shù)據(jù)查詢效率,本文就給大家介紹三種Redis數(shù)據(jù)一致性問(wèn)題的解決方案,需要的朋友可以參考下2023-07-07