最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis限流的實(shí)際應(yīng)用

 更新時(shí)間:2021年04月23日 10:46:43   作者:程序員養(yǎng)成日記  
這篇文章主要介紹了redis限流的實(shí)際應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

為什么要做限流

首先讓我們先看一看系統(tǒng)架構(gòu)設(shè)計(jì)中,為什么要做“限流”。

旅游景點(diǎn)通常都會有最大的接待量,不可能無限制的放游客進(jìn)入,比如故宮每天只賣八萬張票,超過八萬的游客,無法買票進(jìn)入,因?yàn)槿绻^八萬人,景點(diǎn)的工作人員可能就忙不過來,過于擁擠的景點(diǎn)也會影響游客的體驗(yàn)和心情,并且還會有安全隱患;「只賣N張票,這就是一種限流的手段」。

軟件架構(gòu)中的服務(wù)限流也是類似,也是當(dāng)系統(tǒng)資源不夠的時(shí)候,已經(jīng)不足以應(yīng)對大量的請求,為了保證服務(wù)還能夠正常運(yùn)行,那么按照規(guī)則,「系統(tǒng)會把多余的請求直接拒絕掉,以達(dá)到限流的效果」;

不知道大家注意過沒有,比如雙11,剛過12點(diǎn)有些顧客的網(wǎng)頁或APP會顯示下單失敗的提示,有些就是被限流掉了。

常見的限流算法

計(jì)數(shù)法

顧名思義就是來一個(gè),記錄一個(gè),比如我1分鐘只能處理1000個(gè)請求,那么我們就可以設(shè)置一個(gè)計(jì)數(shù)器,來一個(gè)請求就incr+1,當(dāng)1分鐘之內(nèi)的數(shù)量大于等于1000之后不處理了即可,偽代碼如下

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$rate_limit = 1000;  //限制個(gè)數(shù)
$rate_seconds = 60;  //限制時(shí)間
$redis_key = "redis_limit";
$count = $redis->get($redis_key);
if ($count >= $rate_limit){  //判斷60秒內(nèi)請求個(gè)數(shù)是否已經(jīng)達(dá)到上限
    //直接返回,不處理請求
    return
}
$redis->incr($redis_key, 1);//請求計(jì)數(shù)
$redis->expire($redis, $rate_seconds); //設(shè)置過期時(shí)間 60s
//to do  業(yè)務(wù)邏輯處理.......

這種計(jì)數(shù)方式比較簡單快捷,但是有很大的缺點(diǎn),因?yàn)檎埱蟮脑L問不一定是很平穩(wěn)的,如果0:59過來了1000個(gè)請求,1:01已經(jīng)是下一個(gè)窗口,又過來了1000個(gè)請求,但實(shí)際上三秒內(nèi)來了2000個(gè)請求,已經(jīng)超過我們的限流上限了。所以這種方法是不推薦的。

滑動窗口算法

還拿上面的例子,一分鐘分6份,每份10秒;每過10秒鐘,我們的時(shí)間窗口就會往右滑動一格,每個(gè)格子都有獨(dú)立的計(jì)數(shù)器,我們每次都計(jì)算時(shí)間窗口內(nèi)的數(shù)量,可以解決計(jì)數(shù)器法中的問題,而且當(dāng)滑動窗口的格子越多,那么限流的統(tǒng)計(jì)就會越精確。具體可以參考下圖,看圖比較清晰

偽代碼實(shí)現(xiàn)如下

function api_limit($scene,  $period, $maxCount){
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $key = sprintf('hist:%s', $scene); //限流場景唯一標(biāo)識
    $now = msectime();   // 毫秒時(shí)間戳,這樣更精確
    $pipe=$redis->multi(Redis::PIPELINE); //使用管道提升性能
    $pipe->zadd($key, $now, $now); //value 和 score 都使用毫秒時(shí)間戳
    $pipe->zremrangebyscore($key, 0, $now - $period); //移除時(shí)間窗口之前的行為記錄,剩下的都是時(shí)間窗口內(nèi)的
    $pipe->zcard($key);  //獲取窗口內(nèi)的行為數(shù)量
    $pipe->expire($key, $period/1000 + 1);  //多加一秒過期時(shí)間
    $replies = $pipe->exec();
    return $replies[2] <= $maxCount;  //$replies[2]為zcard返回的個(gè)數(shù)  如果zcard結(jié)果大于maxCount,則不處理結(jié)果
}

for ($i=0; $i<20; $i++){  //測試限流是否實(shí)現(xiàn)代碼
    var_dump(isActionAllowed("uniq_scene", 60*1000, 5)); //執(zhí)行可以發(fā)現(xiàn)只有前5次是通過的
}

//返回當(dāng)前的毫秒時(shí)間戳
function msectime() {
    list($msec, $sec) = explode(' ', microtime());
    $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
    return $msectime;
 }

這段代碼還是略顯復(fù)雜,需要讀者花一定的時(shí)間好好啃。它的整體思路就是:每一個(gè)行為到來時(shí),都維護(hù)一次時(shí)間窗口。將時(shí)間窗口外的記錄全部清理掉,只保留窗口內(nèi)的記錄。

因?yàn)檫@幾個(gè)連續(xù)的 Redis 操作都是針對同一個(gè) key 的,使用 pipeline 可以顯著提升Redis 存取效率。「但這種方案也有缺點(diǎn),因?yàn)樗涗洉r(shí)間窗口內(nèi)所有的行為記錄,如果這個(gè)量很大,比如限定 60s 內(nèi)操作不得超過 100w 次這樣的參數(shù),它是不適合做這樣的限流的,因?yàn)闀拇罅康拇鎯臻g」。

后面還有漏桶算法和令牌桶算法,由于各自的實(shí)現(xiàn)比較復(fù)雜,所以準(zhǔn)備各自新開一篇文章單獨(dú)描述

到此這篇關(guān)于redis限流的實(shí)際應(yīng)用的文章就介紹到這了,更多相關(guān)redis限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫

    Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫

    這篇文章主要為大家介紹了Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程解析

    redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程解析

    本文主要記一次找因redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案

    Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案

    兩級緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下
    2024-12-12
  • Redis配置文件代碼講解

    Redis配置文件代碼講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Redis配置文件的說明內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • Redis主從復(fù)制分步講解使用

    Redis主從復(fù)制分步講解使用

    Redis因?yàn)槠涓咝阅芎鸵子眯栽谖覀兒蠖说姆?wù)中發(fā)揮了巨大的作用,并且很多重要功能的實(shí)現(xiàn)都會依賴redis,本篇我們來了解Redis高可用主從復(fù)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • redis列表類型_動力節(jié)點(diǎn)Java學(xué)院整理

    redis列表類型_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis列表類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄猂edis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • redis慢查詢?nèi)罩镜脑L問和管理方式

    redis慢查詢?nèi)罩镜脑L問和管理方式

    這篇文章主要介紹了redis慢查詢?nèi)罩镜脑L問和管理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Redis不僅僅是緩存,還是……

    Redis不僅僅是緩存,還是……

    Redis是一個(gè)開源的(BSD協(xié)議),內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲,它可以用作數(shù)據(jù)庫,緩存,消息代理。這篇文章主要介紹了Redis不僅僅是緩存,還是……,需要的朋友可以參考下
    2020-12-12
  • Redis分布式鎖的正確實(shí)現(xiàn)方法總結(jié)

    Redis分布式鎖的正確實(shí)現(xiàn)方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Redis分布式鎖的正確實(shí)現(xiàn)方式介紹,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02

最新評論

昌宁县| 塘沽区| 巴林右旗| 汽车| 山西省| 水富县| 腾冲县| 榆社县| 桃园市| 武平县| 临桂县| 镇雄县| 新闻| 定安县| 六盘水市| 和龙市| 峨边| 咸宁市| 新闻| 太保市| 延寿县| 温宿县| 普定县| 芦山县| 河间市| 庆城县| 长春市| 马边| 陇西县| 普安县| 聊城市| 东方市| 新泰市| 奎屯市| 岳阳县| 中卫市| 田东县| 哈尔滨市| 忻城县| 麻江县| 济宁市|