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

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

如果key不存在返回nil

getset key value 

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

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

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

偽代碼為:

# 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

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

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

mget key1 key2 ... keyN 

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)