redis中KEYS、SMEMBERS、SCAN 、SSCAN 的區別
阿新 • • 發佈:2018-12-27
今天在看專案中大神寫的框架中關於redis儲存相關程式碼時,發現了再獲取set資料型別的全部元素時,採用的是sscan函式,而不是採用的smembers函式,這兩個到底有什麼區別呢?
先看這兩個命令:
keys:用於獲取當前資料庫的模式匹配的所有key
smembers:獲取set集合中的所有元素
而scan又包含多個類似命令
也就是說,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命令。