redisson滑动时间窗应用场景解决方案

 更新时间:2024年01月08日 09:58:52   作者:StrangerIt  
前10分钟内累计3次验证失败后,增加图形验证码验证条件,前10分钟内累计6次验证失败后,系统自动锁定该账号15分钟,15分钟后自动解锁,本文给大家分享redisson滑动时间窗应用场景解决方案,感兴趣的朋友一起看看吧

概述

前10分钟内累计3次验证失败后,增加图形验证码验证条件,前10分钟内累计6次验证失败后,系统自动锁定该账号15分钟,15分钟后自动解锁;

方案

基于redisson(zset)滑动时间窗记录最近10分钟内该账户登录失败次数

统计次数、每次失败加1

  /**
     * 统计请求次数
     *
     * @param windowTime 窗口时间,单位:秒
     * @param key        登录账户
     * @return 请求次数
     */
    public Integer count(int windowTime, String key) {
        // 窗口结束时间
        long windowEndTime = System.currentTimeMillis();
        // 窗口开始时间
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 创建 RBatch 实例,批量执行命令
            RBatch batch = redissonClient.createBatch();
            // 添加元素 score=当前时间戳 value=请求序列号,唯一不可重复
            batch.getScoredSortedSet(key).addAsync(windowEndTime, UUID.randomUUID().toString());
            // 统计数据
            batch.getScoredSortedSet(key).countAsync(windowStartTime, true, windowEndTime, true);
            // 清除窗口过期成员
            batch.getScoredSortedSet(key).removeRangeByScoreAsync(0, true, windowStartTime, false);
            // 设置key过期时间
            batch.getScoredSortedSet(key).expireAsync(Duration.ofSeconds(windowTime));
            // 执行管道命令
            BatchResult<?> batchResult = batch.execute();
            // 返回统计数量
            List<?> responses = batchResult.getResponses();
            Integer number = (Integer) responses.get(1);
            return number;
        } catch (Exception e) {
            log.error("统计请求次数异常!", e);
            return null;
        }
    }

获取登录失败次数

/**
     * 获取对应窗口的次数
     * @param windowTime 窗口大小十分钟,600s
     * @param key
     * @return
     */
    public Integer getLastCachedCount(int windowTime, String key) {
        // 窗口结束时间
        long windowEndTime = System.currentTimeMillis();
        // 窗口开始时间
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 创建 RBatch 实例,批量执行命令
            RBatch batch = redissonClient.createBatch();
            // 统计数据,获取上一次缓存存取的数据
            RFuture<Integer> countFuture = batch.getScoredSortedSet(key).countAsync(windowStartTime, true, windowEndTime, true);
            // 执行管道命令
            batch.execute();
            // 等待统计数据完成并获取结果
            Integer count = countFuture.get();
// 如果结果为null,则返回0,否则返回计数值
            return count == null ? 0 : count.intValue();
        } catch (Exception e) {
            log.error("获取上一次缓存存取数据异常!", e);
            // 如果出现异常,返回null
            return null;
        }
    }

清除登录失败次数

    public void clearCachedCount(int windowTime, String key) {
        // 窗口结束时间
        long windowEndTime = System.currentTimeMillis();
        // 窗口开始时间
        long windowStartTime = windowEndTime - windowTime * 1000L;
        try {
            // 创建 RBatch 实例,批量执行命令
            RBatch batch = redissonClient.createBatch();
            // 统计数据,获取上一次缓存存取的数据
            batch.getScoredSortedSet(key).removeRangeByScoreAsync(windowStartTime, true, windowEndTime, true);
            // 执行管道命令
            batch.execute();
// 如果结果为null,则返回0,否则返回计数值
        } catch (Exception e) {
            log.error("清楚登录失败记录次数异常", e);
        }
    }

到此这篇关于redisson滑动时间窗应用场景的文章就介绍到这了,更多相关redisson滑动时间窗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis如何正确关闭和开启持久化

    Redis如何正确关闭和开启持久化

    本文主要介绍了Redis如何正确关闭和开启持久化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Redis持久化使用及说明(RDB&AOF)

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

    Redis通过RDB(定期快照)和AOF(日志记录)实现持久化,兼顾内存性能与数据安全,RDB文件紧凑,适合冷备;AOF实时性强,但体积较大,两者结合使用(混合持久化)可平衡效率与可靠性,确保数据在异常重启时恢复
    2025-08-08
  • redis数据的两种持久化方式对比

    redis数据的两种持久化方式对比

    Redis是我们开发中常用的数据库,今天和大家分享的就是redis持久化的2种方式:RDB(Redis DataBase)和AOF(Apend Only File),希望对大家学习redis有帮助,一起来看看吧。
    2017-08-08
  • 详解Redis中的List类型

    详解Redis中的List类型

    这篇文章主要介绍了Redis中的List类型,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 如何在SpringBoot中使用Redis实现分布式锁

    如何在SpringBoot中使用Redis实现分布式锁

    这篇文章主要介绍了如何在SpringBoot中使用Redis实现分布式锁,在实际开发中有可能会遇到多个线程同时访问同一个共享变量,那么上锁就很重要了,需要的朋友可以参考下
    2023-03-03
  • Redis配置文件代码讲解

    Redis配置文件代码讲解

    在本篇文章里小编给大家整理的是一篇关于Redis配置文件的说明内容,需要的朋友们可以学习下。
    2020-03-03
  • Redis关于内存碎片的解决方法

    Redis关于内存碎片的解决方法

    今天生产机报内存爆满异常被叫过去查看问题,通过各种排除最终定位到了Redis的内存碎片的问题,这篇博客将详细介绍Redis内存碎片问题并给出最佳实践解决此问题,需要的朋友可以参考下
    2024-07-07
  • Window下Redis的安装和部署详细图文教程

    Window下Redis的安装和部署详细图文教程

    Windows 版本的 Redis 是 Microsoft 的开源部门提供的 Redis. 这个版本的 Redis 适合开发人员学习使用,生产环境中使用 Linux 系统上的 Redis, 这里讲解了这两种的安装和下载,按照你们需要的liunx 或window步骤来 就可以了
    2024-05-05
  • redis分布式锁解决缓存双写一致性

    redis分布式锁解决缓存双写一致性

    这篇文章主要为大家介绍了redis分布式锁解决缓存双写一致性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 基于session Redis实现登录

    基于session Redis实现登录

    这篇文章主要介绍了基于session Redis实现登录的相关资料,需要的朋友可以参考下
    2023-10-10

最新评论