redis限流的實作方式有3種,分別是:1、基於Redis的setnx的操作,給指定的key設定了過期實踐;2、基於Redis的資料結構zset,將請求打造成一個zset數組;3.基於Redis的令牌桶演算法,輸出速率大於輸入速率,就要限流。
redis限流的實作方式有3種,分別是:
第一種:基於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等等問題
相關學習推薦:redis影片教學
第二種:基於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的資料結構會越來越大。實作方式相對也是比較簡單的。
第三種:基於Redis的令牌桶演算法
提到限流就不得不提到令牌桶演算法了。令牌桶演算法又稱為水桶演算法,具體可以參考度娘的解釋 令牌桶演算法
令牌桶演算法提及輸入速率和輸出速率,當輸出速率大於輸入速率,那麼就是超出流量限制了。
也就是說我們每訪問一次請求的時候,可以從Redis取得一個令牌,如果拿到令牌了,那就表示沒超出限制,而如果拿不到,則結果相反。
依靠上述的思想,我們可以結合Redis的List資料結構很輕易的做到這樣的程式碼
依靠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)結構。
有問題歡迎留言探討
以上是redis限流的實作方式有幾種?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis的功能主要包括緩存、會話管理和其他功能:1)緩存功能通過內存存儲數據,提高讀取速度,適用於電商網站等高頻訪問場景;2)會話管理功能在分佈式系統中共享會話數據,並通過過期時間機制自動清理;3)其他功能如發布-訂閱模式、分佈式鎖和計數器,適用於實時消息推送和多線程系統等場景。

Redis的核心功能包括內存存儲和持久化機制。 1)內存存儲提供極快的讀寫速度,適用於高性能應用。 2)持久化通過RDB和AOF兩種方式確保數據不丟失,選擇依據應用需求。

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函數functionsAllowCompOustomoperationsInlua,JavaScript,javaScript,orredis'sscriptinglanguigh,增強效率和增強性。 2)

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

Redis是NoSQL數據庫,提供高性能和靈活性。 1)通過鍵值對存儲數據,適合處理大規模數據和高並發。 2)內存存儲和單線程模型確保快速讀寫和原子性。 3)使用RDB和AOF機制進行數據持久化,支持高可用性和橫向擴展。

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。