欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年07月24日 10:22:31   作者:葉下梧桐  
本篇文章主要介紹了深入理解redis分布式鎖和消息隊列,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

分布式鎖

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

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

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);
}  

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

消息隊列

消息隊列主要應(yīng)用在網(wǎng)絡(luò)服務(wù)中異步任務(wù)的實現(xiàn),redis可以充當(dāng)消息隊列實現(xiàn)生產(chǎn)者/消費者模型和訂閱/發(fā)布模型。

生產(chǎn)者/消費者模型

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

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

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

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

訂閱/發(fā)布模型

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis啟動,停止,及端口占用處理方法

    redis啟動,停止,及端口占用處理方法

    今天小編就為大家分享一篇redis啟動,停止,及端口占用處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • redis哨兵模式說明與搭建詳解

    redis哨兵模式說明與搭建詳解

    這篇文章主要介紹了redis哨兵模式說明與搭建詳解,需要的朋友可以參考下
    2023-01-01
  • Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例

    Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例

    這篇文章主要為大家介紹了Caffeine實現(xiàn)類似redis的動態(tài)過期時間示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Redis?整數(shù)集合的具體使用(intset)

    Redis?整數(shù)集合的具體使用(intset)

    對于集合,STL?的?set?相信大家都不陌生,本文主要介紹了整數(shù)集合,又稱為?intset,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • redis連接報錯error:NOAUTH Authentication required

    redis連接報錯error:NOAUTH Authentication required

    本文主要介紹了redis連接報錯error:NOAUTH Authentication required,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 關(guān)于redisson緩存序列化的幾枚大坑說明

    關(guān)于redisson緩存序列化的幾枚大坑說明

    這篇文章主要介紹了redisson緩存序列化幾枚大坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪功能(示例代碼)

    基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪功能(示例代碼)

    基于 spring aop 常規(guī)應(yīng)用場景多是用于日志記錄以及實現(xiàn) redis 分布式鎖,在 github 中也有項目是把它拿來當(dāng)作緩存的異常捕捉,這篇文章主要介紹了基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪,需要的朋友可以參考下
    2022-08-08
  • redis5集群如何主動手工切換主從節(jié)點命令

    redis5集群如何主動手工切換主從節(jié)點命令

    這篇文章主要介紹了redis5集群如何主動手工切換主從節(jié)點命令,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Redis中AOF與RDB持久化策略深入分析

    Redis中AOF與RDB持久化策略深入分析

    Redis作為一款內(nèi)存數(shù)據(jù)庫,因為是內(nèi)存讀寫,所以性能很強,但內(nèi)存存儲是易失性的,斷電或系統(tǒng)奔潰都會導(dǎo)致數(shù)據(jù)丟失,因此Redis也需要將其數(shù)據(jù)持久化到磁盤上面,當(dāng)Redis服務(wù)重啟時,會把磁盤上的數(shù)據(jù)再加載進(jìn)內(nèi)存,Redis提供了兩種持久化機制-RDB快照和AOF日志
    2022-11-11
  • 一文掌握Redis的三種集群方案(小結(jié))

    一文掌握Redis的三種集群方案(小結(jié))

    這篇文章主要介紹了一文掌握Redis的三種集群方案(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論