今天在看項目中大神寫的框架中關於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命令。
