国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis實(shí)現(xiàn)限流的三種方式

這篇具有很好參考價(jià)值的文章主要介紹了Redis實(shí)現(xiàn)限流的三種方式。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、固定窗口

所謂固定窗口限流即時(shí)間窗口的起始和結(jié)束時(shí)間是固定的,在固定時(shí)間段內(nèi)允許要求的請求數(shù)量訪問,超過則拒絕;當(dāng)固定時(shí)間段結(jié)束后,再重新開始下一個(gè)時(shí)間段進(jìn)行計(jì)數(shù)。

我們可以根據(jù)當(dāng)前的時(shí)間,以分鐘為時(shí)間段,每分鐘都生成一個(gè)key,用來inc,當(dāng)達(dá)到請求數(shù)量就返回一些友好信息。

固定窗口

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm");
 
    @GetMapping("/Fixed")
    public String testFixedWindow() {
        String now = formatter.format(LocalDateTime.now());
 
        Long count = redisTemplate.opsForValue().increment(now + ":fixed");
        if (count > 5) {
            return "不好意思,服務(wù)器正忙,請一分鐘后再試......";
        } else {
            return "服務(wù)端正在處理";
        }
    }
}

?

該方式優(yōu)點(diǎn)是比較簡單粗暴,缺點(diǎn)是不夠靈活,對于邊界問題不能夠處理,如設(shè)置的時(shí)間段剛開始時(shí)流量占滿了設(shè)置的最大次數(shù),后面一段時(shí)間則不能夠再進(jìn)行訪問,必須等該時(shí)間段過了后才可以再次訪問。

二、滑動窗口

針對固定窗口限流的問題,可以采用滑動窗口來優(yōu)化改善。所謂滑動窗口即設(shè)置的時(shí)間窗口的起始和結(jié)束時(shí)間是不斷變化的,時(shí)間差值不變,允許的請求數(shù)量不變。

我們可以將請求打造成一個(gè)zset數(shù)組,當(dāng)每一次請求進(jìn)來的時(shí)候,value保持唯一,可以用UUID生成,而score可以用當(dāng)前時(shí)間戳表示,因?yàn)閟core我們可以用來計(jì)算當(dāng)前時(shí)間戳之內(nèi)有多少的請求數(shù)量。而zset數(shù)據(jù)結(jié)構(gòu)也提供了zrange方法讓我們可以很輕易的獲取到2個(gè)時(shí)間戳內(nèi)有多少請求。

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @GetMapping("/Sliding")
    public String testSlidingWindow() {
        Long currentTime = System.currentTimeMillis();
 
        System.out.println(currentTime);
        if (redisTemplate.hasKey("limit")) {
            // intervalTime是限流的時(shí)間
            Long intervalTime = 60000L;
            Integer count = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime).size();
            System.out.println(count);
            if (count != null && count > 5) {
                return "每分鐘最多只能訪問5次";
            }
        }
        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(), currentTime);
        return "訪問成功";
    }
}

?

通過上述代碼可以做到滑動窗口的效果,并且能保證每N秒內(nèi)至多M個(gè)請求,缺點(diǎn)就是zset的數(shù)據(jù)結(jié)構(gòu)會越來越大。實(shí)現(xiàn)方式相對也是比較簡單的。

三、令牌桶

Redisson可以實(shí)現(xiàn)很多東西,在Redis的基礎(chǔ)上,Redisson做了超多的封裝,不僅可以用來實(shí)現(xiàn)分布式鎖,還可以幫助我們實(shí)現(xiàn)令牌桶限流。

RateLimter主要作用就是可以限制調(diào)用接口的次數(shù)。主要原理就是調(diào)用接口之前,需要擁有指定個(gè)令牌。限流器每秒會產(chǎn)生X個(gè)令牌放入令牌桶,調(diào)用接口需要去令牌桶里面拿令牌。如果令牌被其它請求拿完了,那么自然而然,當(dāng)前請求就調(diào)用不到指定的接口。

RateLimter實(shí)現(xiàn)限流

/**
 * @author: AngJie
 * @create: 2022-07-26 14:41
 **/
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Autowired
    private Redisson redisson;
 
    @GetMapping("/Token")
    public String testTokenBucket() {
        RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
 
        // 最大流速 = 每10秒鐘產(chǎn)生1個(gè)令牌
        rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);
        //需要1個(gè)令牌
        if (rateLimiter.tryAcquire(1)) {
            return "令牌桶里面有可使用的令牌";
        }
        return "不好意思,請過十秒鐘再來~~~~~~~";
 
    }
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-677507.html

到了這里,關(guān)于Redis實(shí)現(xiàn)限流的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis的三種集群模式(圖解)

    Redis的三種集群模式(圖解)

    主從復(fù)制模式 一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。主節(jié)點(diǎn)提供寫入和讀取功能,但是從屬節(jié)點(diǎn)只提供讀取功能。 主從復(fù)制的數(shù)據(jù)同步過程如下: (1)首先主節(jié)點(diǎn)啟動,然后從屬節(jié)點(diǎn)啟動,從屬節(jié)點(diǎn)會連接主節(jié)點(diǎn)并發(fā)送SYNC命令以請求同步 (2)主節(jié)點(diǎn)收到SYNC命令之后,就會執(zhí)行BGSA

    2024年03月12日
    瀏覽(30)
  • Redis學(xué)習(xí)(八)Java三種方式實(shí)現(xiàn)分布式鎖

    在分布式服務(wù)中,經(jīng)常有例如 定時(shí)任務(wù) 這樣的場景。 在定時(shí)任務(wù)中,如果不使用 quartz 這樣的分布式定時(shí)工具,只是簡單使用 @Schedule 注解來實(shí)現(xiàn)定時(shí)任務(wù), 在服務(wù)分布式部署中 ,就有可能存在 定時(shí)任務(wù)并發(fā)重復(fù)執(zhí)行問題 。 對于解決以上場景中的問題,我們引入了 分布式

    2024年02月12日
    瀏覽(28)
  • 詳解redis的三種特殊數(shù)據(jù)類型

    14天學(xué)習(xí)訓(xùn)練營導(dǎo)師課程: 鄭為中《Vue和SpringBoot打造假日旅社管理系統(tǒng)》 努力是為了不平庸~ 學(xué)習(xí)有些時(shí)候是枯燥的,但收獲的快樂是加倍的,歡迎記錄下你的那些努力時(shí)刻(學(xué)習(xí)知識點(diǎn)/題解/項(xiàng)目實(shí)操/遇到的bug/等等),在分享的同時(shí)加深對于知識點(diǎn)的理解,同時(shí)吸收他人

    2024年02月19日
    瀏覽(21)
  • 【征服redis14】認(rèn)真理解一致性Hash與Redis的三種集群

    【征服redis14】認(rèn)真理解一致性Hash與Redis的三種集群

    前面我們介紹了主從復(fù)制的方式和sentinel方式,這里我們看第三種模式-Cluster方式。 目錄 1.前兩種集群模式的特征與不足 2.Cluster模式 2.1 Cluster模式原理 ?2.2 數(shù)據(jù)分片與槽位 2.3 Cluster模式配置和實(shí)現(xiàn) 3.一致性Hash 3.1 哈希后取模 3.2 一致性Hash算法 4 Redis Cluster集群 主從復(fù)制是Red

    2024年01月22日
    瀏覽(18)
  • Redis的三種持久化策略及選取建議

    Redis是一個(gè)基于內(nèi)存的高性能的鍵值型數(shù)據(jù)庫,它支持三種不同的持久化策略:RDB(快照)、AOF(追加文件)、混合。這三種策略各有優(yōu)缺點(diǎn),需要根據(jù)不同的場景和需求進(jìn)行選擇和配置。本文將介紹這三種策略 RDB 持久化策略是指在 一定的時(shí)間間隔內(nèi) ,將 Redis 內(nèi)存中的數(shù)據(jù)

    2024年02月04日
    瀏覽(24)
  • Redis數(shù)據(jù)一致性問題的三種解決方案

    Redis數(shù)據(jù)一致性問題的三種解決方案

    Redis(Remote Dictionary Server ),是一個(gè)高性能的基于Key-Value結(jié)構(gòu)存儲的NoSQL開源數(shù)據(jù)庫。大部分公司采用Redis來實(shí)現(xiàn)分布式緩存,用來提高數(shù)據(jù)查詢效率。 在Web應(yīng)用發(fā)展的初期,系統(tǒng)的訪問和并發(fā)并不高,交互也比較少。但隨著業(yè)務(wù)的擴(kuò)大,訪問量的提升,使得服務(wù)器負(fù)載和關(guān)系

    2024年02月14日
    瀏覽(22)
  • 脫離文檔流的三種方法

    脫離文檔流的三種方法

    ????????什么是脫離文檔流呢?可以這樣理解,本來這個(gè)標(biāo)簽是屬于文檔流管理的,那么它應(yīng)該按照文檔流的正常布局方式從左至右從上之下,并且符合標(biāo)簽本身的含義。 ????????脫離文檔流是指,這個(gè)標(biāo)簽脫離了文檔流的管理。不受文檔流的布局約束了,并且更重要

    2024年02月15日
    瀏覽(20)
  • 服務(wù)限流的六種方式

    服務(wù)限流,是指通過控制請求的速率或次數(shù)來達(dá)到保護(hù)服務(wù)的目的,在微服務(wù)中,我們通常會將它和熔斷、降級搭配在一起使用,來避免瞬時(shí)的大量請求對系統(tǒng)造成負(fù)荷,來達(dá)到保護(hù)服務(wù)平穩(wěn)運(yùn)行的目的。下面就來看一看常見的6種限流方式,以及它們的實(shí)現(xiàn)與使用。 固定窗

    2024年02月10日
    瀏覽(22)
  • redis+lua實(shí)現(xiàn)限流

    2024年02月07日
    瀏覽(17)
  • 【Spring】SpringBoot整合Redis,用Redis實(shí)現(xiàn)限流(附Redis解壓包)

    【Spring】SpringBoot整合Redis,用Redis實(shí)現(xiàn)限流(附Redis解壓包)

    ? ???個(gè)人主頁:哈__ 期待您的關(guān)注? 本文介紹SpringBoot整合Redis并且進(jìn)行接口的限流,文章主要介紹的是一種思想,具體代碼還要結(jié)合實(shí)際。 Redis的解壓包我放在了百度網(wǎng)盤上,有需要的可以下載。 Redis-x64-3.0.504 解壓碼:uhwj 我們在本地解壓下載的Redis壓縮包,打開解壓后的

    2024年04月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包