尤物网站在线-尤物网站永久在线观看-尤物网在线观看-尤物天堂-久久久久久久亚洲精品一区-久久久久久久亚洲精品

<< 點擊返回公司新聞列表
Redis 限流的 3 種方式,還有誰不會!
瀏覽量 73時間 2021-12-04

面對越來越多的高并發場景,限流顯示的尤為重要。

當然,限流有許多種實現的方式,Redis具有很強大的功能,我用Redis實踐了三種的實現方式,可以較為簡單的實現其方式。Redis不僅僅是可以做限流,還可以做數據統計,附近的人等功能,這些可能會后續寫到。

1第一種:基于Redis的setnx的操作

我們在使用Redis的分布式鎖的時候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的時候,同時給指定的key設置了過期實踐(expire),我們在限流的主要目的就是為了在單位時間內,有且僅有N數量的請求能夠訪問我的代碼程序。所以依靠setnx可以很輕松的做到這方面的功能。

比如我們需要在10秒內限定20個請求,那么我們在setnx的時候可以設置過期時間10,當請求的setnx數量達到20時候即達到了限流效果。代碼比較簡單就不做展示了。

當然這種做法的弊端是很多的,比如當統計1-10秒的時候,無法統計2-11秒之內,如果需要統計N秒內的M個請求,那么我們的Redis中需要保持N個key等等問題。

2第二種:基于Redis的數據結構zset

其實限流涉及的最主要的就是滑動窗口,上面也提到1-10怎么變成2-11。其實也就是起始值和末端值都各+1即可。

而我們如果用Redis的list數據結構可以輕而易舉的實現該功能。

我們可以將請求打造成一個zset數組,當每一次請求進來的時候,value保持唯一,可以用UUID生成,而score可以用當前時間戳表示,因為score我們可以用來計算當前時間戳之內有多少的請求數量。而zset數據結構也提供了range方法讓我們可以很輕易的獲取到2個時間戳內有多少請求

代碼如下

public Response limitFlow(){
    Long currentTime = new Date().getTime();
    System.out.println(currentTime);
    if(redisTemplate.hasKey("limit")) {
        Integer count = redisTemplate.opsForZSet().rangeByScore("limit", currentTime -  intervalTime, currentTime).size();        // intervalTime是限流的時間 
        System.out.println(count);
        if (count != null && count > 5) {
            return Response.ok("每分鐘最多只能訪問5次");
        }
    }
    redisTemplate.opsForZSet().add("limit",UUID.randomUUID().toString(),currentTime);
    return Response.ok("訪問成功");
}

通過上述代碼可以做到滑動窗口的效果,并且能保證每N秒內至多M個請求,缺點就是zset的數據結構會越來越大。實現方式相對也是比較簡單的。最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。

3第三種:基于Redis的令牌桶算法

提到限流就不得不提到令牌桶算法了。

令牌桶算法提及到輸入速率和輸出速率,當輸出速率大于輸入速率,那么就是超出流量限制了。

也就是說我們每訪問一次請求的時候,可以從Redis中獲取一個令牌,如果拿到令牌了,那就說明沒超出限制,而如果拿不到,則結果相反。

依靠上述的思想,我們可以結合Redis的List數據結構很輕易的做到這樣的代碼,只是簡單實現。另外,關注Java技術棧,在后臺回復:面試,可以獲取我整理的 Redis 系列面試題和答案,非常齊全。

依靠List的leftPop來獲取令牌

// 輸出令牌
public Response limitFlow2(Long id){
    Object result = redisTemplate.opsForList().leftPop("limit_list");
    if(result == null){
        return Response.ok("當前令牌桶中無令牌");
    }
    return Response.ok(articleDescription2);
}

再依靠Java的定時任務,定時往List中rightPush令牌,當然令牌也需要唯一性,所以我這里還是用UUID進行了生成

// 10S的速率往令牌桶中添加UUID,只為保證唯一性
@Scheduled(fixedDelay = 10_000,initialDelay = 0)
public void setIntervalTimeTask(){
    redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
}

綜上,代碼實現起始都不是很難,針對這些限流方式我們可以在AOP或者filter中加入以上代碼,用來做到接口的限流,最終保護你的網站。

Redis其實還有很多其他的用處,他的作用不僅僅是緩存,分布式鎖的作用。他的數據結構也不僅僅是只有String,Hash,List,Set,Zset。有興趣的可以后續了解下他的GeoHash算法;BitMap,HLL以及布隆過濾器數據(Redis4.0之后加入,可以用Docker直接安裝redislabs/rebloom)結構。



上一篇:盤點市面上主流的時序數據庫
下一篇:消費金融步入“新常態”

推薦閱讀
免費體驗秦拓進銷存ERP管理系統后臺管理系統立即體驗
亚洲综合好骚| 欧美天天视频| 国产影视精品一区二区三区| 99热这里只有精品首页| 欧美91精品| caoporn视频在线观看| 免费永久网站黄欧美| 国产不卡一二三区| 国产一区清纯| 精品国产免费人成网站| 一区二区影院| 亚洲a一区二区三区| 黄视频免费在线看| 国产精品一区二区三区四区在线观看 | 99热在线精品观看| 亚洲18在线| 亚洲三级网页| 午夜一级在线看亚洲| 久久精品亚洲一区二区| 青青久久av| 怡红院成人在线 | 欧美中文一区二区| 日本美女一区| 综合激情网...| 国产精品毛片久久| 欧美精品第一区| av不卡免费看| 欧美日韩亚洲一区| 不卡中文字幕| 日韩精品欧美精品| 136国产福利精品导航网址| 日本国产一区| 精品久久久久久久久久久下田| av中文字幕在线观看第一页| 久久av综合| 久久亚洲欧美| 亚洲第一福利社区| 成人在线电影在线观看视频| 欧美国产亚洲精品| 男男成人高潮片免费网站| 国产在线日韩精品| 美国欧美日韩国产在线播放| 亚洲婷婷影院| 国产传媒av在线| 亚洲日本va中文字幕| 日韩欧美一区二区三区在线视频| 一区视频网站| 成人自拍av| 激情欧美日韩一区| 欧美黄色大片网站| 国产精品99久久久久久动医院| 日韩1区2区日韩1区2区| 成人欧美一区二区三区的电影| 超碰一区二区三区| 深夜福利亚洲| 欧美日韩四区| 日韩精品亚洲aⅴ在线影院| 都市激情综合| 亚洲二区视频| 亚洲综合小说| 极品av在线| 欧美午夜精品一区二区三区电影| 日日摸夜夜添夜夜添精品视频 | 国产精品成人国产| 国产二区精品| 久久成人高清| 日韩成人综合网站| 性一交一乱一区二区洋洋av| 日韩不卡在线观看日韩不卡视频| 丝袜美腿一区| 亚洲激情社区| 精品国产亚洲一区二区三区大结局 | 亚洲啊v在线免费视频| 欧美一区高清| 日韩制服丝袜av| 青青久久av| 国产影视一区| 另类一区二区| 视频一区欧美精品| 久久久久网站| 国产精品视频一区二区三区四蜜臂| 日韩精品诱惑一区?区三区| 久久国产小视频| 亚洲精品一级二级三级| 国产一区二区三区黄网站| 亚洲免费黄色| 国内精品免费| 国产精品成人3p一区二区三区| 欧美gv在线| 免费高清成人在线| 国户精品久久久久久久久久久不卡 | 日韩一级毛片| 99热这里只有成人精品国产| 精品视频免费| 国产一区二区三区四区| 一区二区三区国产盗摄| 欧美freesextv| 先锋亚洲精品| 激情综合激情| 欧洲精品一区| 日本亚洲视频在线| 国产美女精品视频免费播放软件 | 精品久久久久久久| 日韩系列在线| 成人永久在线| 亚洲伦伦在线| 久久中文精品| 成人国产综合| 女生影院久久| 国产精品99久久精品| 香蕉精品999视频一区二区| 在线日韩视频| 久久精品福利| 91欧美极品| 日韩av一二三| 亚洲永久精品唐人导航网址| 电影91久久久| 一区二区蜜桃| 亚洲狼人精品一区二区三区| 蓝色福利精品导航| 日本不卡免费在线视频| 久久在线精品| 日本欧美一区二区三区乱码| 久久精品国产精品亚洲精品| 久久麻豆视频| 日韩高清在线免费观看| 日韩精品一二三| 国产精品人人爽人人做我的可爱| 亚洲精品久久久| 蜜桃a∨噜噜一区二区三区| 久久久久国产精品午夜一区| 精品视频高潮| 99久久伊人| 欧美日韩一二三四| 久久精品国产68国产精品亚洲| 福利欧美精品在线| 精品久久97| 91精品久久久久久久蜜月| 久久精品国产www456c0m| 久久美女视频| 亚洲国产不卡| 在线亚洲成人| 成人精品久久| 久久夜夜操妹子| 久久精品999| 日日欢夜夜爽一区| 91成人app| 日韩精品中文字幕吗一区二区| 日韩精品视频在线看| 国产精品极品| 伊人久久综合影院| 国产精品色网| 少妇淫片在线影院| 一区二区三区国产盗摄| 成人国产精品久久| 第四色中文综合网| 国产真实久久| 蜜臀精品久久久久久蜜臀| 日韩成人av电影| 欧美一区成人| 国产日韩欧美一区二区三区| 一区二区三区自拍视频| 99久久婷婷| 欧美日韩国产欧| 理论片午夜视频在线观看| 国产亚洲欧美日韩精品一区二区三区| 青青草国产成人99久久| 亚洲国产合集| 久久久久国产精品一区三寸| 亚洲经典自拍| 91麻豆国产自产在线观看亚洲| 午夜欧美巨大性欧美巨大| 亚洲精品三级| 亚洲亚洲一区二区三区| 性xxxx欧美老肥妇牲乱| 三级一区在线视频先锋 | 欧美激情视频一区二区三区在线播放 | 亚洲作爱视频| 日韩欧美视频专区| 亚洲欧美一级| 精品视频黄色| 亚洲神马久久| 四虎4545www国产精品 | 给我免费播放日韩视频| 一区免费在线| 综合日韩av| 亚洲欧美一级| 91精品啪在线观看国产18| 久久国产精品毛片| 国产第一亚洲| 久久的色偷偷| 亚洲激情偷拍| 久久精品人人| 91亚洲无吗| 亚洲综合欧美| 一区二区日韩免费看| 麻豆一区在线| 亚洲欧美日韩视频二区| 日韩国产高清影视| 日韩精品四区|