当前位置: 首页 > article >正文

Springboot + zset + lua 实现滑动窗口

@Component
public class RedisRateLimiter {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private String luaScript() {
        return "redis.call('zremrangebyscore', KEYS[1], 0, tonumber(ARGV[1]) - tonumber(ARGV[2]) * 1000) " + // 移除过期的元素
                "if tonumber(redis.call('zcard',KEYS[1])) < tonumber(ARGV[3]) then " +  // 获取当前窗口内的元素数量,如果当前窗口内的元素数据超过窗口大小,删除最旧的元素, 窗口内的元素数量小于窗口大小
                "redis.call('zadd', KEYS[1], tonumber(ARGV[1]), tonumber(ARGV[1])) " + // 将新元素添加到ZSET中
                "redis.call('expire', KEYS[1], tonumber(ARGV[2])) " + // 设置过期时间
                "return true " +
                "else " +
                "return false " +
                "end";
    }

    public boolean slideWindowAlgorithmByLua(String key, int limitCount, long windowTime) {
        long currentTime = System.currentTimeMillis();
        List<String> argList = new ArrayList<>();
        argList.add(String.valueOf(currentTime));
        argList.add(String.valueOf(windowTime));
        argList.add(String.valueOf(limitCount));
        RedisScript<Boolean> redisScript = new DefaultRedisScript<>(this.luaScript(), Boolean.class);
        return Boolean.TRUE.equals(redisTemplate.execute(redisScript, Collections.singletonList(key), argList.toArray()));
    }



}

亲测有效,有何问题,请批评指正!


http://www.kler.cn/news/353243.html

相关文章:

  • 数字+文旅:AI虚拟数字人如何焕发传统文旅景区新活力?
  • pdf编辑软件有哪些?方便好用的pdf编辑软件分享
  • 免费开源Odoo软件如何实现电商仓库高效发货
  • #每日一题#自动化 2024年10月
  • 【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)
  • 华为OD机试 - 篮球比赛 - 递归(Java 2024 E卷 100分)
  • 【JAVA-数据结构】二叉树
  • 离岗睡岗预警系统 值班室离岗识别系统Python 结合 OpenCV 库
  • 【工具】一些很不错的资源合集
  • 2024百度云智大会|百度大模型内容安全合规探索与实践
  • day11-SpringMVC
  • JavaScript(JS)基础(二)
  • DB2数据库学习(一)
  • Linux 环境chrony设置服务器间时间同步一致
  • 代码签名证书怎么申请?
  • 【linux009】文件操作命令篇 - touch 命令
  • LeetCode Hot100 | Day5 | 二叉树右视图二叉树展开为链表
  • python配合yolov11开发分类训练软件
  • Linux操作系统小项目——实现《进程池》
  • 玛哈特矫平机:塑造未来制造业的平整基石
  • 微服务子项目中SpringBoot启动时无法正常加载yml配置文件
  • C++学习路线(十三)
  • 【Linux】Linux下进程Vs线程
  • 【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)
  • fiber的原理
  • CTFHUB技能树之SQL——报错注入