Redis 獲取key對應(yīng)的string值

2018-08-03 10:58 更新
get key

如果key不存在返回nil

getset key value 

原子的設(shè)置key的值,并返回key的舊值。如果key不存在返回nil。應(yīng)用場景:設(shè)置新值,返回舊值,配合setnx可實現(xiàn)分布式鎖。

分布式鎖的思路:注意該思路要保證多臺Client服務(wù)器的NTP一致。

  1. C3發(fā)送SETNX lock.foo 想要獲得鎖,由于C0還持有鎖,所以Redis返回給C3一個0
  2. C3發(fā)送GET lock.foo 以檢查鎖是否超時了,如果沒超時,則等待或重試。
  3. 反之,如果已超時,C3通過下面的操作來嘗試獲得鎖:
  4. GETSET lock.foo
  5. 通過GETSET,C3拿到的時間戳如果仍然是超時的,那就說明,C3如愿以償拿到鎖了。
  6. 如果在C3之前,有個叫C4的客戶端比C3快一步執(zhí)行了上面的操作,那么C3拿到的時間戳是個未超時的值,這時,C3沒有如期獲得鎖,需要再次等待或重試。留意一下,盡管C3沒拿到鎖,但它改寫了C4設(shè)置的鎖的超時值,不過這一點非常微小的誤差帶來的影響可以忽略不計。

偽代碼為:

# 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 的分布式鎖思路,官網(wǎng)上還介紹了另一個單機使用超時方式進行的思路,和這個基本一致,并且在同一個文檔中介紹了一個名為redlock的多Server容錯型分布式鎖的算法,同時列出了多語言的實現(xiàn)。這個算法的優(yōu)勢在于幾個服務(wù)器可以有少量的時間差,不要求嚴格時間一致。

也可以設(shè)計一個按小時計算的計數(shù)器,可以用GetSet獲取計數(shù)并重置為0。

mget key1 key2 ... keyN 

一次獲取多個key的值,如果對應(yīng)key不存在,則對應(yīng)返回nil


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號