<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案中經常會遇到這種場景,我們需要先將Redis資料讀取到本地,然後進行修改,修改完成後在將資料寫回Redis,這種讀取-修改-寫回操作,我們稱之為RMW操作。當有多個使用者端對同一份資料執行RMW操作的話,Redis如何保證RMW操作涉及的程式碼以原子性方式執行?
Redis的原子性操作是一種無鎖操作,即可以保證並行控制,還能減少系統對並行效能的影響,
把Redis多個操作實現成一個操作,即為單命令模式。
Redis提供了INCR/DECR命令,可以對資料進行增值/減值操作,而且它們本身就是單個命令操作,Redis單執行緒模式,執行命令時具有互斥性。
範例說明
public Long getIncrNumber(String key,long alive) { RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); Long incrNum = entityIdCounter.getAndIncrement(); if (null == incrNum || incrNum.longValue()==0) { entityIdCounter.expire(alive,TimeUnit.MILLISECONDS); incrNum = entityIdCounter.getAndIncrement(); } return incrNum; }
說明:採用Reids的INCR命令,如果不存在的key則設定過期時間,如果key存在則進行遞增操作返回。所以如果我們執行RMW操作進行相關的遞增或者遞減操作時,Redis提供的INCR和DECY命令可以保證並行控制。
當我們不是執行簡單的加加減減操作,而是更加複雜的邏輯判斷或者其他操作時,Redis是無法保證原子性,所以需要將多個操作寫到一個Lua指令碼中,Redis會把Lua指令碼作為一個整體執行,在執行過程中不會被其他命令打斷,從而保證了操作的原子性。
Lua是一種輕量小巧的指令碼語言,用標準C語言編寫並以原始碼形式開放, 其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充套件和客製化功能。
範例說明
介面進行限流操作,同一使用者3秒內不能重複存取,我們可以通過lua指令碼來實現。
local key = KEYS[1] local count = tonumber(ARGV[1]) local time = tonumber(ARGV[2]) local current = redis.call('get', key) if current and tonumber(current) > count then return tonumber(current) end current = redis.call('incr', key) if tonumber(current) == 1 then redis.call('expire', key, time) end return tonumber(current)
說明:key、count、time為三個傳入引數,分別代表Redis的key、次數和過期時間。通過get獲取key對應的值,獲取的值為時間記憶體取介面的次數,如果為第一次存取則返回的為null,此時需要對當前key進行自增1操作,如果返回為數位,則需要判斷返回的數位是否已經超過了cout值,如果超過說明已經超過限流了,直接返回。
關於事務保證原子性,採用的watch命令其原理和樂觀鎖的實現原理類似,詳情可以參考juejin.cn/post/712582… 文章,本文就不在具體闡述。
關於Redis的分散式鎖的實現,後續的章節進行詳情說明。高並行環境下加鎖雖然能夠保證正確性,但是也會帶來其他的問題:
本文講解了針對並行存取Redis如何保證原子性操作,針對不同的業務場景,選擇合適的方案,更多相關Redis 並行存取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45