iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用Java实现Redis限流的方法
  • 884
分享到

使用Java实现Redis限流的方法

2024-04-02 19:04:59 884人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

1、概述   限流的含义是在单位时间内确保发往某个模块的请求数量小于某个数值,比如在实现秒杀功能时,需要确保在10秒内发往支付模块的请求数量小于500个。限流

1、概述

  限流的含义是在单位时间内确保发往某个模块的请求数量小于某个数值,比如在实现秒杀功能时,需要确保在10秒内发往支付模块的请求数量小于500个。限流的作用是防止某个段时间段内的请求数过多,造成模块因高并发而不可用。

2、zset有序集合相关命令与限流

  zset也叫有序集合,是Redis的一种数据类型,在其中每个值(value)都会有一个对应的score参数,以此来描述该值的权重分值。可以通过如下形式的命令向zset有序集合里添加元素:

zadd key score value

  在限流相关的应用里,可以通过zadd命令往有序集合里存放数据时引入表示权重的score参数,并在其中存放时间戳。由于zset是有序集合,因此包含时间戳的score能被排序,这样就能用zremrangeByScore命令去除指定时间范围内的数据。zrenrabgeByScore命令的语法如下:

zremrangeByScore key min max

  通过该命令能在有序集合里删除键为key、score值在min到max范围内的数据。通过这种删除动作,能排除限流时间范围外的数据,并能在此基础上通过zcard命令统计有序集合内元素的数量,以确保请求数量小于限流的上限值。zcard命令的语法格式如下:

zcard key

  该命令会返回有序集合内指定key的元素数量。

3、zset有序结合与限流

有关redis启动的知识不做过多介绍了,这里我用Docker创建的redis容器

在这里插入图片描述

在这里插入图片描述

本例实现100秒内只能处理3个请求

LimitRequest.java


package com.baizhi.request;

import redis.clients.jedis.Jedis;

public class LimitRequest {
    public static void main(String[] args) {
        Jedis jedis=new Jedis("192.168.159.33",6379);
        jedis.del("PayRequest");
        //模拟发5个请求
        int cnt=5;
        for (int i = 0; i < cnt; i++) {
            LimitUtil.canVisit(jedis,"PayRequest",100,3);
        }
    }
}
class LimitUtil{
    //判断是否需要限流
    public static void canVisit(Jedis jedis,String requestType,int limitTime,int limitNum){
        long currentTime=System.currentTimeMillis();
        //把请求放入zset
        jedis.zadd(requestType,currentTime,Long.valueOf(currentTime).toString());
        //去掉时间范围外(超时)的请求
        jedis.zremrangeByScore(requestType,0,currentTime-limitTime*1000);
        //统计时间范围内总数
        Long count=jedis.zcard(requestType);
        //设置所有请求的超时时间
        jedis.expire(requestType,limitTime+1);
        boolean flag=limitNum>=count;
        if(flag){
            System.out.println("Can visit");
        }else{
            System.out.println("Can not visit");
        }
    }
}

  先通过zadd方法把表示操作类型的requestType作为键插入有序集合,插入时用表示当前时间的currentTime作为值,以保证值的唯一性,同时用currentTime作为有序集合里元素的score值。
   随后通过zremrangeByScore命令去除0到距当前时间limitTime时间范围内的数据。比如限流的时间范围是100秒,那么通过zremrangeByScore命令就能在有序集合里去除score范围从0到距离当前时间100秒的数据,这样就能确保有序集合内只存有最近100秒内发来的元素。
  其中,用zcard命令统计有序集合内键为requestType的个数,如果通过if语句发现当前个数还没有达到限流的上限,则允许该请求方法,否则不允许。这里通过最后的打印语句来模拟“是否允许请求访问”的动作。
  同时请注意,需要使用expire语句设置有序集合里相关键的超时时间,这样就能确保在限流动作完成后这些键能自动删除,而不是一致驻留在内存中。
  在main函数里,首先创建指向虚拟机6379端口的jedis对象,为了确保在多次运行时数据不相互干扰,在运行前通过del语句删除相关的键。
   随后使用for循环里通过调用canVisit方法模拟发出5个请求。在调用该方法时,通过传入参数指定限流所用的键为"PayRequest",同时指定了100秒内只能处理3个请求。运行之后控制台的效果如下:

在这里插入图片描述

到此这篇关于用Java实现Redis限流的文章就介绍到这了,更多相关Java实现Redis限流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用Java实现Redis限流的方法

本文链接: https://www.lsjlt.com/news/136766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Java实现Redis限流的方法
    1、概述   限流的含义是在单位时间内确保发往某个模块的请求数量小于某个数值,比如在实现秒杀功能时,需要确保在10秒内发往支付模块的请求数量小于500个。限流...
    99+
    2024-04-02
  • 使用AOP+redis+lua做方法限流的实现
    目录需求实现方式源码Limit 注解LimitKeyLimitTypeRedisLimiterHelperLimitInterceptorTestService需求 公司里使用One...
    99+
    2024-04-02
  • Springboot使用redis实现接口Api限流的方法
    这篇文章主要介绍“Springboot使用redis实现接口Api限流的方法”,在日常操作中,相信很多人在Springboot使用redis实现接口Api限流的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-20
  • Redis限流的实现方法有哪些
    本篇内容主要讲解“Redis限流的实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis限流的实现方法有哪些”吧!一、简单的限流基本原理当系统处理能力有限,如何组织计划外的请求对...
    99+
    2023-06-22
  • 使用SpringBoot + Redis 实现接口限流的方式
    目录配置限流注解定制 RedisTemplateLua 脚本注解解析接口测试全局异常处理Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了...
    99+
    2024-04-02
  • Redis实现限流器的方法有哪些
    这篇文章主要介绍了Redis实现限流器的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis实现限流器的方法有哪些文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • Redis实现限流器的三种方法(小结)
    目录方法一:基于Redis的setnx的操作方法二:基于Redis的数据结构zset方法三:基于Redis的令牌桶算法方法一:基于Redis的setnx的操作 我们在使用Redis的...
    99+
    2024-04-02
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • 怎么使用Go+Redis实现常见限流算法
    本文小编为大家详细介绍“怎么使用Go+Redis实现常见限流算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Go+Redis实现常见限流算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。固定窗口使用R...
    99+
    2023-07-05
  • 利用Redis实现访问次数限流的方法详解
    假设我们要做一个业务需求,这个需求就是限制用户的访问频次。比如1分钟内只能访问20次,10分钟内只能访问200次。因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Re...
    99+
    2024-04-02
  • redis实现限流的方式有哪些
    Redis实现限流的方式有以下几种:1. 固定窗口算法:对请求进行计数,在固定的时间窗口内,如果请求数超过阈值,则拒绝请求。2. 滑...
    99+
    2023-09-14
    redis
  • Java限流实现的几种方法详解
    目录计数器信号量滑动窗口漏桶令牌桶测试示例代码计数器 计数器限流方式比较粗暴,一次访问就增加一次计数,在系统内设置每 N 秒的访问量,超过访问量的访问直接丢弃,从而实现限流访问。 具...
    99+
    2022-12-03
    Java限流 Java限流算法 Java限流方案
  • Springboot使用redis实现接口Api限流的实例
    前言 该篇介绍的内容如题,就是利用redis实现接口的限流(  某时间范围内 最大的访问次数 ) 。 正文  惯例,先看下我们的实战目录结构: 首...
    99+
    2024-04-02
  • Java实现5种限流算法及7种限流方式
    目录前言1. 限流2. 固定窗口算法2.1. 代码实现3. 滑动窗口算法3.1. 代码实现4. 滑动日志算法4.1. 代码实现5. 漏桶算法6. 令牌桶算法6.1. 代码实现6.2....
    99+
    2022-11-13
    Java 限流算法 Java 限流方式 Java 限流
  • Redis限流的几种实现
    目录一、简单的限流 基本原理 二、漏斗限流 基本原理Redis-Cell 参考来源 一、简单的限流 基本原理 当系统处理能力有限,如何组织计划外的请求对系统施压。首先我们先看下一...
    99+
    2024-04-02
  • redis lua限流算法实现示例
    目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指...
    99+
    2024-04-02
  • redis lua限流算法如何实现
    本篇内容介绍了“redis lua限流算法如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!限流算法常见的限流算法计数器算法漏...
    99+
    2023-07-02
  • 如何使用SpringBoot + Redis实现接口限流
    本篇内容介绍了“如何使用SpringBoot + Redis实现接口限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!配...
    99+
    2023-06-30
  • java中如何实现redis限流操作
    这篇文章给大家分享的是有关java中如何实现redis限流操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体操作如下。导入所需依赖<properties>   &nb...
    99+
    2023-06-21
  • redis如何实现限流
    redis实现限流的示例:使用接口实现,接口代码如下:#指定用户user_id的某个行为action_key在特定的时间内period只允许发生最多的次数max_countdef is_action_al lowed(u...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作