1. 程式人生 > >redis中KEYS、SMEMBERS、SCAN 、SSCAN 的區別

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命令。