亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Redis如何應(yīng)對(duì)并發(fā)訪問(wèn)

 更新時(shí)間:2022年08月01日 15:20:17   作者:劍圣無(wú)痕  
本文主要介紹了Redis如何應(yīng)對(duì)并發(fā)訪問(wèn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

項(xiàng)目中經(jīng)常會(huì)遇到這種場(chǎng)景,我們需要先將Redis數(shù)據(jù)讀取到本地,然后進(jìn)行修改,修改完成后在將數(shù)據(jù)寫(xiě)回Redis,這種讀取-修改-寫(xiě)回操作,我們稱之為RMW操作。當(dāng)有多個(gè)客戶端對(duì)同一份數(shù)據(jù)執(zhí)行RMW操作的話,Redis如何保證RMW操作涉及的代碼以原子性方式執(zhí)行?

原子性操作

Redis的原子性操作是一種無(wú)鎖操作,即可以保證并發(fā)控制,還能減少系統(tǒng)對(duì)并發(fā)性能的影響,

單命令模式

把Redis多個(gè)操作實(shí)現(xiàn)成一個(gè)操作,即為單命令模式。

Redis提供了INCR/DECR命令,可以對(duì)數(shù)據(jù)進(jìn)行增值/減值操作,而且它們本身就是單個(gè)命令操作,Redis單線程模式,執(zhí)行命令時(shí)具有互斥性。

示例說(shuō)明

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

說(shuō)明:采用Reids的INCR命令,如果不存在的key則設(shè)置過(guò)期時(shí)間,如果key存在則進(jìn)行遞增操作返回。所以如果我們執(zhí)行RMW操作進(jìn)行相關(guān)的遞增或者遞減操作時(shí),Redis提供的INCR和DECY命令可以保證并發(fā)控制。

多命令模式

當(dāng)我們不是執(zhí)行簡(jiǎn)單的加加減減操作,而是更加復(fù)雜的邏輯判斷或者其他操作時(shí),Redis是無(wú)法保證原子性,所以需要將多個(gè)操作寫(xiě)到一個(gè)Lua腳本中,Redis會(huì)把Lua腳本作為一個(gè)整體執(zhí)行,在執(zhí)行過(guò)程中不會(huì)被其他命令打斷,從而保證了操作的原子性。

lua簡(jiǎn)介

Lua是一種輕量小巧的腳本語(yǔ)言,用標(biāo)準(zhǔn)C語(yǔ)言編寫(xiě)并以源代碼形式開(kāi)放, 其設(shè)計(jì)目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。

示例說(shuō)明

接口進(jìn)行限流操作,同一用戶3秒內(nèi)不能重復(fù)訪問(wèn),我們可以通過(guò)lua腳本來(lái)實(shí)現(xiàn)。

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)

說(shuō)明:key、count、time為三個(gè)傳入?yún)?shù),分別代表Redis的key、次數(shù)和過(guò)期時(shí)間。通過(guò)get獲取key對(duì)應(yīng)的值,獲取的值為時(shí)間內(nèi)訪問(wèn)接口的次數(shù),如果為第一次訪問(wèn)則返回的為null,此時(shí)需要對(duì)當(dāng)前key進(jìn)行自增1操作,如果返回為數(shù)字,則需要判斷返回的數(shù)字是否已經(jīng)超過(guò)了cout值,如果超過(guò)說(shuō)明已經(jīng)超過(guò)限流了,直接返回。

建議

  • 1.編寫(xiě)lua腳本不要進(jìn)行復(fù)雜耗時(shí)的計(jì)算邏輯,否則執(zhí)行l(wèi)ua時(shí)間過(guò)長(zhǎng),會(huì)導(dǎo)致Redis主線程阻塞。
  • 2.lua腳本盡量簡(jiǎn)單,不要把所有的操作都放入到lua腳本中執(zhí)行,這樣會(huì)導(dǎo)致Redis執(zhí)行腳本的時(shí)間增加,同時(shí)也會(huì)降低Redis的并發(fā)性能。

事務(wù)

關(guān)于事務(wù)保證原子性,采用的watch命令其原理和樂(lè)觀鎖的實(shí)現(xiàn)原理類似,詳情可以參考juejin.cn/post/712582… 文章,本文就不在具體闡述。

加鎖

關(guān)于Redis的分布式鎖的實(shí)現(xiàn),后續(xù)的章節(jié)進(jìn)行詳情說(shuō)明。高并發(fā)環(huán)境下加鎖雖然能夠保證正確性,但是也會(huì)帶來(lái)其他的問(wèn)題:

  • 加鎖操作過(guò)多會(huì)降低系統(tǒng)的并發(fā)訪問(wèn)性能
  • Redis客戶端要加鎖,需要使用分布式鎖,而分布式鎖實(shí)現(xiàn)復(fù)雜,增加復(fù)雜度。

總結(jié)

本文講解了針對(duì)并發(fā)訪問(wèn)Redis如何保證原子性操作,針對(duì)不同的業(yè)務(wù)場(chǎng)景,選擇合適的方案,更多相關(guān)Redis 并發(fā)訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis 哨兵集群的實(shí)現(xiàn)

    Redis 哨兵集群的實(shí)現(xiàn)

    Sentinel是Redis 的高可用性解決方案,本文詳細(xì)的介紹了redis哨兵集群的實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2021-06-06
  • Redis分布式非公平鎖的使用

    Redis分布式非公平鎖的使用

    分布式鎖很多人都能接觸到,本文主要介紹了Redis分布式非公平鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Redis02 使用Redis數(shù)據(jù)庫(kù)(String類型)全面解析

    Redis02 使用Redis數(shù)據(jù)庫(kù)(String類型)全面解析

    這篇文章主要介紹了Redis02 使用Redis數(shù)據(jù)庫(kù)(String類型)全面解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)

    詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)

    下面小編就為大家?guī)?lái)一篇詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 為什么RedisCluster設(shè)計(jì)成16384個(gè)槽

    為什么RedisCluster設(shè)計(jì)成16384個(gè)槽

    本文主要介紹了為什么RedisCluster設(shè)計(jì)成16384個(gè)槽,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • redis保存session信息的示例代碼

    redis保存session信息的示例代碼

    本文實(shí)現(xiàn)一個(gè)將session信息保存在 redis中,多個(gè)tomcat中的工程都從redis獲取session信息的示例,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-01-01
  • Redis不使用 keys 命令獲取鍵值信息的方法

    Redis不使用 keys 命令獲取鍵值信息的方法

    這篇文章主要介紹了Redis 不使用 keys 命令獲取鍵值信息的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis字符串類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解

    本文主要介紹了Redis中ServiceStack.Redis和StackExchange.Redis區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Redis中的String類型及使用Redis解決訂單秒殺超賣(mài)問(wèn)題

    Redis中的String類型及使用Redis解決訂單秒殺超賣(mài)問(wèn)題

    這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣(mài)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論