Redis開發運維實踐數據操作之字符串操作
2.2.1 設置key對應的值為string類型的value
set key value [ex 秒數] / [px 毫秒數] [nx] /[xx]
返回1表示成功,0失敗
注: 如果ex,px同時寫,以後麵的有效期為準
setnx key value
僅當key不存在時才Set,如果key已經存在,返回0 。nx 是not exist的意思。
應用場景:用來選舉Master或做分布式鎖:所有Client不斷嚐試使用SetNx master myName搶注Master,成功的那位不斷使用Expire刷新它的過期時間。如果Master倒掉了key就會失效,剩下的節點又會發生新一輪搶奪。
mset key1 value1 ... keyN valueN
一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置
msetnx key1 value1 ... keyN valueN
同上,但是不會覆蓋已經存在的key
SET 命令還支持可選的 NX 選項和 XX 選項,例如:SET nx-str "this will fail" XX
如果給定了 NX 選項,那麼命令僅在鍵 key 不存在的情況下,才進行設置操作;如果鍵 key 已經存在,那麼 SET ... NX 命令不做動作(不會覆蓋舊值)。
如果給定了 XX 選項,那麼命令僅在鍵 key 已經存在的情況下,才進行設置操作;如果鍵 key 不存在,那麼 SET ... XX 命令不做動作(一定會覆蓋舊值)。在給定 NX 選項和 XX 選項的情況下,SET 命令在設置成功時返回 OK ,設置失敗時返回 nil 。
2.2.2 獲取key對應的string值
get key
如果key不存在返回nil
getset key value
原子的設置key的值,並返回key的舊值。如果key不存在返回nil。應用場景:設置新值,返回舊值,配合setnx可實現分布式鎖。
分布式鎖的思路:注意該思路要保證多台Client服務器的NTP一致。
C3發送SETNX lock.foo 想要獲得鎖,由於C0還持有鎖,所以Redis返回給C3一個0
C3發送GET lock.foo 以檢查鎖是否超時了,如果沒超時,則等待或重試。
反之,如果已超時,C3通過下麵的操作來嚐試獲得鎖:
GETSET lock.foo
通過GETSET,C3拿到的時間戳如果仍然是超時的,那就說明,C3如願以償拿到鎖了。
如果在C3之前,有個叫C4的客戶端比C3快一步執行了上麵的操作,那麼C3拿到的時間戳是個未超時的值,這時,C3沒有如期獲得鎖,需要再次等待或重試。留意一下,盡管C3沒拿到鎖,但它改寫了C4設置的鎖的超時值,不過這一點非常微小的誤差帶來的影響可以忽略不計。
偽代碼為:
get lock
lock = 0
while lock != 1:
timestamp = current Unix time + lock timeout + 1
lock = SETNX lock.foo timestamp
if lock == 1 or (now() > (GET lock.foo) and now() > (GETSET lock.foo timestamp)):
break;
else:
sleep(10ms)
do your job
do_job()
release
if now() < GET lock.foo:
DEL lock.foo
以上是一個單Server 的分布式鎖思路,官網上還介紹了另一個單機使用超時方式進行的思路,和這個基本一致,並且在同一個文檔中介紹了一個名為redlock的多Server容錯型分布式鎖的算法,同時列出了多語言的實現。這個算法的優勢在於幾個服務器可以有少量的時間差,不要求嚴格時間一致。
也可以設計一個按小時計算的計數器,可以用GetSet獲取計數並重置為0。
mget key1 key2 ... keyN
一次獲取多個key的值,如果對應key不存在,則對應返回nil
incr key
對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key為1。範圍為64有符號,-9223372036854775808~9223372036854775807。
decr key
同上,但是做的是減減操作,decr一個不存在key,則設置key為-1
incrby key integer
同incr,加指定值 ,key不存在時候會設置key,並認為原來的value是 0
decrby key integer
同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。
incrbyfloat key floatnumber
針對浮點數
哪些可以被操作呢?
這個操作的應用場景:計數器
2.2.4 追加字符串
append key value
返回新字符串值的長度。
2.2.5 截取字符串
substr key start end
返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的
2.2.6 改寫字符串
SETRANGE key offset value
用value 參數覆寫(overwrite)給定key 所儲存的字符串值,從偏移量offset 開始。 不存在的key 當作空白字符串處理。可以用作append:
注意: 如果偏移量>字符長度, 該字符自動補0x00,注意它不會報錯
2.2.7 返回子字符串
GETRANGE key start end
返回key 中字符串值的子字符串,字符串的截取範圍由start 和end 兩個偏移量決定(包括start 和end 在內)。可以使用負值,字符串右麵下標是從-1開始的。
注意返回值處理:
1: start>=length, 則返回空字符串 2: stop>=length,則截取至字符結尾 3: 如果start 所處位置在stop右邊, 返回空字符串
2.2.8 取指定key的value值的長度
strlen
2.2.9 位操作
注意:位操作中的位置是反過來的,offset過大,則會在中間填充0,比如 SETBIT bit 0 1,此時bit為10000000,此時再進行SETBIT bit 7 1,此時bit為10000001。offset最大2^32-1。
GETBIT key offset / SETBIT key offset value
設置某個索引的位為0/1
bitcount
對位進行統計
bitop
對1個或多個key對應的值進行AND/OR/XOR/NOT操作
注意:
1.bitop操作避免阻塞應盡量移到slave上操作. 2.對於NOT操作, key不能多個
本文為《Redis開發運維實踐指南》內容,該書作者為黃鵬程,已授權雲棲社區轉載。
最後更新:2017-05-05 18:50:43