-
Redis 计数器 高并发的应用
2018-11-28 11:52:49计数器的基本使用 /** * redis计数器 * @param key 键 * @return */ public Long test(String key){ //key为key,delta为递增数目,返回值为增长后的数量。 Long increment = redisTemplate.opsForV...计数器的基本使用
/** * redis计数器 * @param key 键 * @return */ public Long test(String key){ //key为key,delta为递增数目,返回值为增长后的数量。 Long increment = redisTemplate.opsForValue().increment(key, 1); return increment; }
短信发送请求次数限制
/** * 短信验证码请求次数限制 * @param mobile * @return */ public String sendVerifyCode(String mobile){ Long increment = redisTemplate.opsForValue().increment(mobile, 1); if (increment == 1) { //设置有效期一分钟 redisTemplate.expire(mobile, 60, TimeUnit.SECONDS); } if (increment > 1) { return "每分钟只能发送一次短信"; } //发送验证码 return "验证码已发送"; }
IP请求次数限制
定义消息发送类
/** * 拦截器消息发送 * @author 向振华 * @date 2018/11/28 10:52 */ public class BaseInterceptor extends HandlerInterceptorAdapter { /** * 发送异常信息 * @param request * @param response * @param code * @param msg * @param data */ public void sendMsg(HttpServletRequest request, HttpServletResponse response, int code, String msg, String data) { response.setCharacterEncoding("UTF-8"); response.setContentType("application/json"); //封装成返回给前端的固定格式 ResponseMessage responseMessage = new ResponseMessage(code, msg, data); String jsonObject = JSONObject.toJSONString(responseMessage); PrintWriter out = null; try { out = response.getWriter(); out.append(jsonObject); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } } } }
@Data public class ResponseMessage<T> implements Serializable { private static final long serialVersionUID = -2988364810346364595L; /** * 1:成功 -1:失败 */ private int code; /** * 错误信息 */ private String errorMsg; /** * 返回数据 */ private T data; public ResponseMessage(int code, String errorMsg, T data) { this.code = code; this.errorMsg = errorMsg; this.data = data; } public ResponseMessage(int code, String errorMsg) { this.code = code; this.errorMsg = errorMsg; } public ResponseMessage() { } }
拦截器编写
/** * IP请求次数限制 * @author 向振华 * @date 2018/11/28 10:55 */ public class CounterInterceptor extends BaseInterceptor { @Resource private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String ip = getRemoteHost(request); String key = ip + request.getRequestURI() + request.getSession().getId(); Long increment = redisTemplate.opsForValue().increment(key, 1); if (increment == 1) { //设置有效期一分钟 redisTemplate.expire(key, 60, TimeUnit.SECONDS); } //次数限制为5次 if (increment > 5) { sendMsg(request, response, -1, "次数限制", request.getRequestURI()); return false; } return true; } /** * 获取请求IP地址 * @param request * @return */ public String getRemoteHost(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; } }
拦截器配置
/** * 拦截器配置 * @author 向振华 * @date 2018/11/28 11:30 */ @Configuration @EnableTransactionManagement public class MyWebAppConfig extends WebMvcConfigurerAdapter { @Bean CounterInterceptor counterInterceptor() { return new CounterInterceptor(); } /** * 拦截器配置 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { //配置IP请求次数限制 registry.addInterceptor(counterInterceptor()); super.addInterceptors(registry); } }
-
海量数据实时计算系统在高并发互联网应用中的原理和实践
2013-05-01 23:34:14海量数据实时计算系统在高并发互联网应用中的原理和实践 占超群(阿里巴巴) 2012-12-05 16:50 永泰大宴会厅C 演讲幻灯片:海量数据实时计算系统在高并发互联网应用中的原理和实践[PDF] 随着...海量数据实时计算系统在高并发互联网应用中的原理和实践占超群(阿里巴巴)2012-12-05 16:50永泰大宴会厅C演讲幻灯片:海量数据实时计算系统在高并发互联网应用中的原理和实践[PDF]随着互联网个性化时代的来临,很多需要通过多角度多属性进行实时分析的需求应运而生,如想即时统计最近任意几天、指定省份、指定地市、指定性别、指定年龄、指定频道的用户情况;如想结合用户的省份、地市、年龄、性别、偏好、最近购买情况给用户即时推荐最热门的商品;如想统计出多个关键词组合在省份、地市、年龄、性别、偏好等条件下的分布情况;而这些多维度多属性统计会存在无法穷举和无法通过离线计算进行预算的问题,如果固化业务逻辑则无法应对互联网业务的快速变化,在高并发互联网应用中解决这类问题则面临更大的挑战。
Garuda 是一个针对海量数据进行任意维度的密集计算与检索的支持高并发低延时的在线数据应用系统。目前在淘宝主站、SNS、数据魔方、淘宝指数等产品中得到了广泛应用,给这些产品提供高并发的实时计算服务;当前集群数据量已超过300亿条,平均每个请求涉及到300万条以上记录的实时多维度计算,请求响应时间小于50ms,QPS 超过300。本次分享将就Garuda设计原理、应用场景、历史变迁进行详细介绍,也将会介绍结合Redis、HBase的一些过渡方案的快速实现原理。
-
1.3.4 设计并发友好的应用程序
2014-07-22 18:03:461.3.4 设计并发友好的应用程序 使用传统的命令风格编写多线程应用程序时,我们要面对两个问题: ■很难让现有的顺序代码变成并行的代码,因为要显式使用线程,必须修改大部分的基本代码。 ■使用共享状态和...1.3.4 设计并发友好的应用程序
使用传统的命令风格编写多线程应用程序时,我们要面对两个问题:
■很难让现有的顺序代码变成并行的代码,因为要显式使用线程,必须修改大部分的基本代码。
■使用共享状态和锁定是困难的。必须仔细考虑如何使用锁来避免争用条件和死锁,留下足够的空间并行执行。
函数式编程给了我们答案:
■使用声明编式程风格时,可以在现有的代码中引入并行。替换很少几个基元,就能把命令与并行方式执行的命令组合起来。
■由于具有不可变性,不可能引入争用条件,可以编写无需锁定的代码;只要看到哪部分程序是独立的,就可以立刻把它修改成并行运行的任务。
这两个方面能够影响我们如何设计应用程序,以及更易于编写并行运行的代码,充分利用多核的机器。但是,写不可变代码,并不开然获得并化行,还有棘手的工作要做,只是函数式编程能够将花在并行化上的额外努力降至最低。
还没有完,当开始用函数方式进行思考,还会发现在设计中有其他改变……
-
ExecutorService并发池的应用
2010-04-16 16:17:00同样还是工作中用到的ExecutorService这个线程池。多线程这块一直在我印象里就是一个难缠的家伙。自己本来也是新手还用了ExecutorService这个类,所以不用想,给我带来了很大的麻烦。ExecutorService这个从API查得...同样还是工作中用到的ExecutorService这个线程池。
多线程这块一直在我印象里就是一个难缠的家伙。自己本来也是新手
还用了ExecutorService这个类,所以不用想,给我带来了很大的麻烦。ExecutorService这个从API查得好像有三种模式。具体的
我也就不多少有什么区别了,因为我也搞不清。最终我选择了Executors.newFixedThreadPool(10); 这个是生成一个固定线程数
的线程池,在这里我就定义了一个只能容纳10个线程的线程池。
那么定义好了怎么用呢,看看代码吧:
int pageDownloaderPoolNumber =10;
public static ExecutorService pageDownloaderPool = Executors.newFixedThreadPool(pageDownloaderPoolNumber);
首先定义好pageDownloaderPool,最大线程数为10。
crawlerFactory cf = new crawlerFactory(crawler); // 此处为new一个线程对象,因为在线程池中放的任务必须是一个线程类的对象
即继承了Runnable接口或其他某某的类的对象。
pageFutureList.add(pageDownloaderPool.submit(cf));//此处是将线程任务放进线程池中执行。注意,因为该线程池可以返回
一个任务队列。所以我们要定义一个FutureList来获得这些任务队列:
public static List<Future> pageFutureList = new ArrayList<Future>(pageDownloaderPoolNumber);
这样线程池里的任务就启动了,但要记住,如果你有30个线程同时启动,那么最多有10个在工作,同时还得对任务队列进行管理
特别是pageFutureList.add(pageDownloaderPool.submit(cf));这个在循环中的话一定要加上控制:
while(){
----------
hasFreeThread(pageFutureList);
if(pageFutureList.size() < pageDownloaderPoolNumber){
pageFutureList.add(pageDownloaderPool.submit(cf));
}
}
同时有这么一个方法去检测队列是否有空闲的:
public static boolean hasFreeThread(List<Future> list){
synchronized (list) {
if(list.size() == 0){
return true;
}
Future finishedFuture = null;
try{
for (Future temp : list) {
if(temp.isDone()/* || temp.get() == null*/){
finishedFuture = temp;
return true;
}
}
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
if(finishedFuture != null){
list.remove(finishedFuture);
}
}
return false;
}
}这样的话任务队列中就保持着永远最大数是10,当完成一个任务变成9后,下次就再加入一个任何到队列,就避免了线程的阻塞
-
Jmeter测试应用系统的并发
2017-01-21 11:10:04一、用badboy录制脚本。 录制完成以后导入jmeter中,测试是否能正常运行。 二、参数化 因为录制的时候有些参数在重复执行的时候是会变化的,所以...四、设置并发数 用badboy录制的循环次数要在sep中修改,在线程组 -
Android 并发/多线程 的基础与应用
2018-06-03 16:36:05本篇文章主要目的为总结 覆盖80%场景的20% Android端并发所需基础知识和应用。 Android 端应用主要使用 Java 语言开发,所以基础与 Java 的并发基础基本一样,深入了解推荐细读《Java并发编程实践》。应用部分就会... -
开发高并发web应用的注意事项
2012-08-17 11:05:271 对Collection、Map接口的类对象初始化时要先分配合理的空间大小,同时还要按照自已的实际需求选择合适的对象。 例如:声明Vector vect=new Vector()时,系统调用: public Vector() { // 缺省构造函数... -
WEB应用中的高并发问题
2017-07-20 15:38:25大型网站,比如门户网站。...这些解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,以下从平时的项目经验以及引用一些博客的思路来尝试解决高并发的情况。 -
Netty的并发编程实践4:线程安全类的应用
2015-06-01 10:49:19在JDK1.5的发行版本中,Java平台新增了java.util.concurrent,这个...新的并发编程包中的工具可以分为如下4类。 ◎ 线程池Executor Framework以及定时任务相关的类库,包括Timer等。 ◎ 并发集合,包括List、Queue -
如何解决应用高并发的问题
2014-10-14 16:56:58系统在正式上线后必将会面对大量用户访问,面对各种层级的高并发请求,因此我们会采用高性能的服务器、高性能的数据库、高效率的编程语言、高性能的Web容器等。但是这几个方面,还无法从根本解决大型网站面临的高... -
web应用账户金额的并发问题
2017-11-02 16:48:45项目使用的是mysql数据库,使用的是mysql默认的repeatable read事务级别, 今天需要讨论的是,用户消费业务账户金额扣除的并发性问题。 消费业务代码肯定是用spring的事务管理的。 一开始的代码是这样的,里面加了... -
高并发业务的应用场景和设计理念
2018-09-10 01:42:22互联网系统的应用架构基础分析 !互联网架构](https://img-blog.csdn.net/20180910014136222?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FkZW1lbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA... -
如何正确看待IO密集型应用的并发编程
2019-01-31 11:42:38Java程序员应如何正确看待IO密集型应用的并发编程? 对于CPU密集型应用,性能瓶颈...在数据库性能一定的情况下,应用服务器需要支持尽可能多的并发请求,其实就是在内存一定的情况下支持更多并发的用户请求进入系统... -
Web应用中并发控制的实现
2014-05-28 14:26:55B/S构架的应用越来越普及,但由于它有别于C/S构架的特殊性,并发控制始终没能得到很好的解决,如售票系统经常会出现同一张火车票出售多次的现象。典型的案例如下: 例如若有两个客户端,A客户先读取了账户余额... -
一个可供参考的Java高并发异步应用案例
2016-07-14 16:04:49泰康在线微信公众号系泰康在线财产保险股份有限公司旗下平台,希望可以通过持续不断的创新,提升客户对于保险的认知及体验,通过对大数据技术的应用,精准的为客户设计产品以及提供服务。泰康在线微信公众号,现有... -
测试并发应用(七)配置Eclipse来调试并发代码
2016-07-30 17:53:46测试并发应用(七)配置Eclipse来调试并发代码 声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 译者...在相同的应用里,他们提供了很多有趣的功能来整合,例如: -
多线程的并发执行应用(生产者消费者模式)
2014-08-19 23:11:03在实际的开发中我们为了提高CPU的利用率,也提高程序的执行效率,我们经常使用多线程进行对数据进行并发处理,下面我举一个多线程并发执行的实例,大致意思就是 一个简单的生产者消费者模式,二个线程进行存数据,一... -
高并发数据采集的架构应用(Redis的应用)
2016-05-18 10:25:17面对用户量的增长,记录数3W倍的增长,如何保证这些记录能够在比较快的时间内进入存储介质。 2. 应对用户量的增长,如何在规定的时间内完成采集,增加硬件设备处理能力还是使用更多的服务器来处理请求。 3. ... -
Java文件锁以及并发读写中的应用
2017-06-12 09:37:04引言 在项目中,如果遇到需要并发读写文件的问题,那么对文件上锁分开访问是十分有必要的。因此这篇博文主要介绍文件锁的相关知识...从而在并发的场景下,我们才能对文件的读写进行控制。分类 共享锁:获取到共享锁, -
并发编程下多线程多进程的应用场景
2016-05-08 11:33:21实现高并发程序时,多线程编程,或者多进程编程它们各自的优势是什么,即它们的应用场景, -
IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
2018-04-04 11:36:00IIS:连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大... -
【java并发】条件阻塞Condition的应用
2016-06-04 16:38:45Condition将Object监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了synchronized方法和语句... -
Java并发32:CyclicBarrier的基本方法和应用场景实例
2018-04-01 17:17:03CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。 所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。 所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个... -
【java并发】Callable与Future的应用
2016-06-03 19:11:55Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是... -
高并发编程系列:4大并发工具类的功能、原理、以及应用场景
2018-11-12 21:36:29通常我们所说的并发包也就是java.util.concurrent,集中了Java并发工具类和并发容器等,今天主要介绍Java并发编程的工具类,我先从Java并发工具包谈起。 01 — 并发工具包涵盖范围 1.并发工具类 提供了比... -
高并发金融应用架构优化与平台创新
2016-05-23 15:15:36小微金融、场景金融等新兴银行金融业务亟需一种新型的弹性架构来应对高并发、大流量的业务冲击,同时,要满足应用快速版本迭代升级、敏捷运维管理等需求。本文分享了BoCloud博云如何利用互联网应用架构与Docker容器... -
AtomicInteger 在高并发量应用程序中的使用及volatile说明
2012-07-03 16:08:39当我们在处理简单程序中,可以使用诸如count++这种简单的计数器,但是这种简单的处理在高并发/多线程中的使用却是不安全的,几乎可以百分百的说,得到的数据是未更新的,不是实时数据,然而在JDK1.5之后,却封装了一... -
一个可供参考的Java高并发异步应用案例--转
2017-08-24 17:39:37泰康在线微信公众号系泰康在线财产保险股份有限公司旗下平台,希望可以通过持续不断的创新,提升客户对于保险的认知及体验,通过对大数据技术的应用,精准的为客户设计产品以及提供服务。泰康在线微信公众号,现有... -
线程并发 ReadWriteLock 应用场景相关问题解析
2018-08-28 21:33:04原创: 工匠若水 码农每日一题 首先 Lock 相对于 synchronized 来说更加面向对象,多个线程想要执行同步互斥就必须使用同一把 Lock 对象锁。而 ReadWriteLock(实现类...而多线程并发场景中对同一份数据进行读写操... -
SQLite在多线程并发访问的应用
2014-09-01 20:37:03最近遇到个SQLite的问题把我卡住了小半天 SQLite不支持多线程
-
简单增删查改新闻管理系统
-
物联网之mqtt实现(emqx+springboot+mqtt附源码)
-
ApacheBeam实战指南|玩转KafkaIO与Flink
-
从理论到试验台,WiFi DCF网络的性能评估
-
AcWing 703. 数独检查
-
笔记
-
需求分析与建模最佳实践
-
虚幻4引擎基础
-
Session实现网站在线人数统计
-
ApacheFlink漫谈系列-概述
-
composer中一些命令\参数\说明
-
NFS 实现高可用(DRBD + heartbeat)
-
做了一套模拟卷2021年2月25日02:36:43
-
Linux基础入门系列课程
-
通过新颖的二元君主蝶优化算法解决0-1背包问题
-
JAVA 面向对象
-
illustrator软件Mac电脑入门学习必备
-
【CTF资料-0x0002】简易Linux堆利用入门教程by arttnba3
-
PHP安装教程
-
射影级双缝光子晶体光机腔设计