Redis之Keys命令和Scan命令

序言

網上看到的面試題:Redis有1億個key,其中10w個key是以某個固定的前綴開頭,如何將它們全部找出來?一般有兩種命令可以實現:

  • Keys命令
  • Scan命令

下面具體分析一下兩種命令

Keys命令

Keys pattern

如下圖所示,建了一些不同數據結構(String、Hash、List、Set、ZSet)的Key,使用命令找出前綴為prefix的Key(key區分大小寫),
在這里插入圖片描述

  • 時間復雜度O(n);
  • 筆記本電腦40毫秒內可以查100w個鍵值對;
  • 生產環境慎用,大型數據庫上執行會影響性能;

那么在大型數據庫場景下為什么不能使用該命令呢?

Keys命令是一個阻塞式操作。

  • 單線程模型:Redis的命令處理是基于單線程的。一個命令在執行時,其他所有客戶端的請求都必須等待;
  • 全量遍歷:Keys為了找出所有匹配的key,會遍歷數據庫(NoSQL)中所有的key,遍歷完成之前,Redis無法處理任何其他命令。
  • 生產環境災難:如果正在有1億個key的實例上執行Keys命令,會導致Redis服務卡頓數十秒甚至數分鐘,所有依賴Redis的業務都會出現超時和雪崩,會導致嚴重的生產事故。

Scan命令

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

在這里插入圖片描述

  • 單次調用時間復雜度O(1),完整迭代時間復雜度O(n);所以單次調用不會長時間阻塞線上服務;
  • 非阻塞式(漸進式)迭代:該命令允許增量迭代,每次調用返回少量數據,然后返回一個游標(cursor),下次傳入這個游標,Redis就會接著上次結束的地方繼續掃描,如上圖scan xxx match prefix* count 3每次返回的游標不一定按照順序;
  • COUNT參數:COUNT是一個建議值,告訴Redis希望每次迭代返回大約多少個key。但不是精確的,有時多有時少,但是可以控制單次掃描的粒度。如上圖scan xxx match prefix* count 3每次返回的數據量不一定都是3;

參看官網,相關的還有其他的一些掃描指令:

  • SSCAN:iterates elements of Sets types.(針對Set數據結構)
  • HSCAN:iterates fields of Hash types and their associated values.(針對Hash數據結構)
  • ZSCAN:iterates elements of Sorted Set types and their associated scores.(針對ZSet數據結構)

在這里插入圖片描述

實際操作

實際項目中可能會通過python腳本或者LUA腳本去執行查找,下面是使用python代碼去執行的示例代碼,

import redisr = redis.Redis(host='localhost', port=6379)
cursor = 0
prefix = 'your_prefix:*'
found_keys = []while True:cursor, keys = r.scan(cursor, match=prefix, count=10000)found_keys.extend(keys)if cursor == 0:break

可以使用Lua腳本在Redis服務器端直接處理,減少網絡往返:

local keys = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3])
return keys

其他思路

空間換時間

在這里插入圖片描述

另外維護一個“索引”:

  • 創建Key時,將key添加到前綴索引的Set集合中;
  • 查找Key時,直接讀取索引Set的所有成員,這樣時間復雜度即使是O(n),遍歷的也是10w數據,而非NoSQL數據庫中的1億條數據;
  • 刪除時,除了刪除原始key,還需要從索引Set中移除對應的成員;

從節點(Replica)執行

假設這是一個低頻且用于離線分析的需求,并且不想修改現有的數據結構,可以考慮在Redis集群(主從、哨兵、集群模式)的從節點去執行SCAN命令操作(甚至Keys命令),避免長時間耗時影響主節點(Master)的正常讀寫。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【小沐學GIS】基于Godot繪制三維數字地球Earth(Godot)

🍺三維數字地球GIS系列相關文章(C)如下🍺:1【小沐學GIS】基于C繪制三維數字地球Earth(OpenGL、glfw、glut)第一期2【小沐學GIS】基于C繪制三維數字地球Earth(OpenGL、glfw、glut&…

day62 Floyd 算法 A * 算法

Floyd 算法本題是經典的多源最短路問題.Floyd 算法對邊的權值正負沒有要求,都可以處理。Floyd算法核心思想是動態規劃。例如我們再求節點1 到 節點9 的最短距離,用二維數組來表示即:grid[1][9],如果最短距離是10 ,那就…

【軟考論文】論可觀測性架構技術的應用

🎁 考高級架構師的小伙伴注意了!📢 軟考架構論文示例 2025年11月軟考架構論文預測👍 一、歷年論文題目 無!!! 二、考情分析 “可觀測性技術”這一論題,目前在高級架構師與高級系統分…

軟件測試:測試分類(一)

常用測試分類1.功能測試(人對功能的確定,保證某個功能可以正常進行)如驗證你輸入正確的手機號碼和密碼是否登錄成功。手機號碼不存在是否有提示,密碼不正確是否有提示等2.自動化測試(如jmeter,屬于黑盒測試…

BigFoot (Method Raid Tools)[MRT] (Event Alert Mod)[EAM]

檢查法術技能ID,需要EAM命令,所以要先安裝EAM BigFoot EventAlertMod lua-CSDN博客 /eam lookup 冰封之韌 同時我們發現一個糟糕的問題,為什么會有這么多ID呢,默認第一個 還有一種法子就是讓別人開了技能告訴你ID,最…

【Scrapy-Redis】分布式爬蟲實戰(非常詳細)

一、概要 1.分布式爬蟲概念 分布式爬蟲是一種利用多臺機器協同工作的網絡爬蟲系統,通過任務分解、并行處理和資源共享,高效抓取并處理海量網頁數據。其核心在于將爬取任務分配到不同節點,避免單點性能瓶頸,同時支持動態擴展和容錯…

基于51單片機智能化交通紅綠燈堵車流量紅外設計

1 系統功能介紹 本設計題目為 基于51單片機智能化交通紅綠燈堵車流量紅外設計,主要用于十字路口交通信號智能控制,通過紅外避障檢測車流量,自動調節紅綠燈時間,緩解擁堵。該系統由單片機、LED燈、紅外避障傳感器、LCD1602液晶顯示…

VsCode 上的Opencv(C++)環境配置(Linux)

1.下載Opencv1.新建文件demo_cpp,在demo_cpp中新建third_parties文件2.OPENCV官網下載OpenCV-4.12.03.將下載好的opencv-4.12.0.zip壓縮包在third_parties中解壓,//以下均無特殊說明,均在vscode里的TERMINAL中輸入 sudo apt-get install unzip//用于解壓.zip文件 cd third_part…

sql xml模板

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"com.example.mapper.UserMapper&quo…

docker在自定義網絡中安裝ElasticSearch和Kibana

創建自定義網絡 創建一個名為 es-net 的橋接網絡。這將作為 Elasticsearch 和 Kibana 的私有通信通道。 # 創建網絡 docker network create es-net # 查看網絡是否創建成功 docker network ls啟動 Elasticsearch 容器 安裝命令 docker run -d \--name elasticsearch \--net…

基于51單片機射頻RFID停車刷卡計時收費系統設計

1 系統功能介紹 本設計題目為 基于51單片機射頻RFID停車刷卡計時收費系統設計&#xff0c;旨在實現停車場車輛的刷卡計時和收費管理。系統通過單片機控制&#xff0c;結合 RFID 射頻識別技術、LCD1602 顯示以及蜂鳴器報警&#xff0c;實現停車時間的智能計時、累加及超時提醒功…

Netty源碼—性能優化和設計模式

1.Netty的兩大性能優化工具 (1)FastThreadLocal FastThreadLocal的作用與ThreadLocal相當&#xff0c;但比ThreadLocal更快。ThreadLocal的作用是多線程訪問同一變量時能夠通過線程本地化的方式避免多線程競爭、實現線程隔離。 Netty的FastThreadLocal重新實現了JDK的ThreadLoc…

Linux網絡設備分析

?? Linux 網絡設備驅動深入分析 本文將詳細分析 Linux 網絡設備驅動的工作原理、實現機制和代碼框架,并通過一個虛擬網卡實例展示其實現,最后介紹常用的工具和調試手段。 1?? Linux 網絡設備驅動概述 Linux 網絡設備驅動是內核中負責管理網絡硬件(如以太網卡、Wi-Fi …

計算機視覺:從 “看見” 到 “理解”,解鎖機器感知世界的密碼

早上醒來&#xff0c;你拿起手機&#xff0c;人臉識別瞬間解鎖屏幕&#xff1b;開車上班時&#xff0c;車載系統通過攝像頭實時識別車道線&#xff0c;提醒你不要偏離&#xff1b;去醫院做檢查&#xff0c;醫生用 AI 輔助的醫學影像系統快速定位肺部微小結節&#xff1b;逛超市…

深入了解linux系統—— 線程封裝

C11線程庫 C11也提供了對應的線程庫&#xff0c;在頭文件<thread>中&#xff1b;C11將其封裝成thread類&#xff0c;通過類實例化出對象&#xff0c;調用類內成員方法進行線程控制。 #include <iostream> #include <thread> #include <unistd.h> using…

安全防御-SCDN如何保護網站安全

隨著互聯網的快速發展&#xff0c;越來越多的企業依賴在線服務來運行其核心業務。與此同時&#xff0c;網絡攻擊的頻率和復雜性也在不斷增加&#xff0c;惡意流量成為許多企業頭疼的問題。為了有效地提高網站的安全性和穩定性&#xff0c;德迅云安全加速SCDN被許多用戶關注。今…

運籌優化(OR)-在機器學習(ML)浪潮中何去何從?

在如今機器學習的浪潮中&#xff0c;機器學習相關的崗位日益增多&#xff0c;而運籌優化的崗位卻相對較少。這是今年我秋招過程中看到的現象。企業越來越希望候選人不僅能建模求解&#xff0c;還能理解如何用數據驅動優化。需要我們有一個完整的技術棧。那么我們就來看看OR與ML…

GitHub Copilot 在 VS Code 上的終極中文指南:從安裝到高階玩法

GitHub Copilot 在 VS Code 上的終極中文指南&#xff1a;從安裝到高階玩法 前言 GitHub Copilot 作為 AI 編程助手&#xff0c;正在徹底改變開發者的編碼體驗。本文將針對中文開發者&#xff0c;深度解析如何在 VS Code 中高效使用 Copilot&#xff0c;涵蓋基礎設置、中文優化…

安全測試、web探測、httpx

&#x1f4a2; 簡介 httpx 是一個快速且多用途的HTTP工具包&#xff0c;允許使用retryablehttp庫運行多個探測器。它旨在通過增加線程數量來保持結果的可靠性。 功能 &#x1f92a; 發送 GET、POST、PUT、DELETE 等 HTTP 請求支持流式傳輸支持重定向支持身份驗證支持代理支持 …

CNN 中 3×3 卷積核等設計背后的底層邏輯

為什么卷積核愛用 33&#xff1f;CNN 設計 “約定俗成” 的底層邏輯 做深度學習的同學&#xff0c;對 CNN 里 33 卷積核、最大池化、BN 層這些設計肯定不陌生&#xff0c;但你有沒有想過&#xff1a;為啥卷積核總選 33&#xff1f;池化層為啥默認最大池化&#xff1f;BN 層又是…