日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

1.redis高并發(fā)的問(wèn)題

Redis緩存的高性能有目共睹,應(yīng)用的場(chǎng)景也是非常廣泛,但是在高并發(fā)的場(chǎng)景下,也會(huì)出現(xiàn)問(wèn)題:緩存擊穿、緩存雪崩、緩存和數(shù)據(jù)一致性,以及今天要談到的緩存并發(fā)競(jìng)爭(zhēng)。

這里的并發(fā)指的是多個(gè)redis的client同時(shí)set key引起的并發(fā)問(wèn)題。

2.出現(xiàn)并發(fā)設(shè)置Key的原因

Redis是一種單線程機(jī)制的nosql數(shù)據(jù)庫(kù),基于key-value,數(shù)據(jù)可持久化落盤(pán)。由于單線程所以Redis本身并沒(méi)有鎖的概念,多個(gè)客戶端連接并不存在競(jìng)爭(zhēng)關(guān)系,但是利用jedis等客戶端對(duì)Redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)出現(xiàn)問(wèn)題。

比如:同時(shí)有多個(gè)子系統(tǒng)去set一個(gè)key。這個(gè)時(shí)候要注意什么呢?

3.舉一個(gè)例子

多客戶端同時(shí)并發(fā)寫(xiě)一個(gè)key,一個(gè)key的值是1,本來(lái)按順序修改為2,3,4,最后是4,但是順序變成了4,3,2,最后變成了2。

Redis系列:Redis并發(fā)競(jìng)爭(zhēng)key的解決方案詳解

 

如何解決redis的并發(fā)競(jìng)爭(zhēng)key問(wèn)題呢?下面給到2個(gè)Redis并發(fā)競(jìng)爭(zhēng)的解決方案。

Redis系列:Redis并發(fā)競(jìng)爭(zhēng)key的解決方案詳解

 

第一種方案:分布式鎖+時(shí)間戳

1.整體技術(shù)方案

這種情況,主要是準(zhǔn)備一個(gè)分布式鎖,大家去搶鎖,搶到鎖就做set操作。

加鎖的目的實(shí)際上就是把并行讀寫(xiě)改成串行讀寫(xiě)的方式,從而來(lái)避免資源競(jìng)爭(zhēng)。

2.Redis分布式鎖的實(shí)現(xiàn)

主要用到的redis函數(shù)是setnx()

用SETNX實(shí)現(xiàn)分布式鎖

利用SETNX非常簡(jiǎn)單地實(shí)現(xiàn)分布式鎖。例如:某客戶端要獲得一個(gè)名字youzhi的鎖,客戶端使用下面的命令進(jìn)行獲取:

SETNX lock.youzhi<current Unix time + lock timeout + 1>

  • 如返回1,則該客戶端獲得鎖,把lock.youzhi的鍵值設(shè)置為時(shí)間值表示該鍵已被鎖定,該客戶端最后可以通過(guò)DEL lock.foo來(lái)釋放該鎖。如返回0,表明該鎖已被其他客戶端取得,這時(shí)我們可以先返回或進(jìn)行重試等對(duì)方完成或等待鎖超時(shí)。

2.時(shí)間戳

由于上面舉的例子,要求key的操作需要順序執(zhí)行,所以需要保存一個(gè)時(shí)間戳判斷set順序。

系統(tǒng)A key 1 {ValueA 7:00}

系統(tǒng)B key 1 { ValueB 7:05}

假設(shè)系統(tǒng)B先搶到鎖,將key1設(shè)置為{ValueB 7:05}。接下來(lái)系統(tǒng)A搶到鎖,發(fā)現(xiàn)自己的key1的時(shí)間戳早于緩存中的時(shí)間戳(7:00<7:05),那就不做set操作了。

3.什么是分布式鎖

因?yàn)閭鹘y(tǒng)的加鎖的做法(如JAVA的synchronized和Lock)這里沒(méi)用,只適合單點(diǎn)。因?yàn)檫@是分布式環(huán)境,需要的是分布式鎖。

當(dāng)然,分布式鎖可以基于很多種方式實(shí)現(xiàn),比如zookeeper、redis等,不管哪種方式實(shí)現(xiàn),基本原理是不變的:用一個(gè)狀態(tài)值表示鎖,對(duì)鎖的占用和釋放通過(guò)狀態(tài)值來(lái)標(biāo)識(shí)。

第二種方案:利用消息隊(duì)列

在并發(fā)量過(guò)大的情況下,可以通過(guò)消息中間件進(jìn)行處理,把并行讀寫(xiě)進(jìn)行串行化。

把Redis.set操作放在隊(duì)列中使其串行化,必須的一個(gè)一個(gè)執(zhí)行。

這種方式在一些高并發(fā)的場(chǎng)景中算是一種通用的解決方案。

以上就是Redis并發(fā)競(jìng)爭(zhēng)key技術(shù)方案詳解,相關(guān)的Redis高并發(fā)問(wèn)題具體還可以參考:

redis系列:如何解決Redis雪崩、穿透、并發(fā)等5大難題

覺(jué)得不錯(cuò)請(qǐng)?jiān)u論、收藏、轉(zhuǎn)發(fā)支持一下!


 

分享到:
標(biāo)簽:Redis
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定