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

redisson滑動時間窗應(yīng)用場景解決方案

 更新時間:2024年01月08日 09:58:52   作者:StrangerIt  
前10分鐘內(nèi)累計3次驗證失敗后,增加圖形驗證碼驗證條件,前10分鐘內(nèi)累計6次驗證失敗后,系統(tǒng)自動鎖定該賬號15分鐘,15分鐘后自動解鎖,本文給大家分享redisson滑動時間窗應(yīng)用場景解決方案,感興趣的朋友一起看看吧

概述

前10分鐘內(nèi)累計3次驗證失敗后,增加圖形驗證碼驗證條件,前10分鐘內(nèi)累計6次驗證失敗后,系統(tǒng)自動鎖定該賬號15分鐘,15分鐘后自動解鎖;

方案

基于redisson(zset)滑動時間窗記錄最近10分鐘內(nèi)該賬戶登錄失敗次數(shù)

統(tǒng)計次數(shù)、每次失敗加1

  /**
     * 統(tǒng)計請求次數(shù)
     *
     * @param windowTime 窗口時間,單位:秒
     * @param key        登錄賬戶
     * @return 請求次數(shù)
     */
    public Integer count(int windowTime, String key) {
        // 窗口結(jié)束時間
        long windowEndTime = System.currentTimeMillis();
        // 窗口開始時間
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 創(chuàng)建 RBatch 實例,批量執(zhí)行命令
            RBatch batch = redissonClient.createBatch();
            // 添加元素 score=當(dāng)前時間戳 value=請求序列號,唯一不可重復(fù)
            batch.getScoredSortedSet(key).addAsync(windowEndTime, UUID.randomUUID().toString());
            // 統(tǒng)計數(shù)據(jù)
            batch.getScoredSortedSet(key).countAsync(windowStartTime, true, windowEndTime, true);
            // 清除窗口過期成員
            batch.getScoredSortedSet(key).removeRangeByScoreAsync(0, true, windowStartTime, false);
            // 設(shè)置key過期時間
            batch.getScoredSortedSet(key).expireAsync(Duration.ofSeconds(windowTime));
            // 執(zhí)行管道命令
            BatchResult<?> batchResult = batch.execute();
            // 返回統(tǒng)計數(shù)量
            List<?> responses = batchResult.getResponses();
            Integer number = (Integer) responses.get(1);
            return number;
        } catch (Exception e) {
            log.error("統(tǒng)計請求次數(shù)異常!", e);
            return null;
        }
    }

獲取登錄失敗次數(shù)

/**
     * 獲取對應(yīng)窗口的次數(shù)
     * @param windowTime 窗口大小十分鐘,600s
     * @param key
     * @return
     */
    public Integer getLastCachedCount(int windowTime, String key) {
        // 窗口結(jié)束時間
        long windowEndTime = System.currentTimeMillis();
        // 窗口開始時間
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 創(chuàng)建 RBatch 實例,批量執(zhí)行命令
            RBatch batch = redissonClient.createBatch();
            // 統(tǒng)計數(shù)據(jù),獲取上一次緩存存取的數(shù)據(jù)
            RFuture<Integer> countFuture = batch.getScoredSortedSet(key).countAsync(windowStartTime, true, windowEndTime, true);
            // 執(zhí)行管道命令
            batch.execute();
            // 等待統(tǒng)計數(shù)據(jù)完成并獲取結(jié)果
            Integer count = countFuture.get();
// 如果結(jié)果為null,則返回0,否則返回計數(shù)值
            return count == null ? 0 : count.intValue();
        } catch (Exception e) {
            log.error("獲取上一次緩存存取數(shù)據(jù)異常!", e);
            // 如果出現(xiàn)異常,返回null
            return null;
        }
    }

清除登錄失敗次數(shù)

    public void clearCachedCount(int windowTime, String key) {
        // 窗口結(jié)束時間
        long windowEndTime = System.currentTimeMillis();
        // 窗口開始時間
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 創(chuàng)建 RBatch 實例,批量執(zhí)行命令
            RBatch batch = redissonClient.createBatch();
            // 統(tǒng)計數(shù)據(jù),獲取上一次緩存存取的數(shù)據(jù)
            batch.getScoredSortedSet(key).removeRangeByScoreAsync(windowStartTime, true, windowEndTime, true);
            // 執(zhí)行管道命令
            batch.execute();
// 如果結(jié)果為null,則返回0,否則返回計數(shù)值
        } catch (Exception e) {
            log.error("清楚登錄失敗記錄次數(shù)異常", e);
        }
    }

到此這篇關(guān)于redisson滑動時間窗應(yīng)用場景的文章就介紹到這了,更多相關(guān)redisson滑動時間窗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis如何正確關(guān)閉和開啟持久化

    Redis如何正確關(guān)閉和開啟持久化

    本文主要介紹了Redis如何正確關(guān)閉和開啟持久化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Redis持久化使用及說明(RDB&AOF)

    Redis持久化使用及說明(RDB&AOF)

    Redis通過RDB(定期快照)和AOF(日志記錄)實現(xiàn)持久化,兼顧內(nèi)存性能與數(shù)據(jù)安全,RDB文件緊湊,適合冷備;AOF實時性強(qiáng),但體積較大,兩者結(jié)合使用(混合持久化)可平衡效率與可靠性,確保數(shù)據(jù)在異常重啟時恢復(fù)
    2025-08-08
  • redis數(shù)據(jù)的兩種持久化方式對比

    redis數(shù)據(jù)的兩種持久化方式對比

    Redis是我們開發(fā)中常用的數(shù)據(jù)庫,今天和大家分享的就是redis持久化的2種方式:RDB(Redis DataBase)和AOF(Apend Only File),希望對大家學(xué)習(xí)redis有幫助,一起來看看吧。
    2017-08-08
  • 詳解Redis中的List類型

    詳解Redis中的List類型

    這篇文章主要介紹了Redis中的List類型,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 如何在SpringBoot中使用Redis實現(xiàn)分布式鎖

    如何在SpringBoot中使用Redis實現(xiàn)分布式鎖

    這篇文章主要介紹了如何在SpringBoot中使用Redis實現(xiàn)分布式鎖,在實際開發(fā)中有可能會遇到多個線程同時訪問同一個共享變量,那么上鎖就很重要了,需要的朋友可以參考下
    2023-03-03
  • Redis配置文件代碼講解

    Redis配置文件代碼講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Redis配置文件的說明內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • Redis關(guān)于內(nèi)存碎片的解決方法

    Redis關(guān)于內(nèi)存碎片的解決方法

    今天生產(chǎn)機(jī)報內(nèi)存爆滿異常被叫過去查看問題,通過各種排除最終定位到了Redis的內(nèi)存碎片的問題,這篇博客將詳細(xì)介紹Redis內(nèi)存碎片問題并給出最佳實踐解決此問題,需要的朋友可以參考下
    2024-07-07
  • Window下Redis的安裝和部署詳細(xì)圖文教程

    Window下Redis的安裝和部署詳細(xì)圖文教程

    Windows?版本的?Redis?是?Microsoft?的開源部門提供的?Redis.?這個版本的?Redis?適合開發(fā)人員學(xué)習(xí)使用,生產(chǎn)環(huán)境中使用?Linux?系統(tǒng)上的?Redis,?這里講解了這兩種的安裝和下載,按照你們需要的liunx?或window步驟來?就可以了
    2024-05-05
  • redis分布式鎖解決緩存雙寫一致性

    redis分布式鎖解決緩存雙寫一致性

    這篇文章主要為大家介紹了redis分布式鎖解決緩存雙寫一致性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 基于session?Redis實現(xiàn)登錄

    基于session?Redis實現(xiàn)登錄

    這篇文章主要介紹了基于session?Redis實現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下
    2023-10-10

最新評論

大港区| 和政县| 从江县| 蓬莱市| 金川县| 平邑县| 达日县| 临夏市| 信阳市| 绥阳县| 板桥市| 新兴县| 浑源县| 太湖县| 永川市| 曲麻莱县| 福安市| 博客| 宜兴市| 阜南县| 贵溪市| 淮安市| 固镇县| 通城县| 江北区| 瑞安市| 定襄县| 东兴市| 南陵县| 关岭| 宾阳县| 新闻| 南宁市| 丰台区| 章丘市| 长海县| 化州市| 阜平县| 麦盖提县| 威信县| 赤城县|