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

利用Redis實現(xiàn)訪問次數(shù)限流的方法詳解

 更新時間:2022年02月22日 08:59:44   作者:架構(gòu)擺渡人  
這篇文章主要給大家介紹了關(guān)于如何利用Redis實現(xiàn)訪問次數(shù)限流的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

假設(shè)我們要做一個業(yè)務(wù)需求,這個需求就是限制用戶的訪問頻次。比如1分鐘內(nèi)只能訪問20次,10分鐘內(nèi)只能訪問200次。因為是用戶維度的場景,性能肯定是要首先考慮,那么適合這個場景的非Redis莫屬。

最簡單的實現(xiàn),莫過于只是用incr進行計數(shù)操作,于是有了下面的代碼:

long count = redisTemplate.opsForValue().increment("user:1:60");
if (count > maxLimitCount) {
   throw new LimitException("訪問太頻繁");
}

count = redisTemplate.opsForValue().increment("user:1:600");
if (count > maxLimitCount) {
   throw new LimitException("訪問太頻繁");
}

來,我們對上面這段代碼解讀一下。需求有2個時間維度的限制,所以這邊基于用戶和時間維度構(gòu)建了Redis的Key。然后對每個Key進行計數(shù),計數(shù)后的結(jié)果用于跟限制的值進行判斷,如果超出了限制的值就拋出異常。

假設(shè)限制的時間場景有10個呢?那上面的代碼是不是得寫10遍才可以。有人可能會說,這還不簡單嗎?循環(huán)呀,循環(huán)確實能夠解決這個問題。但是大家有沒有去思考,這是用戶維度的請求,如果每個請求里面都去操作10次Redis的話,這耗時至少也得10來毫秒吧。所以問題在這,并不是說這個邏輯實現(xiàn)的有問題。

那我們就改成批量的吧,用pipeline來批量執(zhí)行。

redisTemplate.execute(new RedisCallback<Long>() {
    @Override
    public Long doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr("user:1:60".getBytes());
        connection.incr("user:1:600".getBytes());
        onnection.closePipeline();
        return null;
    }
});

用pipeline也有一個問題,那就是拿不到返回值,也就只能增加,但是沒辦法判斷是否超過了限制的閥值。

所以需要在第一步先查詢下,用查到的值進行判斷,這樣也就是只需要和Redis交互兩次就可以了。

上面的代碼在單節(jié)點下沒問題,但是如果在集群下,其實每個Key都可能分配到不同的節(jié)點上去,只不過是底層幫你屏蔽掉了細節(jié),并發(fā)執(zhí)行,拿到了所有結(jié)果后合并返回的。所以我們需要讓所有的Key都路由到一個節(jié)點上,本來就是用戶維度的,直接使用userId路由即可。

這個時候Redis的HashTag功能就排上用場了,將Key user:1:600改寫成user:{1}:600 。

雖然已經(jīng)優(yōu)化了,但是還是要發(fā)起兩次網(wǎng)絡(luò)請求才能完成這個邏輯,有沒有可能再進一步優(yōu)化下呢?一次請求行不行。

這個時候要放大招了,Lua腳本走起,將所有邏輯都放入Lua腳本中,一次網(wǎng)絡(luò)交互即可完成。

local current
current = redis.call("incr",KEYS[1])
if current == 1 then
    redis.call("expire",KEYS[1],1)
end

if current > ARGV[1]
  return 1
end

return 0

上面腳本演示了如何對一個Key進行處理,返回1表示限流,返回0表示通過。不過使用lua腳本的時候要注意,某些云服務(wù)的Redis會對腳本進行校驗,像Redis的Key不能使用變量,必須用KEYS[下標]的方式,所以這里操作多個Key還不能用循環(huán),代碼得寫多遍,這是一個惡心的點。

總結(jié)

到此這篇關(guān)于利用Redis實現(xiàn)訪問次數(shù)限流的文章就介紹到這了,更多相關(guān)Redis訪問次數(shù)限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解Redis連接數(shù)問題的現(xiàn)象和解法

    深入了解Redis連接數(shù)問題的現(xiàn)象和解法

    一般情況?Redis?連接數(shù)問題并不常見,但是當你業(yè)務(wù)服務(wù)增加、對?Redis?的依賴持續(xù)增強的過程中,可能會遇到很多?Redis?的問題,這個時候,Redis?連接數(shù)可能就成了一個常見的問題,在本章節(jié),希望能夠帶大家了解Redis連接數(shù)問題的現(xiàn)象和解法,需要的朋友可以參考下
    2023-12-12
  • redis實現(xiàn)存儲帖子的點贊狀態(tài)和數(shù)量的示例代碼

    redis實現(xiàn)存儲帖子的點贊狀態(tài)和數(shù)量的示例代碼

    使用Redis來實現(xiàn)點贊功能是一種高效的選擇,因為Redis是一個內(nèi)存數(shù)據(jù)庫,適用于處理高并發(fā)的數(shù)據(jù)操作,這篇文章主要介紹了redis實現(xiàn)存儲帖子的點贊狀態(tài)和數(shù)量的示例代碼,需要的朋友可以參考下
    2023-09-09
  • redis中的事務(wù)操作案例分析

    redis中的事務(wù)操作案例分析

    這篇文章主要介紹了redis中的事務(wù)操作案例,結(jié)合具體實例形式詳細分析了redis事務(wù)操作的概念、原理、使用技巧與相關(guān)注意事項,需要的朋友可以參考下
    2019-07-07
  • Redis妙用之存儲用戶token問題

    Redis妙用之存儲用戶token問題

    這篇文章主要介紹了Redis妙用之存儲用戶token問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程

    在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程

    這篇文章主要介紹了在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫的教程,Redis是一個可基于內(nèi)存的高性能NoSQL數(shù)據(jù)庫,需要的朋友可以參考下
    2015-11-11
  • 動態(tài)添加Redis密碼認證的方法

    動態(tài)添加Redis密碼認證的方法

    本篇文章主要介紹了動態(tài)添加Redis密碼認證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Redis實現(xiàn)分布式鎖的方法示例

    Redis實現(xiàn)分布式鎖的方法示例

    本篇文章主要介紹了Redis實現(xiàn)分布式鎖的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Redis核心原理與實踐之字符串實現(xiàn)原理

    Redis核心原理與實踐之字符串實現(xiàn)原理

    這本書深入地分析了Redis常用特性的內(nèi)部機制與實現(xiàn)方式,內(nèi)容源自對Redis源碼的分析,并從中總結(jié)出設(shè)計思路、實現(xiàn)原理。對Redis字符串實現(xiàn)原理相關(guān)知識感興趣的朋友一起看看吧
    2021-09-09
  • Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Redis定時任務(wù)原理的實現(xiàn)

    Redis定時任務(wù)原理的實現(xiàn)

    本文主要是基于?redis?6.2?源碼進行分析定時事件的數(shù)據(jù)結(jié)構(gòu)和常見操作,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

米脂县| 双桥区| 远安县| 朝阳市| 吴忠市| 潼南县| 保亭| 兴业县| 东乡族自治县| 巴东县| 禄丰县| 汉沽区| 海伦市| 金山区| 惠东县| 桂阳县| 凤山县| 伊川县| 聊城市| 宝清县| 宜兴市| 东港市| 二手房| 广宗县| 铜川市| 沧州市| 高陵县| 平乐县| 兖州市| 安岳县| 井研县| 南昌市| 清流县| 临海市| 孙吴县| 鄯善县| 安康市| 鹰潭市| 喀什市| 浪卡子县| 通海县|