redis中KEYS、SMEMBERS、SCAN 、SSCAN 的區別


今天在看項目中大神寫的框架中關於redis存儲相關代碼時,發現了再獲取set數據類型的全部元素時,采用的是sscan函數,而不是采用的smembers函數,這兩個到底有什么區別呢?

先看這兩個命令:

keys:用於獲取當前數據庫的模式匹配的所有key

smembers:獲取set集合中的所有元素

而scan又包含多個類似命令

SCAN 增量迭代當前數據庫中的數據庫鍵。
SSCAN 增量迭代集合鍵中的元素。
HSCAN 增量迭代哈希鍵中的鍵值對。
ZSCAN 增量迭代有序集合中的元素(包括元素成員和元素分值)。
也就是說,keys、smembers和scan家族命令的最大區別是:

          keys和smembers是獲取全部,如果當redis中key的數量過去龐大(或者set的元素很多),則很耗費內存,會阻塞redis幾秒鍾

         scan家族是逐步增量獲取。即遍歷獲取一定數量的key或者元素,在獲取一定數量的key或元素,不會一次獲取。

那么,scan命令就比keys、smembers命令好嗎?不是這樣的,scan命令家族也是有缺點的。由於scan采用的增量迭代,當redis中的key是隨時變化的,比如key增加減少或者key的名字變更,這種情況,scan就暴露他的弊端了,可能無法獲取所有的key了。

所以采用哪種方式獲取key或者獲取元素,得根據自己的業務,如果你key是隨時變化,就采用keys或者smembers吧。因為我們業務中redis的初始化只是在項目啟動時初始化一次,所以在獲取set的全部元素時采用的sscan命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM