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

詳解Redis如何優(yōu)雅地實(shí)現(xiàn)接口防刷

 更新時(shí)間:2024年03月12日 10:13:36   作者:shigen01  
這篇文章主要為大家詳細(xì)介紹了Redis優(yōu)雅地實(shí)現(xiàn)接口防刷的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

背景

最近在學(xué)習(xí)redis,想到了之前的寫的一個(gè)案例demo,實(shí)現(xiàn)了接口的流量防刷。主要是為了防止爬蟲爬取接口,當(dāng)然可以適用于那些需要進(jìn)行流控的系統(tǒng),shigen畫了一張草圖展示主要的原理和過(guò)程:

首先用戶請(qǐng)求系統(tǒng)的接口,后端會(huì)有一個(gè)流控的攔截器,這里邊主要是去獲得請(qǐng)求的信息,用ip+URI作為redis的key,查詢?cè)趓edis中記錄的次數(shù),如果次數(shù)大于規(guī)定的單位時(shí)間的訪問次數(shù),就認(rèn)為這是非法的請(qǐng)求了,就需要攔截了。那具體的代碼該怎么設(shè)計(jì)呢》?下邊是一份詳細(xì)的代碼案例。亮點(diǎn)在于:shigen使用了一個(gè)注解,支持接口的個(gè)性化設(shè)置。

代碼實(shí)現(xiàn)

自定義ReteLimit注解

package main.java.com.shigen.redis.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy,
import java.lang.annotation.Target;

/**
 * @author shigenfu
 * @date 2023/9/6 10:05 上午
 */
 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimit {
    
    /**
     * 限定時(shí)間
     * 
     * @return 限定時(shí)間
     */
     int seconds() default 1;
     /**
     * 最大請(qǐng)求數(shù)
     * 
     * @return 最大請(qǐng)求數(shù)!
     */
     int max() default 1;
}

其實(shí)就是兩個(gè)核心參數(shù)seconds max 規(guī)定了單位時(shí)間內(nèi)的最大訪問次數(shù)。

攔截器rateLimitIntercept

/**
* @author shigenfu
* @date 2023/9/6  10:09  上午
*/

@Component
public class RateLimitIntercept extends HandlerInterceptorAdapter {
    
    @Resource
    private RedisTemplate<String, String> redisTemplate;
    public static final String RATE_LIMIT_KEY = "rl:",
    
    @Override
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws IOException{
        // 請(qǐng)求是否是方法的請(qǐng)求
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod =(HandlerMethod) handler:
            // 獲得注解
            RateLimit methodAnnotation = handlerMethod.getMethodAnnotation(RateLimit.class);
            if (methodAnnotation == null) {
                return true;
            }
            int seconds = methodAnnotation.seconds();
            int max = methodAnnotation.max();
            
            String key = RATE_LIMIT_KEY + request.getRemoteAddr()+ ":"+ request.getRequestURI();
            String times = redisTemplate.opsForValue().get(key);
            if (times = null) {
                redisTemplate.opsForValue().set(key, String.value0f(1), seconds, TimeUnit.SECONDS);
            }else{
                int timesInt = Integer.parseInt(times);
                if(timesInt < max){
                    redisTemplate.opsForValue().set(key, String.value0f(timesInt + 1), seconds, TimeUnit.SECONDs);
                }else{
                    response.sendError(429,"to many requests");
                    return false;
                }
            }
        }
        return true,
    }
}

注冊(cè)到攔截器上

/**
* @author shigenfu
* @date 2023/9/6 11:30 上午
*/

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Resource
    private RateLimitIntercept rateLimitIntercept;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(rateLimitIntercept),
    }
}

這一步很重要,不然我們自定義的攔截器會(huì)不生效。

測(cè)試類測(cè)試

/**
 * @author shigenfu
 * @date 2023/9/6 11:25 上午
 */
 
@RestController
@RequestMapping(value ="rate")
public class RateLimitTestController {
    
    @GetMapping(value = "test")
    @RateLimit(seconds=10,max=2)
    public String test(){
        return UUID.randomUUID().toString();
    }
}

這里主要是寫了一個(gè)接口實(shí)現(xiàn)測(cè)試,訪問的時(shí)候返回隨機(jī)生成的UUID字符串。為了測(cè)試的效果明顯,我在@RateLimit上配置的是10s之內(nèi)只能允許2次請(qǐng)求。那現(xiàn)在開始測(cè)試吧!

測(cè)試

依舊用到的是ab這個(gè)工具。

 ab -c 2 -n 10 127.0.0.1:9000/rate/test

一起看看效果吧。

可以看到測(cè)試的報(bào)告,10個(gè)請(qǐng)求,8個(gè)失敗,2個(gè)成功,數(shù)據(jù)庫(kù)也存儲(chǔ)了對(duì)應(yīng)的key和value,很符合預(yù)期的效果。

頁(yè)面的錯(cuò)誤是這樣的,也很符合預(yù)期。

到此這篇關(guān)于詳解Redis如何優(yōu)雅地實(shí)現(xiàn)接口防刷的文章就介紹到這了,更多相關(guān)Redis接口防刷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis數(shù)據(jù)結(jié)構(gòu)ZipList,QuickList,SkipList使用及說(shuō)明

    Redis數(shù)據(jù)結(jié)構(gòu)ZipList,QuickList,SkipList使用及說(shuō)明

    文章介紹了ZipList數(shù)據(jù)結(jié)構(gòu)及其在Redis中的應(yīng)用,詳細(xì)解釋了其緊湊的內(nèi)存存儲(chǔ)方式和特點(diǎn)和應(yīng)用場(chǎng)景,同時(shí)探討了QuickList及其在Redis中的作用,以及不同數(shù)據(jù)類型的編碼方式和應(yīng)用場(chǎng)景
    2026-04-04
  • Redis批量刪除key的命令詳解

    Redis批量刪除key的命令詳解

    這篇文章主要介紹了Redis批量刪除key的命令詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Redis IO多路復(fù)用模型使用及說(shuō)明

    Redis IO多路復(fù)用模型使用及說(shuō)明

    這篇文章主要介紹了Redis IO多路復(fù)用模型使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Rocky9部署redis的實(shí)現(xiàn)示例

    Rocky9部署redis的實(shí)現(xiàn)示例

    本文主要介紹了Rocky9部署redis的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis集群的槽分配的幾種實(shí)現(xiàn)方法

    Redis集群的槽分配的幾種實(shí)現(xiàn)方法

    Redis集群中的槽用來(lái)管理和分配數(shù)據(jù)到不同的節(jié)點(diǎn),Redis集群總共有 16384個(gè)槽,所有的鍵根據(jù)哈希值被分配到這些槽中,下面將詳細(xì)介紹 Redis 集群的槽分配機(jī)制,感興趣的可以了解一下
    2025-09-09
  • Redis突現(xiàn)拒絕連接問題處理方案

    Redis突現(xiàn)拒絕連接問題處理方案

    這篇文章主要介紹了Redis突現(xiàn)拒絕連接問題處理方案,分析原因是由于redis與業(yè)務(wù)共一個(gè)服務(wù)器,內(nèi)存只有8G,業(yè)務(wù)服務(wù)啟動(dòng)過(guò)多,內(nèi)存不足導(dǎo)致redis拒絕連接,需要的朋友可以參考下
    2024-02-02
  • Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列使用小結(jié)

    Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列使用小結(jié)

    這篇文章主要介紹了Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列使用總結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 深度剖析Redis雙寫一致性問題的解決方案

    深度剖析Redis雙寫一致性問題的解決方案

    在高并發(fā)場(chǎng)景下,緩存與數(shù)據(jù)庫(kù)的雙寫一致性是每個(gè)開發(fā)者必須直面的核心挑戰(zhàn),本文通過(guò)5大解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-09-09
  • redis鎖機(jī)制介紹與實(shí)例

    redis鎖機(jī)制介紹與實(shí)例

    今天小編就為大家分享一篇關(guān)于redis鎖機(jī)制介紹與實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Redis正確使用的十個(gè)技巧

    Redis正確使用的十個(gè)技巧

    Redis已經(jīng)走過(guò)了很長(zhǎng)的一段路,隨之而來(lái)的一系列最佳實(shí)踐,使得大多數(shù)人可以正確地使用Redis,下面我們將探索正確使用 Redis 的10個(gè)技巧。
    2015-10-10

最新評(píng)論

苏尼特右旗| 吉木萨尔县| 宜昌市| 巴南区| 台东县| 台州市| 闵行区| 寿宁县| 社旗县| 永丰县| 龙海市| 锡林郭勒盟| 屏南县| 沭阳县| 武邑县| 海晏县| 仁化县| 荣成市| 西乌珠穆沁旗| 苍山县| 五原县| 鄯善县| 天峨县| 恩施市| 博客| 灌阳县| 扎赉特旗| 甘孜| 湘潭县| 土默特左旗| 乐都县| 张家界市| 抚松县| 通海县| 林西县| 油尖旺区| 济宁市| 永济市| 什邡市| 通辽市| 全椒县|