国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Redis > 正文

深入理解redis分布式鎖和消息隊列

2020-10-28 21:36:37
字體:
來源:轉載
供稿:網友

最近博主在看redis的時候發現了兩種redis使用方式,與之前redis作為緩存不同,利用的是redis可設置key的有效時間和redis的BRPOP命令。

分布式鎖

由于目前一些編程語言,如PHP等,不能在內存中使用鎖,或者如Java這樣的,需要一下更為簡單的鎖校驗的時候,redis分布式鎖的使用就足夠滿足了。

redis的分布式鎖其實就是基于setnx方法和redis對key可設置有效時間的功能來實現的。基本用法比較簡單。

public boolean tryLock(String lock,long expireTime){  String expire = String.valueOf(System.currentTimeMillis() + expireTime + 1);  Long result = jedis.setNx(lock,expire);  if(result == 1L){    jedis.expire(lock, expireTime);    return true;  }  //判斷超時key可能未刪掉  String currentValue = jedis.get(lock);  if(Long.parseLong(currentValue) < System.currentTimeMillis()){    jedis.set(lock, expire);    jedis.expire(lock, expireTime);    return true;  }  return false;}//expire是key的值,這里是為了防止運行超時鎖被其他線程拿走之后誤刪鎖public unlock(String lock,String expire){  String value = jedis.get(lock);  if(value != null && value != expire && Long.parseLong(value) > System.currentTimeMillis())    jedis.del(lock);}  

這里就是我根據redis的機制寫的加鎖和解鎖方法。現在redis不推薦使用setNx了,而是直接使用set命令set(lock, expire,"NX", expireTime,"EX"),可以直接包括了setNx和expire的作用。

消息隊列

消息隊列主要應用在網絡服務中異步任務的實現,redis可以充當消息隊列實現生產者/消費者模型和訂閱/發布模型。

生產者/消費者模型

生產者/消費者模型需要存在生產者和消費者兩方,而在redis中隊列的存儲和獲取可以作為消息隊列被生產者和消費者使用,這里就不用Java代碼寫了,使用redis命令來說明。

 其實redis在其中做的還是緩存的作用,LPUSH queue task,將task放到queue隊列里面,這里稍微偏題一句,其實redis有lpush和rpush,意思就是從左邊插入隊列和從右邊插入隊列。這就是生產者的部分,將任務插入到指定隊列中。

 消費者的部分有點相似,就是使用BRPOP queue 10,當然這里的BRPOP也有對應的BLPOP,由于隊列是按順序取任務的,所以這邊做的是左邊插入,右邊取出。這里需要注意的是,redis有BRPOP和RPOP,之所以用BRPOP的原因是這個有一個等待,就是命令中的10,這是一個等待時間,以秒為單位,意思是如果隊列中是空的,那么我先不返回,我等待10秒,如果期間有新的任務插入,那么我就取新的任務返回,還是沒有的話,返回空。

 另外BRPOP還支持優先級,就是BRPOP queue:1 queue:2 queue:3 10,這個意思是順序獲取,如果queue:1沒有取到任務,到queue:2去取,依次往后。

訂閱/發布模型

訂閱/發布模型簡單來說就是由發布者向所有訂閱者發送任務,任何訂閱者都可以獲取任務,這里redis的實現就是使用訂閱命令。

 發布者可以使用publish channel task來發布相關的任務,而訂閱者則是使用subscribe channel,這是一個監聽命令,redis會一直監聽這個channel,如果發布者發布新的任務,監聽命令會返回任務,直到訂閱者主動退出監聽。但是redis也為這個設置超時,保證監聽的有效性,默認如果60s內沒收到消息就異常退出,當然這個可配置。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石屏县| 龙泉市| 白水县| 宁阳县| 旌德县| 当阳市| 达尔| 龙江县| 富民县| 榆树市| 玉环县| 澄迈县| 巴青县| 临武县| 通城县| 莆田市| 乌拉特中旗| 朝阳市| 玉屏| 永仁县| 白山市| 卓资县| 婺源县| 棋牌| 西林县| 台江县| 朔州市| 光山县| 民权县| 周至县| 太保市| 雅江县| 元谋县| 滕州市| 马公市| 连江县| 衡山县| 高雄县| 右玉县| 阳泉市| 石嘴山市|