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

redisson滑動時間窗應用場景解決方案

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

概述

前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) {
        // 窗口結束時間
        long windowEndTime = System.currentTimeMillis();
        // 窗口開始時間
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 創(chuàng)建 RBatch 實例,批量執(zhí)行命令
            RBatch batch = redissonClient.createBatch();
            // 添加元素 score=當前時間戳 value=請求序列號,唯一不可重復
            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);
            // 設置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ù)

/**
     * 獲取對應窗口的次數(shù)
     * @param windowTime 窗口大小十分鐘,600s
     * @param key
     * @return
     */
    public Integer getLastCachedCount(int windowTime, String key) {
        // 窗口結束時間
        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ù)完成并獲取結果
            Integer count = countFuture.get();
// 如果結果為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) {
        // 窗口結束時間
        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();
// 如果結果為null,則返回0,否則返回計數(shù)值
        } catch (Exception e) {
            log.error("清楚登錄失敗記錄次數(shù)異常", e);
        }
    }

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

相關文章

  • Redis如何正確關閉和開啟持久化

    Redis如何正確關閉和開啟持久化

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

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

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

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

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

    詳解Redis中的List類型

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

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

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

    Redis配置文件代碼講解

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

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

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

    Window下Redis的安裝和部署詳細圖文教程

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

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

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

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

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

最新評論

四平市| 江永县| 闻喜县| 永修县| 贵定县| 新营市| 肥乡县| 甘孜| 新和县| 兴和县| 新化县| 松溪县| 永昌县| 普宁市| 齐齐哈尔市| 泰来县| 贵定县| 禄劝| 新邵县| 无极县| 建瓯市| 仙桃市| 博野县| 韶山市| 定结县| 龙游县| 赫章县| 化隆| 剑川县| 科尔| 紫阳县| 方山县| 廊坊市| 华坪县| 铜陵市| 延川县| 定日县| 溆浦县| 谢通门县| 阿拉尔市| 金沙县|