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

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

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

假設我們要做一個業(yè)務需求,這個需求就是限制用戶的訪問頻次。比如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個時間維度的限制,所以這邊基于用戶和時間維度構建了Redis的Key。然后對每個Key進行計數(shù),計數(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í)行,拿到了所有結果后合并返回的。所以我們需要讓所有的Key都路由到一個節(jié)點上,本來就是用戶維度的,直接使用userId路由即可。

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

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

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

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腳本的時候要注意,某些云服務的Redis會對腳本進行校驗,像Redis的Key不能使用變量,必須用KEYS[下標]的方式,所以這里操作多個Key還不能用循環(huán),代碼得寫多遍,這是一個惡心的點。

總結

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

相關文章

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

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

    一般情況?Redis?連接數(shù)問題并不常見,但是當你業(yè)務服務增加、對?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中的事務操作案例分析

    redis中的事務操作案例分析

    這篇文章主要介紹了redis中的事務操作案例,結合具體實例形式詳細分析了redis事務操作的概念、原理、使用技巧與相關注意事項,需要的朋友可以參考下
    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源碼的分析,并從中總結出設計思路、實現(xiàn)原理。對Redis字符串實現(xiàn)原理相關知識感興趣的朋友一起看看吧
    2021-09-09
  • Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

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

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

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

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

最新評論

周宁县| 措美县| 来凤县| 信丰县| 阳朔县| 乐东| 黑龙江省| 平利县| 修武县| 遂川县| 读书| 屏东县| 新蔡县| 晋城| 东明县| 财经| 拜城县| 钟祥市| 九龙城区| 嘉祥县| 定南县| 宜都市| 德州市| 广东省| 榆林市| 南漳县| 武义县| 河西区| 长顺县| 孟州市| 新宾| 琼中| 平昌县| 盘山县| 南开区| 察雅县| 尉氏县| 瓮安县| 阳城县| 宜黄县| 屏东县|