閱讀645 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Redis開發運維實踐指南數據操作之key操作

數據操作

熟悉每個數據操作前一定要明白每個操作都是代價,以時間複雜度和對應查詢集或者結果集大小為衡量。時間複雜度收斂狀況如下:

2.1.1 列出key

keys *user*
keys *

有3個通配符 *, ? ,[]

  • *: 通配任意多個字符
  • ?: 通配單個字符
  • []: 通配括號內的某1個字符

注:生產已經禁止。更安全的做法是采用scan,原理和操作如下:

針對Keys的改進,支持分頁查詢Key。在迭代過程中,Keys有增刪時不會要鎖定寫操作,數據集完整度不做任何保證,同一條key可能會被返回多次.

對於其他危險的命令,新版本也進行了替代:

redis-cli下的掃描:

redis-cli --scan --pattern 'chenqun_*'

這是用scan命令掃描redis中的key,--pattern選項指定掃描的key的pattern。相比keys pattern模式,不會長時間阻塞redis而導致其他客戶端的命令請求一直處於阻塞狀態。

2.1.2 測試指定key是否存在

exists key

返回1表示存在,0不存在

2.1.3 刪除給定key

del key1 key2 ....keyN

返回1表示存在,0不存在、

2.1.4 返回給定key的value類型

type key

返回 none 表示不存在key。string字符類型,list 鏈表類型 set 無序集合類型...


2.1.5 返回從當前數據庫中隨機選擇的一個key

randomkey

如果當前數據庫是空的,返回空串

2.1.6 原子的重命名一個key

rename oldkey newkey

如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同

renamenx oldkey newkey 

同上,但是如果newkey存在返回失敗、

2.1.7 Key的超時設置處理

expire key seconds

單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在。 如果想消除超時則使用persist key。如果希望采用絕對超時,則使用expireat命令。


ttl key 

返回設置過過期時間的key的剩餘過期秒數 -1表示沒有設置過過期時間,對於不存在的key,返回-2。


pexpire key 毫秒數

設置生命周期。


pttl key

以毫秒返回生命周期。


注意:

當client主動訪問key會先對key進行超時判斷,過時的key會立刻刪除。

如果clien永遠都不再get那條key呢? 它會在Master的後台,每秒10次的執行如下操作: 隨機選取100個key校驗是否過期,如果有25個以上的key過期了,立刻額外隨機選取下100個key(不計算在10次之內)。可見,如果過期的key不多,它最多每秒回收200條左右,如果有超過25%的key過期了,它就會做得更多,但隻要key不被主動get,它占用的內存什麼時候最終被清理掉隻有天知道。

在主從複製環境中,由於上述原因存在已經過期但是沒有刪除的key,在主snapshot時並不包含這些key,因此在slave環境中我們往往看到dbsize較master是更小的。


本文為《Redis開發運維實踐指南》內容,該書作者為黃鵬程,已授權雲棲社區轉載。

最後更新:2017-05-05 18:50:43

  上一篇:go Redis開發運維實踐數據操作之字符串操作
  下一篇:go 開源大數據周刊-第51期