redis的鎖分別有INCR、SETNX、SET,那麼咱們就開始來談談他們的用法和場景吧!php
1.INCR:(計時器,+1操做)
a) 語法:INCR key
b) 場景:
1)控制api 1秒內的屢次訪問 ;
2)記錄用戶天天訪問網站的登陸次數 ;redis
c) 爲什麼咱們說這個怎麼能算鎖呢,固然,單獨它確定是算不了鎖的,由於它自己就不斷的+1 +1,那咱們怎麼辦呢,來看下面的:
1) 咱們如何實現場景1) 呢?api
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的底層原理理解。spa
關注回覆 wxq ,驗證後即加入php微信羣,即將在公衆號深度剖析redis的事務鎖 + 分佈式鎖code