博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
架构师养成记--13.代码层面用信号量做限流(转)
阅读量:4582 次
发布时间:2019-06-09

本文共 1876 字,大约阅读时间需要 6 分钟。

先抛出一个问题,如何解决互联网项目中的高并发问题?

1.网络层

2.服务器层面,常用的有nginx分流,负载均衡,负载权重。这些就是为了减轻单台服务器的压力。

3.业务划分

  这才是高并发解决方案的重点,系统应该被细粒度地分割成多个模块,如天猫的购物车系统、结算系统等,在具体划分出来的系统上做负载均衡等。

4.代码层面的限流策略。访问太多的话就拒绝。

5.缓存层面限流,或者说是session层面的限流;即一个用户访问一个url最多多少次,缓存可以用redis完成,redis中有实现这样的功能。

代码层面的限流策略

Semaphore sema = new Semaphore(5);//这里的5就表示最多接受5个线程。

sema.aquire();//获取授权

代码块;

sema.release();//释放

 

1 import java.util.concurrent.ExecutorService;   2 import java.util.concurrent.Executors;   3 import java.util.concurrent.Semaphore;   4    5 public class UseSemaphore {   6    7     public static void main(String[] args) {   8         // 线程池   9         ExecutorService exec = Executors.newCachedThreadPool();  10         // 只能5个线程同时访问  11         final Semaphore semp = new Semaphore(5);  12         // 模拟20个客户端访问  13         for (int index = 0; index < 20; index++) {  14             final int NO = index;  15             Runnable run = new Runnable() {  16                 public void run() {  17                     try {  18                         // 获取许可  19                         semp.acquire();  20                         System.out.println("Accessing: " + NO);  21                         //模拟实际业务逻辑22                         Thread.sleep((long) (Math.random() * 10000));  23                         // 访问完后,释放  24                         semp.release();  25                     } catch (InterruptedException e) {  26                     }  27                 }  28             };  29             exec.execute(run);  30         } 31         32         try {33             Thread.sleep(10);34         } catch (InterruptedException e) {35             e.printStackTrace();36         }37         38         //System.out.println(semp.getQueueLength());39         40         41         42         // 退出线程池  43         exec.shutdown();  44     }  45   46 }

转载于:https://www.cnblogs.com/panxuejun/p/8664153.html

你可能感兴趣的文章
HDU 4586 Play the Dice(数学期望)
查看>>
codeforce1029B B. Creating the Contest(简单dp,简单版单调栈)
查看>>
VC ++ 数据库资料收集理解
查看>>
ie11浏览器版本不识别
查看>>
千万要避免的五种程序注释方式
查看>>
redmine 1.2.1安装和安装会出现的问题
查看>>
SElinux的简介与用法
查看>>
TypeError: decoding Unicode is not supported
查看>>
Go:坑之for range
查看>>
取消后续事件
查看>>
如何监测谁用了SQL Server的Tempdb空间?
查看>>
oracle group by 显示其他字段
查看>>
这句话很恐怖,谨记。
查看>>
python实现简单消息总线
查看>>
Python中re(正则表达式)模块学习
查看>>
一对一关系
查看>>
git命令的使用 【备用】
查看>>
uva1391 2-SAT 问题
查看>>
数据类型
查看>>
Java秒杀系统实战系列~整合Shiro实现用户登录认证
查看>>