redis深度理解底層鎖原理

2021-09-13 12:09:34 字數 1432 閱讀 7550

redis的鎖分別有incr、setnx、set,那麼我們就開始來談談他們的用法和場景吧!

1.incr:(計時器,+1操作)

a) 語法:incr key

b) 場景:

1)控制api 1秒內的多次訪問 ;

2)記錄使用者每天訪問**的登入次數 ;

c) 為何我們說這個怎麼能算鎖呢,當然,單獨它肯定是算不了鎖的,因為它本身就不斷的+1 +1,那我們怎麼辦呢,來看下面的:

1) 我們如何實現場景1) 呢?

function limit_api_call(ip)

ts = current_unix_time()

keyname = ip+":"+ts

current = get(keyname)

if current != null and current > 10 then

error "too many requests per second"

else

multi

incr(keyname,1)

expire(keyname,1)

exec

perform_api_call()

end

2) 我們如何實現場景2) 呢?

incr key
然後我們在使用incr的時候,一般都是要借助expire這個命令來結合使用:(我始終覺得這種使用的場景太侷限了,也就一秒,而且也只能+1,在增 1 就會不行,實際上我們也就控制數量為 1 而已了,保證只能為 1)

$redis->incr($key);

$redis->expire($key, $outtime); //設定生成時間為1秒

2.setnx: 這個我就不講了,因為在redis 2.6.12版本就會被拋棄的了3.set:a) 語法:set key value [ex seconds] [px milliseconds] [nx|xx]

b) 場景:

1) set最大可以接受512m的長度,所以快取放這裡也是沒問題噠;

2) 來對資料進行新增,比如要新增某個使用者,如果存在,則不給予操作。

c) 其實這個鎖的實現也就是利用了set的nx ,因為nx是如果存在,則不進行新增或修改,然後同時set也是有expires的過期時間來釋放鎖的。

總結:

上面的這些所謂鎖,也就是利用了expire,還有自帶的nx來進行操作的一定保證,也就間接的實現鎖的操作,這也是基於對redis的底層原理理解。

redis底層原理

plain view plain copy redis set message hello redis 物件的名稱 redis string 字串物件 redis list 列表物件 redis hash 雜湊物件 redis set 集合物件 redis zset 有序集合物件 cpp view ...

鎖的底層原理

那麼golang中加鎖加了什麼?1 禁止編譯器做優化 優化遮蔽 2 禁止cpu進行指令重排 記憶體遮蔽 3 針對快取行和記憶體匯流排的控制 4 衝突時的任務等待佇列。常見鎖總結 自旋鎖 只要沒有鎖上,就不斷重試。如果別的執行緒長期持有該鎖,那麼你這個執行緒就一直在 while while while...

深度剖析Spring Cloud底層原理

毫無疑問,spring cloud 是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對 spring cloud 功能使用的層面,其底層的很多原理,很多人可能並不知曉。實際上,spring cloud 是乙個全家桶式的技術棧,它包含了很多元件。本文先從最核心的幾個...