欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis模糊批量刪除key的方法

 更新時間:2022年12月16日 15:05:51   作者:杰哥的技術雜貨鋪  
這篇文章主要介紹了redis模糊批量清除key的操作方法,包括命令行刪除和golang代碼刪除,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、命令行刪除

redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 KEYS "websocket127.0.0.1:5*" | xargs redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 DEL
  • -h:redis地址
  • -p:redis端口
  • -n:reids庫
  • -a:redis密碼

Redis 提供了一個簡單暴力的指令 keys 用來列出所有滿足特定正則字符串規(guī)則的 key。

注:這個指令使用非常簡單,提供一個簡單的正則字符串即可,但是有很明顯的兩個缺點。

  • 沒有 offset、limit 參數,一次性吐出所有滿足條件的 key,萬一實例中有幾百 w 個 key 滿足條件,
  • 當你看到滿屏的字符串刷的沒有盡頭時,你就知道難受了。
  • keys 算法是遍歷算法,復雜度是 O(n),如果實例中有千萬級以上的 key,這個指令就會導致 Redis 服務卡頓,
  • 所有讀寫 Redis 的其它的指令都會被延后甚至會超時報錯,
  • 因為 Redis 是單線程程序,順序執(zhí)行所有指令,其它指令必須等到當前的 keys 指令執(zhí)行完了才可以繼續(xù)。

所以建議生產環(huán)境屏蔽keys命令

scan 相比 keys 具備有以下特點:

  • 復雜度雖然也是 O(n),但是它是通過游標分步進行的,不會阻塞線程;
  • 提供 limit 參數,可以控制每次返回結果的最大條數,limit 只是對增量式迭代命令的一種提示(hint),返回的結果可多可少;
  • 同 keys 一樣,它也提供模式匹配功能;
  • 服務器不需要為游標保存狀態(tài),游標的唯一狀態(tài)就是 scan 返回給客戶端的游標整數;
  • 返回的結果可能會有重復,需要客戶端去重復,這點非常重要;
  • 遍歷的過程中如果有數據修改,改動后的數據能不能遍歷到是不確定的;
  • 單次返回的結果是空的并不意味著遍歷結束,而要看返回的游標值是否為零

KEYS vs SCAN

一樣都會掃過所有的 key,scan 不會阻塞整個 server,而是迭代的收集結果

DEL vs UNLINK

一樣都是刪除 key ,差別在於 unlink 是非阻塞的刪除,會以非同步的方式回收記憶體

所以對于一個大的key數量,我們可以借助sscan使用下邊的命令可以實現優(yōu)雅的批量刪除:

redis-cli -h 172.18.255.99 -p 6379 --scan --pattern users:* | xargs redis-cli -h 172.18.255.99 -p 6379 unlink
  • 用 scan 找出要刪的 key
  • 透過 xargs 傳給 unlink 刪掉 key
(error) ERR unknown command 'unlink'

如果出現以上錯誤,說明redis版本不足,使用unlink需要Redis4版本

cluster 刪除數據

redis-cli -c -p 7000 --scan --pattern "age_*" | xargs -L 1 redis-cli -c -p 7000 -n 0 unlink

遍歷redis cluster各分片刪除

for port in {7000..7005}; do
    redis-cli -c -p ${port} -h 192.168.31.181 --scan --pattern "age_*" | xargs -L 1 redis-cli -h 192.168.31.181 -c -p ${port} -n 0 unlink  
done

二、golang代碼刪除

func DeleteRedisKeys(key string) {
	traceId := libra.GenTraceId(context.Background(), nil)
	ctx := libra.SetTraceId(context.Background(), traceId)
	//模糊查詢所有符合條件的key
	websocketKeys, _ := commons.GetRedisClient().Keys(ctx, key+"*").Result()
	if reflect.TypeOf(websocketKeys).Kind() == reflect.Slice {
		val := reflect.ValueOf(websocketKeys)
		if val.Len() == 0 {
			return
		}
		// 批量刪除key
		for i := 0; i < val.Len(); i++ {
			_, err := commons.GetRedisClient().Del(ctx, val.Index(i).Interface().(string)).Result()
			dlog.Errorf("DeleteKeys addr:=%v,err=%v", addr, err)
		}
	}
}

參考文檔

Redis SCAN的使用:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

到此這篇關于redis模糊批量清除key的文章就介紹到這了,更多相關redis模糊刪除key內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Redis中序列化的兩種實現

    Redis中序列化的兩種實現

    本文主要介紹了Redis中序列化的兩種實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Linux下redis的安裝與使用圖文教程

    Linux下redis的安裝與使用圖文教程

    這篇文章主要介紹了Linux下redis的安裝與使用,結合圖文形式分析了Linux環(huán)境下redis的下載、編譯、安裝、部署、訪問等相關操作技巧,需要的朋友可以參考下
    2019-08-08
  • redis安裝和配置_動力節(jié)點Java學院整理

    redis安裝和配置_動力節(jié)點Java學院整理

    這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • redis中hiredis-API函數的調用方法

    redis中hiredis-API函數的調用方法

    這篇文章主要介紹了redis中hiredis-API函數的調用,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-09-09
  • 查看redis占用內存的實現方法

    查看redis占用內存的實現方法

    這篇文章主要介紹了查看redis占用內存的實現方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Redis高并發(fā)緩存設計問題與性能優(yōu)化

    Redis高并發(fā)緩存設計問題與性能優(yōu)化

    本文詳細介紹了Redis緩存設計中常見的問題及解決方案,包括緩存穿透、緩存失效(擊穿)、緩存雪崩、熱點緩存key重建優(yōu)化、緩存與數據庫雙寫不一致以及開發(fā)規(guī)范與性能優(yōu)化,感興趣的可以了解一下
    2024-11-11
  • Redis實現主從復制方式(Master&Slave)

    Redis實現主從復制方式(Master&Slave)

    這篇文章主要介紹了Redis實現主從復制方式(Master&Slave),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 如何使用gradle將java項目推送至maven中央倉庫

    如何使用gradle將java項目推送至maven中央倉庫

    本文主要介紹了使用gradle將java項目推送至maven中央倉庫,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • redis哨兵常用命令和監(jiān)控示例詳解

    redis哨兵常用命令和監(jiān)控示例詳解

    哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行,接下來通過本文給大家講解redis哨兵常用命令和監(jiān)控知識,感興趣的朋友一起學習吧
    2021-05-05
  • Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解

    Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解

    在Spring Cloud項目中,使用Java和Redis結合實現的分布式鎖可以確保訂單的一致性和并發(fā)控制,通過合理使用鎖的粒度以及注意事項,可以減少死鎖問題并提高系統(tǒng)的并發(fā)性能,這篇文章主要介紹了Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解,需要的朋友可以參考下
    2023-10-10

最新評論