常见限流算法

简介

限流顾名思义是对流量大小进行限制,防止请求数量超过系统的负载能力,导致系统崩溃,起到保护作用。
现实生活中限流也随处可见,节假日出门旅行的人数会剧增,对于旅游景点来说往往会不堪重负,如果不进行人数控制,对整个景点的压力会非常大,游客的体验也会非常差,还容易出现安全事故等危险。
同样的在一线城市地铁限流也非常常见,早高峰为了控制乘车人数和有序进站,地铁往往会在地铁口进行拦截,一定时间内才放行一部分人进站乘车。

具体到程序,限流可以有以下几种场景

  • 限制某个接口每秒最多访问多少次
  • 限制某个ip每秒最多访问多少次
  • 限制某个用户或某个来源每秒最多访问多少次
  • 限制某些用户下载速度每秒最多多少kb
  • 禁止某些用户或ip的访问

限流起到了保护作用,那么如何限呢?如果限制得太严,保护是保护到了,但是系统的处理能力下降了,体验会很差;如果限制得太松,就会被一些突增流量冲击到,或者被黑客利用进行安全攻击。如何限流需要根据系统的负载来评估,系统的负载和处理能力是动态的,例如平时的qps是1000,双11一般会进行扩容,也就是加服务节点,qps可能就是5000,这个时候系统处理能力变强的,限流策略也应该相应的调整。还有一种是出于安全的限流,例如同一个客户端ip 1s内对系统发出上万次请求,这种可以确定就是安全攻击,很可能是有人恶意破坏,或者是一些爬虫,这种可以限制请求数,超出的就直接拒绝。
如何限流是限流算法要实现的,常见的限流算法有“两桶两窗”,固定窗口、滑动窗口、漏桶与令牌桶,接下来介绍这四种算法及应用。

固定窗口

固定窗口的思想和实现非常简单,就是统计每个固定每个时间窗口的请求数,超过则拒绝。

如图我们定义了窗口大小为1s,最大请求数100,窗口内超过100的请求数将被拒绝。实现上也非常简单,利用redis的incr自增计数,当前时间秒作为缓存key,每次自增后判断是否超过指定大小即可。
固定窗口的问题是容易出现“突刺现象”,例如在1s内,100个请求都是在前100ms过来的,那么后面的900ms的请求都会被拒绝,而系统此时是空闲的。另外还有“临界问题”,如果100个请求是在后100ms过来的,而下一个1s的100个请求在前100ms过来,此时系统在这200ms内就需要处理200个请求,跟我们想要的不符合。到这里我们很容易想到,1s这个范围太大了,缩小一些就更好了,这种把固定窗口拆成更多个小窗口的做法就是滑动窗口算法了。

滑动窗口

滑动窗口的思想是将固定窗口拆成更多个小窗口,随着时间的推移,窗口不断的滑动,统计也在不断的变化。窗口拆分的越多,滑动就会越平滑,统计就会越精确,所消耗的资源就会越多。滑动窗口如果只拆为1个窗口,就退化为固定窗口。
滑动窗口算法可以解决上面固定窗口的问题,像hystrix和sentinel中都使用该算法进行数据统计,用于限流熔断等策略处理。如hystrix中图所示,在一个窗口内拆分了10个桶(bucket),随着时间的推移,会创建新的桶也会丢弃过期的桶,当然窗口的大小和拆分桶的数量都是可配置的。

漏桶

漏桶算法的思想是将请求先放到一个桶中,然后像滴水一样不断的从中取出请求执行,桶满则溢,后面的请求会被拒绝。

漏桶算法的特点是流入速度不确定,但是流出速度是确定的,漏桶可以很平滑,均衡的处理请求,但是无法应对短暂的突发流量。

令牌桶

令牌桶算法的思想是不断的生成令牌放到一个桶中,请求到来时到桶中申请令牌,申请得到就执行,申请不到就拒绝。如果桶中的令牌满了,新生成的令牌也会丢弃。

与漏桶不同的是,令牌桶是流入速度确定(生成令牌的速度),流出速度不确定,所以它不想漏桶一样可以均衡的处理请求,但是由于有令牌桶这个缓冲,一旦有突增的流量,令牌桶里已有的令牌可以短暂的应对突发流量,由于流出速度是不限制的,此时桶中已有的令牌都可以被申请到,请求一下子就会到我们的服务,给系统带来一定的压力,所以桶的大小需要合适,不宜过大。举个栗子:令牌桶的大小是1000,每秒放100个令牌,经过一段时间后,请求有空闲时,桶里的令牌就会积压,最终保存了满1000个令牌,由于某刻流量突增,有1000个请求到来,此时能申请到1000个令牌,所有请求都会放行,最终达到我们的系统,如果令牌桶过大,系统可能会承受不了这波请求。

应用

guava RateLimiter

guava限流实现的是桶算法,通过RateLimiter.create创建,可以创建两种类型的限流器,SmoothBursty和SmoothWarmingUp,前者定时生成令牌,后者有一个预热的过程。
我们如下示例代码,每秒会创建2个令牌,并且初始化的时候就是2。定时器每200ms会申请一次令牌,每秒申请5次,只有2次成功,所有运行程序每秒有3次success和2次fail。

        RateLimiter rateLimiter = RateLimiter.create(2);
		new Timer().schedule(new TimerTask() {
			@Override
			public void run() {
				if (rateLimiter.tryAcquire()) {
					System.out.println("success");
				} else {
					System.out.println("fail");
				}
			}
		}, 0, 200);

既然是桶,那么桶的大小是多少呢?SmoothBursty里最大令牌数由maxPermits字段表示,该字段等于maxBurstSeconds * permitsPerSecond,permitsPerSecond是每秒要生成的令牌数,maxBurstSeconds默认是1。
另外还可以创建SmoothWarmingUp带有预热功能的限流器,预热的作用是通过一个过程才达到permitsPerSecond,相当于让系统有个热身的时间。

		RateLimiter rateLimiter = RateLimiter.create(5, 10, TimeUnit.MILLISECONDS);
		new Timer().schedule(new TimerTask() {
			@Override
			public void run() {
				log.info("" + rateLimiter.acquire());			
			}
		}, 0, 200);

rateLimiter.acquire()返回的是获取打令牌的时间,运行程序可以看到开始并不是每秒都能产生5个令牌,也就是不是能立刻获取到令牌,获取令牌需要的时间会越来越小,直到预热期过后就能立马获取到令牌了。
guava的限流只能提供单机版的实现,对于集群就无能为力了,并且它通常作为一个工具存在,使用还需要自己封装,集成到服务,并不能开箱即用。

bucket4j

bucket4j是一个java实现,基于令牌桶算法的限流组件。它支持分布式限流,支持多种存储,可以方便与各种框架和监控集成。github上start 1.2K,但是issues数量少,国内估计使用的人也不多,并且官方的实现存储不支持最常用的redis,它专注于限流,如果是自研或者二次开发,是一个很好的参考。

Resilience4j

之前我们介绍过它的熔断功能,Resilience4j也提供了限流的实现,可以参考这里。相比guava,Resilience4j是框架级别的,可以很方便的使用。但Resilience4j也是单机版的实现,无法支持集群功能。
Resilience4j限流实现的是令牌桶,如下配置,每1s会生成10个令牌。

resilience4j.ratelimiter:
    instances:
        backendA:
            limitForPeriod: 10
            limitRefreshPeriod: 1s
            timeoutDuration: 0
            registerHealthIndicator: true
            eventConsumerBufferSize: 100

sentinel

流量控制是sentinel最重要的一个功能,sentinel属于后起之秀,文档齐全,支持的场景更加丰富。sentinel支持集群限流,也可以像guava一样预热,还可以基于调用链路进行限流。
sentinel还提供了控制台功能,支持多种数据源的持久化,使用spring cloud的话可以通过spring cloud alibaba引入sentinel。
开源版的sentinel有一些限制,并且使用起来并不是那么方便,例如Resilience4j可以配置一个default针对所有的请求生效,但sentinel需要单个单个url去配置,显得非常麻烦,包括熔断feign接口的配置也是,这个给spring cloud alibaba提了feature,也许在下一个版本就会提供支持。

nginx

上面讲到的都是应用级别的限流,nginx通常作为网络请求的入口,从运维的角度来说,在这里做限流再合适不过,nginx本身也提供了限流的支持。
nginx比较适合对外的限流,但是我们内部不同系统间的调用一遍不经过nginx,会直接访问到对方的网关,所以两者并不矛盾。
nginx限流通过limit_req和limit_conn两个模块支持,分别对应请求限制和链接限制(一个链接可以有多个请求)。

http {  
    limit_req_zone zone=name:10m rate=100r/s;  
    server {  
        location /app/ {
            limit_req zone=name burst=500 nodelay;
        }
}

如上,定义了一个name zone,访问速率最高是100个每秒,/app路径应用了这个规则。busrt表示爆发的意思,是一个缓冲队列,用于存储突增的请求,这些请求会被缓存不会拒绝,如果超过了burst,nodelay表示不等待直接拒绝。
前面我们说到有些恶意攻击可能每秒发送上万个请求,导致服务崩溃,如果多个应用系统共用一个nginx,那么可以统一在nginx配置处理,不需要每个系统自己去实现。

limit_conn_zone $binary_remote_addr zone=name:10m;

server {    
    limit_conn name 50;    
}

如上,定义了一个name zone,$binary_remote_addr表示远端地址,也就是ip,10m表示存储空间,10m大概可以存储16w的ip地址,我们在server节点应用这个规则,50表示最多50个,超过就会拒绝。

本文转载于网络 如有侵权请联系删除

相关文章

  • 带闰年判断的正则表达式

    作者:xixigongzhu(夕夕公主)http://search.csdn.net/Expert/topic/1974/1974227.xml?temp=.6640131首先,你的年的范围是1800-3999 润年: 1800,1900,2100,2200,2300,2500,2600,2700,2900,3000,3100,3300,3400,3500,3700,3800,3900是个特殊值(能被4整除但不是润年),要分出来: Stringleap1="(((1[8-9])|([2-3][0-9]))(0|2|4|6|8)(4|8))"; Stringleap2="(((2(0|4|8))|(3(2|6)))00)"; 其他的0结尾的: Stringleap3="(((1[8-9])|([2-3][0-9]))(2|4|6|8)0)"; 2,6结尾的: Stringleap4="(((1[8-9])|([2-3][0-9]))(1|3|5|7|9)(2|6))"; 润年2月: Stringleapmon

  • 腾讯C++后台开发面试笔试知识点参考笔记

    文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点。复制自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校学生准备参加校招,笔记都可以作为技术面试准备阶段参考查阅,查缺补漏。笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注我后面有时间再补上。阅读提示文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。gdb调试命令step和next的区别?当前line有函数调用的时候,next会直接执行到下一句,step会进入函数.查看内存(gdb)p&a//打印变量地址(gdb)x0xbffff543//查看内存单元内变量0xbffff543:0x12345678(gdb)x/4xb0xbffff543//单字节查看4个内存单元变量的值0xbffff543:0x780x560x340x12多线程调试(gdb)infothreads:查看GDB当前调试的程序的各个线程的相关

  • 机器学习之AdaBoost原理与代码实现

    AdaBoost原理与代码实现本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9642899.html基本思路Adaboost体现的是“三个臭皮匠,胜过一个诸葛亮”,它是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。训练过程如下(参考Andy的机器学习--浅析Adaboost算法,他说得非常形象,贴切。)简单的来说:图中的y1(x),y2(x)....ym(x)都是弱分类器(顾名思义,弱分类器就是分类能力很弱,仅比随机分类好一点点的分类器) 步骤:1.初始化了弱分类器2.对进行迭代处理产生了分类器3.对迭代处理产生了......4.依次迭代最后产生弱分类器5.将m个分类器加权处理,得到一个强处理器关键问题1.每一轮遍历如何改变数据的权值或概率分布?2.如何将多个弱分类器组合成一个强分类器?对于这两个问题的解答,就是下面介绍的Adaboost原理AdaBoost原理AdaBoos流程AdaBoost(adaptiv

  • Django1.4 python2.7

    Django1.4python2.7apachemod_python安装与部署实例花了四、五天时间终于把Django1.4+python2.7+apache+mod_python环境搭好,并通过实例验证。本文整合了网上的可用资源并解决了当前网络没有提到的问题,比如apache部署djang1.4问题。另外,本文所提到的所有包没有用yum自动安装,都是完全手动安装,这样能够更好地了解整个项目流程,同时锻炼自己linux的熟练程度(特别是对于新手)。 目录:一、实验环境二、Gcc安装(RPM手动安装)三、安装Apache2四、安装python2.7五、安装mod_python六、安装部署django一、实验环境Centos5.5Apache2:httpd-2.2.22.tar.gzhttp://www.fayea.com/apache-mirror//httpd/httpd-2.2.22.tar.gzpython2.7:Python-2.7.2.tar.bz2http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2django1

  • 【方法论】机器学习算法相关知识点

    机器学习这个词是让人疑惑的,首先它是英文名称MachineLearning(简称ML)的直译,在计算界Machine一般指计算机。这个名字使用了拟人的手法,说明了这门技术是让机器“学习”的技术。机器学习是一种让计算机利用数据而不是指令来进行各种工作的方法。1监督式学习工作机制:这个算法由一个目标变量或结果变量(或因变量)组成。这些变量由已知的一系列预示变量(自变量)预测而来。利用这一系列变量,我们生成一个将输入值映射到期望输出值的函数。这个训练过程会一直持续,直到模型在训练数据上获得期望的精确度。监督式学习的例子有:回归、决策树、随机森林、K–近邻算法、逻辑回归等。2非监督式学习工作机制:在这个算法中,没有任何目标变量或结果变量要预测或估计。这个算法用在不同的组内聚类分析。这种分析方式被广泛地用来细分客户,根据干预的方式分为不同的用户组。非监督式学习的例子有:关联算法和K–均值算法。3强化学习工作机制:这个算法训练机器进行决策。它是这样工作的:机器被放在一个能让它通过反复试错来训练自己的环境中。机器从过去的经验中进行学习,并且尝试利用了解最透彻的知识作出精确的商业判断。强化学习的例子有

  • php的四种标签风格

    ①标准格式(xml风格)默认推荐使用<?php .... ?>复制②短风格(需要在php.ini文件开启短风格,short_open_tag=On开始)<? .... ?>复制③asp风格在php.ini打开搜索asp_tags(On,Off),选择On开始asp风格<% .... %>复制④<script>风格<script language="php"> ...... </script>复制注意:第三四种风格标签基本淘汰,主要推荐使用第一种和第二种,第二种在xml种会被默认解析其他的xml的<?开始最好使用标准<?php        ?>标记

  • 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

    之前写了很多关于springcloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点:一、oauth中的角色client:调用资源服务器API的应用Oauth2.0Provider:包括AuthorizationServer和ResourceServer(1)AuthorizationServer:认证服务器,进行认证和授权(2)ResourceServer:资源服务器,保护受保护的资源 user:资源的拥有者二、下面详细介绍一下Oauth2.0ProviderAuthorizationServer:(1)AuthorizationEndpoint:进行授权的服务,DefaultURL: /oauth/authorize(2)TokenEndpoint:获取token的服务,DefaultURL: /oauth/tokenResourceServer:OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证三、下面再来详细介绍一下Authorizati

  • DNN在搜索场景中的应用

    DNN在搜索场景中的应用潜力,也许会比你想象的更大。--《阿里技术》1.背景搜索排序的特征在于大量的使用了LR,GBDT,SVM等模型及其变种。主要在特征工程,建模的场景,目标采样等方面做了很细致的工作。但这些模型的瓶颈也非常的明显,尽管现在PS版本LR可以支持到50亿特征规模,400亿的样本,但这看起来依然是不太够的,现在上亿的item数据,如果直接使用id特征的话,和任意特征进行组合后,都会超出LR模型的极限规模,对于GBDT,SVM等模型的能力则更弱,而我们一直在思考怎么可以突破这种模型的限制,找到更好的特征;另外,及时LR模型能支持到上亿规模的特征,在实时预测阶段也是有极大的工程挑战,性能与内存会有非常大的瓶颈。所以我们第一考虑到的是降维,在降维的基础上,进一步考虑特征的组合。所以DNN(深度神经网络)很自然进入了我们的考虑范围。再考虑的是如果把用户行为序列建模起来,我们希望是用户打开手淘后,先在有好货点了一个商品,再在猜你希望点了一个商品,最后进入搜索后会受到之前的行为的影响,当然有很多类似的方法可以间接实现这样的想法。但直接建模的话,LR这类的模型,很难有能力来支持这类特征

  • 【Python 第31课】 读文件

    之前,我们写的程序绝大多数都依赖于从命令行输入。假如某个程序需要输入很多数据,比如一次考试的全班学生成绩,再这么输就略显痛苦了。一个常见的办法就是把学生的成绩都保存在一个文件中,然后让程序自己从这个文件里取数据。要读取文件,先得有文件。我们新建个文件,就叫它data.txt。在里面随便写上一些话,保存。把这个文件放在接下来你打算保存代码的文件夹下,这么做是为了方便我们的程序找到它。准备工作就绪,可以来写我们的代码了。打开一个文件的命令很简单:file('文件名')这里的文件名可以用文件的完整路径,也可以是相对路径。因为我们把要读取的文件和代码放在了同一个文件夹下,所以只需要写它的文件名就够了。f=file('data.txt')但这一步只是打开了一个文件,并没有得到其中的内容。变量f保存了这个文件,还需要去读取它的内容。你可以通过read()函数把文件内所有内容读进一个字符串中。data=f.read()做完对文件的操作之后,记得用close()关闭文件,释放资源。虽然现在这样一个很短的程序,不做这一步也不会影响运行结果。但养成好习惯,可以避免以

  • go语言base64加密解密的方法

    本文实例讲述了go语言base64加密解密的方法。分享给大家供大家参考。具体实现方法如下:packagemain import( "encoding/base64" "fmt" ) const( base64Table="123QRSTUabcdVWXYZHijKLAWDCABDstEFGuvwxyzGHIJklmnopqr234560178912" ) varcoder=base64.NewEncoding(base64Table) funcbase64Encode(src[]byte)[]byte{ return[]byte(coder.EncodeToString(src)) } funcbase64Decode(src[]byte)([]byte,error){ returncoder.DecodeString(string(src)) } funcmain(){ //encode hello:="helloworld" debyte:=base64Encode([]byte(hello)) //d

  • 儿童智能手表存在安全漏洞而引发的思考

    如今,很多儿童手腕上带着智能手表。打开各大购物网站,输入“儿童智能手表”后,不同品牌的手表应有尽有,而且销量大都较为可观。市场上的儿童智能手表都有一个共同的功能,那就是提供通话和紧急呼叫服务,能够让家长随时联系到孩子。也正是这一点,满足了家长们的需求。(《人民日报海外版》12月25日)近几年,各大厂商纷纷研发生产出儿童智能手表,以“保护儿童安全”的产品观念走向市场,同时家长对孩子安全问题的重视,导致其销量一路攀升,尤其是在各种购物狂欢节中,儿童智能手表的销量也是十分抢眼。但是,近日英国广播公司报道称,德国联邦网络局禁止在该国销售儿童智能手表。而禁售原因,报道猜测可能是因为侵犯隐私或手表有安全漏洞。不仅如此,此前也有研究称,陌生人可以通过黑客技术对儿童进行跟踪、窃听儿童对话。如此看来,儿童智能手表的使用就引发了我们思考。首先,要肯定的是在科技发展日新月异的今天,我们的生产厂商能够紧跟科技发展,及时的推出满足市场需求的商品。但是,如果真的会有安全隐患的话,那就和市场需求背道而驰,生产厂商应该增强研发力量,对存在的安全漏洞和可能存在的安全隐患进行修复和防范,让手表自身先保证安全,再去保护儿童

  • 浅读K-means

    百度百科释义为  K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。  在数据挖掘中,K-Means算法是一种clusteranalysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。问题  K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左边有一些点,用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了K-Means算法。K-Means要解决的问题工作原理K-MEANS算法  输入:聚类个数k,以及包含n个数据对象的数据库。  输出:满足方差最小标准的k个聚类K-Means算法概要  从上图中,我们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是我们的种子点,也就是我们用来找点群的点。有两个种子点,所以K=2。  然后,K-Means

  • scrapy安装步骤_linux下安装scrapy

    大家好,又见面了,我是你们的朋友全栈君 1、Scrapy是什么 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理 或存储历史数据等一系列的程序中。 2、scrapy安装 安装过程中出错: 如果安装出现一下错误 building‘twisted.test.raiser’extension error:MicrosoftVisualC++14.0isrequired.Getitwith“MicrosoftVisualC++ BuildTools”:http://landinghub.visualstudio.com/visual‐cpp‐build‐tools解决方案: http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(如我的Twisted‐17.5.0‐cp37‐cp37m‐win_amd64.whl),cp后面是 python版本,amd64代表64位,运行命令: pipinstallC:\Users…\Twisted‐17.5.0‐cp37

  • 只用HTML,如何打开手机相机?前端小哥现场教学

    Alex发自凹非寺 量子位|公众号QbitAIHTML不是编程语言,但这并不妨碍前端工程师把它玩出花儿来。比如,有人就拿HTML来访问用户的相机——在网页上,点击按钮即可直接打开手机前置镜头来拍照。(没错,就是前置镜头!小哥可能有镜子之类的)也可以调用手机的后置镜头,开启摄像模式。值得注意的是,在这里,小哥只用了HTML语言就实现了上述功能。他利用HTML的capture属性,只需设置几个input参数,再加上几行代码搞定了。比起别的实现方式,这样可以更便捷地获取用户相机权限;而且没什么安全问题。不出所料,一大波程序员纷纷前来围观。有人表示:用HTMLcapture属性直接访问相机,确实比用JavaScript更方便。这位小哥的网名叫AustinGil,他是一位从事网页开发的工程师。下面就跟随小哥分享的内容,一起来看看具体实现步骤吧。如何用HTML打开相机?首先当然是写代环节。小哥创建了一个index.html文档,配合HTML的accpet属性,来指定不同标签所要capture的文件的具体属性。在这里,他设置了“environment”和“user”两个标签。当用户点击environ

  • 电商---销售---物流---供应链一体化架构

     

  • gRPC 在 Python中的应用

    python-mgrpc_tools.protoc--proto_path=.--python_out=.--grpc_python_out=.hello.proto 简介 在python中使用grpc和protobuf,比java和c#中使用要简单一些。只需要先安装grpcio包,然后就可以应用了。 安装 使用pip安装grpcio依赖包; $pipinstallgrpcio Collectinggrpcio Downloadinggrpcio-1.7.0-cp27-cp27m-macosx_10_10_intel.whl(1.5MB) 100%|████████████████████████████████|1.5MB18kB/s Requirementalreadysatisfied:enum34>=1.0.4in/Users/David/anaconda2/lib/python2.7/site-packages(fromgrpcio) Requirementalreadysatisfied:futures>=2.2.0in/Users/David/anaconda

  • 反射性能研究,反射赋值与set方法赋值对比

    可能我们有一个模糊的概念,反射性能会慢,但是有多慢没有一个具体的数据。那我就写代码来测试一下。 packagecom.itbac.reflection; importjava.lang.reflect.Field; publicclasstest{ publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{ longbegin=System.currentTimeMillis(); Bookbook=newBook(); book.setName("java从入门到放弃"); book.setNum(1); book.setPrice(1.2); System.out.println(book.toString()); //循环一千万次 for(inti=0;i<10000000;i++){ //1.set方法赋值耗时毫秒:7 //book.setNum(++i); //2.反射赋值耗时毫秒:1045 setFeild(book,i,"num"); } Syste

  • java将Excel文件上传并解析为List数组

    前端 //导入excel文件 layui.use('upload',function(){ varupload=layui.upload; //指定允许上传的文件类型 varuploadInst=upload.render({ elem:'#btn_import' ,url:contextPath+"/service/eoms/ordermgt/importExcel.ilf" ,accept:'file'//普通文件 ,done:function(res){ console.log(res); alert("success"); } }); });复制 javacontroller //导入excel表格并解析 @RequestMapping(value="/importExcel.ilf") @ResponseBody publicJSONObjectimportExcel(HttpServletRequestrequest,HttpServletResponseresponse,MultipartFilefile)throwsIOException{ Stringorig

  • 完整ASP.Net Excel导入

     //把EXCEL文件上传到服务器并返回文件路径       privateStringtypename(FileUploadfileloads)       {           stringfullfilename=fileloads.PostedFile.FileName;           stringfilename=fullfilename.Substring(fullfilename.LastIndexOf("\\")+1);           stringtype=fullfilename.Substr

  • UILable

    //UILable的大小自适应实例 UILabel*myLable=[[UILabelalloc]initWithFrame:CGRectMake(0,0,2,2)];//设定位置与大小 [myLablesetFont:[UIFontfontWithName:@"Helvetica"size:20.0]];//格式 [myLablesetNumberOfLines:0];//行数,只有设为0才能自适应 [myLablesetBackgroundColor:[UIColorclearColor]];//背景色 myLable.shadowColor=[UIColordarkGrayColor];//阴影颜色 myLable.shadowOffset=CGSizeMake(1.,1.0);//阴影大小 NSString*text=@"abcdefghijklmnopqrstuvwxyz"; UIFont*font=[UIFontfontWithName:@"Helvetica"size:20.0]; CGSizesize=[textsizeWithFont:fontconstrained

  • 美团,技术分享

    【前端篇】:http://dpurl.cn/Xy6IOU4【后台篇】:http://dpurl.cn/DPm3hdo【算法篇】:http://dpurl.cn/gIIjhRw【大数据篇】:http://dpurl.cn/Lb7j5xA【学术论文篇】:http://dpurl.cn/4KE72hn【2019美团点评技术文章合辑】:http://dpurl.cn/9zvkFYe ------------------------这是用来做笔记的,可能不够详细,如有问题可以留言-------------------------

相关推荐

推荐阅读