APPEND key value
2.0.0版本以上
時間複雜度:O(1)。平攤時間複雜度為O(1),假設附加的值很小,並且已經存在的現值是任意大小的,由於Redis使用的動態字串庫將使每次重新分配時可用的空閒空間增加一倍。
如果鍵已經存在並且是一個字串,這個命令將在字串的末尾追加值,如果鍵不存在,它將被建立並設定為空字串,因此APPEND
將類似於在這個特殊情況下SET
。
返回值
響應為整數:附加操作之後的字串長度
例如
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
redis>
模式:時間序列
APPEND
命令可用於建立一個非常緊湊的固定大小樣本列表的表示形式,通常稱為時間序列。每次新的樣本到達時,我們都可以使用該命令儲存它:
APPEND timeseries "fixed-size sample"
在時間序列中訪問單個元素並不困難:
- 可以使用STRLEN來獲取樣本的數量
- GETRANGE允許對元素進行隨機訪問,如果我們的時間序列有相關的時間資訊,我們可以很容易地實現一個二進位制搜尋,以獲得GETRANGE與Redis 2.6中可用的Lua指令碼引擎相結合的範圍
- SETRANGE可以用於覆蓋現有的時間序列
這種模式的侷限性是,我們被迫進入僅附加的操作模式,由於Redis目前缺少一個能夠修飾字串物件的命令,所以無法輕易地將時間序列縮減到給定的大小。然而,以這種方式儲存的時間序列的空間效率是顯著的。
提示:可以根據當前Unix時間切換到另一個鍵,通過這種方式,每個鍵可能只有相對少量的樣本,為了避免處理非常大的鍵,並使這個模式更友好地分佈在許多Redis例項中。
使用固定大小的字串溫度感測器的示例(在實際實現中使用二進位制格式更好)
redis> APPEND ts "0043"
(integer) 4
redis> APPEND ts "0035"
(integer) 8
redis> GETRANGE ts 0 3
"0043"
redis> GETRANGE ts 4 7
"0035"
redis>
BITCOUNT key [start end]
2.6.0版本以上
時間複雜度:O(N)
計算字串中設定的bits數(總體計數)。
預設情況下,將檢查字串中包含的所有位元組,可以只在通過附加引數開始和結束的間隔中指定計數操作。
與GETRANGE命令一樣,開始和結束可以包含負值,以便從字串的末尾開始索引位元組,-1是最後一個位元組,-2是倒數第二個位元組,以此類推。
不存在的鍵被視為空字串,因此命令將返回0。
返回值
響應為整數:bits數被設定為1。
例如
redis> SET mykey "foobar"
"OK"
redis> BITCOUNT mykey
(integer) 26
redis> BITCOUNT mykey 0 0
(integer) 4
redis> BITCOUNT mykey 1 1
(integer) 6
redis>
模式:使用點陣圖的實時度量
點陣圖是對某些資訊的一種非常節省空間的表示,例如需要使用者訪問歷史記錄的Web應用程式,這可以確定哪些使用者是beta特性的良好目標。
使用SETBIT命令完成這個任務非常簡單,每天都用一個小的遞增整數進行標識,例如第0天是應用程式上線的第一天,第1天是第二天,以此類推。
每次使用者執行頁面檢視時,應用程式都可以使用SETBIT命令設定與當前日期對應的位,在使用者訪問web站點的當天註冊該頁面。
稍後,只需根據點陣圖呼叫BITCOUNT
命令,就可以知道使用者訪問web站點的天數,這是很簡單的。
使用使用者id而不是天數的類似模式在文章中被描述為“使用Redis點陣圖的快速簡單實時度量”
效能考慮
在上面的計數日示例中,即使10年之後,我們的應用程式仍然是線上的,每個使用者只有365*10位元組的資料,每個使用者只有456位元組,有了這些資料BITCOUNT
,仍然和其他O(1) Redis命令(如GET
或INCR
)一樣快。
當點陣圖較大時,有兩種選擇:
- 取一個單獨的鍵,每次修改點陣圖時遞增,使用一個小的Redis Lua指令碼可以非常高效且具有原子性。
- 使用
BITCOUNT
start和end可選引數遞增地執行點陣圖,在客戶端積累結果,並可選地將結果快取到一個鍵中。