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

近期热点新闻包头seo

近期热点新闻,包头seo,做游戏用什么电脑系统下载网站好,crm软件排行榜前十名一.项目背景 最近项目中需要进行接口保护#xff0c;防止高并发的情况把系统搞崩#xff0c;因此需要对一个查询接口进行限流#xff0c;主要的目的就是限制单位时间内请求此查询的次数#xff0c;例如1000次#xff0c;来保护接口。 参考了 开涛的博客聊聊高并发系统限流… 一.项目背景 最近项目中需要进行接口保护防止高并发的情况把系统搞崩因此需要对一个查询接口进行限流主要的目的就是限制单位时间内请求此查询的次数例如1000次来保护接口。 参考了 开涛的博客聊聊高并发系统限流特技 学习了其中利用Google Guava缓存实现限流的技巧在网上也查到了很多关于Google Guava缓存的博客学到了好多推荐一个博客文章http://ifeve.com/google-guava-cachesexplained/,关于Google Guava缓存的更多细节或者技术这篇文章讲的很详细 这里我们并不是用缓存来优化查询而是利用缓存存储一个计数器然后用这个计数器来实现限流。 二.效果实验 static LoadingCacheLong, AtomicLong count CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(new CacheLoaderLong, AtomicLong() {Overridepublic AtomicLong load(Long o) throws Exception {//System.out.println(Load call!);return new AtomicLong(0L);}}); 上面我们通过CacheBuilder来新建一个LoadingCache缓存对象count然后设置其有效时间为两秒即每两秒钟刷新一次缓存中key为一个long型的时间戳类型value是一个计数器使用原子性的AtomicLong保证自增和自减操作的原子性 每次查询缓存时如果不能命中即查询的时间戳不在缓存中则重新加载缓存执行load将当前的时间戳的计数值初始化为0。这样对于每一秒的时间戳能计算这一秒内执行的次数从而达到限流的目的 这是要执行的一个getCounter方法 public class Counter {static int counter 0;public static int getCounter() throws Exception{return counter;} } 现在我们创建多个线程来执行这个方法 ublic class Test {public static void main(String args[]) throws Exception{for(int i 0;i100;i){new Thread(){Overridepublic void run() {try {System.out.println(Counter.getCounter());}catch (Exception e){e.printStackTrace();}}}.start();}} } 这样执行的话执行结果很简单就是很快地执行这个for循环迅速打印0到99折100个数不再贴出。 这里的for循环执行100个进程时间是很快的那么现在我们要限制每秒只能有10个线程来执行getCounter()方法该怎么办呢上面讲的限流方法就派上用场了 public class Counter {static LoadingCacheLong, AtomicLong count CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(new CacheLoaderLong, AtomicLong() {Overridepublic AtomicLong load(Long o) throws Exception {System.out.println(Load call!);return new AtomicLong(0L);}});static long limits 10;static int counter 0;public static synchronized int getCounter() throws Exception{while (true){//获取当前的时间戳作为keyLong currentSeconds System.currentTimeMillis() / 1000;if (count.get(currentSeconds).getAndIncrement() limits) {continue;}return counter;}} } 这样一来就可以限制每秒的执行数了。对于每个线程获取当前时间戳如果当前时间(当前这1秒)内有超过10个线程正在执行那么这个进程一直在这里循环直到下一秒或者更靠后的时间重新加载执行load将新的时间戳的计数值重新为0。 执行结果 每秒执行11个因为从0开始每一秒之后load方法会执行一次 为了更加直观我们可以让每个for循环sleep一段时间public class Test {public static void main(String args[]) throws Exception{for(int i 0;i100;i){new Thread(){Overridepublic void run() {try {System.out.println(Counter.getCounter());}catch (Exception e){e.printStackTrace();}}}.start();Thread.sleep(100);}} }在上述这样的情况下一个线程如果遇到当前时间正在执行的线程超过limit值就会一直在while循环这样会浪费大量的资源我们在做限流的时候如果出现这种情况可以不进行while循环而是直接抛出异常或者返回来拒绝这次执行查询这样便可以节省资源。 转载于:https://www.cnblogs.com/sunp823/p/5601395.html
http://www.pierceye.com/news/968198/

相关文章:

  • 南阳网站建设报价沧州南皮网站建设
  • 网站左侧分类导航菜单用PS做的个人网站图片
  • 返利网 网站开发青岛开发区建网站哪家好
  • 还能电子商务网站建设短网址生成站长工具
  • 有专门做网站的吗网站后台发表文章
  • 秦皇岛汽车网站制作广州网站建设 知名
  • 自己建网站数据怎么做惠州网站制作培训
  • 南山做网站的wordpress自助友链
  • php企业网站源码软件工程师发展前景
  • 如何从建设局网站上更换职称人员哪个网站可以免费做国外网站
  • 情侣博客网站模板下载学校网站建设调查报告
  • 平台网站开发是什么意思全屏的网站
  • 素材图库网站源码网站建设及推广培训班
  • 英国电商网站jsp旅游网站开发系统
  • 机关网站建设引导语开发一个企业网站需要多少钱
  • 徐汇网站推广挣钱最快的小游戏
  • 手机网站开发的目的在线免费看影视网站
  • 湖州网站设计wordpress自动删除p标签
  • 昆明几大网站学生网站建设实训总结
  • 丽江手机网站建设建设公司起名大全
  • seo网站分析工具wordpress的安装包
  • 北京网站建设报价表徐州专业做网站
  • 怎样做网站卖网站国内免费开源crm
  • wordpress多语言网站济宁住房和城乡建设厅网站
  • 免费crm网站下载网站建设 繁体
  • 东莞企业官方网站建设网站建设对产品推销作用大吗
  • php网站路径问题站长工具权重查询
  • 箱包官方网站模板摄影后期教程网站
  • iis 手机网站同域名网站改版需要把之前网站里的文章都拷贝过来吗?
  • 网站是专门对生活中的一些所谓常识做辟谣的商标设计网站排行