精华内容
下载资源
问答
  • 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);
        }
    }

     

    展开全文
  • 海量数据实时计算系统在高并发互联网应用原理和实践 占超群(阿里巴巴) 2012-12-05 16:50 永泰大宴会厅C 演讲幻灯片:海量数据实时计算系统在高并发互联网应用原理和实践[PDF] 随着...
    海量数据实时计算系统在高并发互联网应用中的原理和实践
    占超群(阿里巴巴)
    2012-12-05 16:50
    永泰大宴会厅C

    随着互联网个性化时代的来临,很多需要通过多角度多属性进行实时分析的需求应运而生,如想即时统计最近任意几天、指定省份、指定地市、指定性别、指定年龄、指定频道的用户情况;如想结合用户的省份、地市、年龄、性别、偏好、最近购买情况给用户即时推荐最热门的商品;如想统计出多个关键词组合在省份、地市、年龄、性别、偏好等条件下的分布情况;而这些多维度多属性统计会存在无法穷举和无法通过离线计算进行预算的问题,如果固化业务逻辑则无法应对互联网业务的快速变化,在高并发互联网应用中解决这类问题则面临更大的挑战。

    Garuda 是一个针对海量数据进行任意维度的密集计算与检索的支持高并发低延时的在线数据应用系统。目前在淘宝主站、SNS、数据魔方、淘宝指数等产品中得到了广泛应用,给这些产品提供高并发的实时计算服务;当前集群数据量已超过300亿条,平均每个请求涉及到300万条以上记录的实时多维度计算,请求响应时间小于50ms,QPS 超过300。本次分享将就Garuda设计原理、应用场景、历史变迁进行详细介绍,也将会介绍结合Redis、HBase的一些过渡方案的快速实现原理。


    展开全文
  • 1.3.4 设计并发友好的应用程序

    千次阅读 2014-07-22 18:03:46
    1.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后,下次就再加入一个任何到队列,就避免了线程的阻塞

    展开全文
  • 一、用badboy录制脚本。 录制完成以后导入jmeter中,测试是否能正常运行。 二、参数化 因为录制时候有些参数在重复执行时候是会变化,所以...四、设置并发数 用badboy录制循环次数要在sep中修改,在线程组
  • Android 并发/多线程 基础与应用

    千次阅读 2018-06-03 16:36:05
    本篇文章主要目的为总结 覆盖80%场景20% Android端并发所需基础知识和应用。 Android 端应用主要使用 Java 语言开发,所以基础与 Java 的并发基础基本一样,深入了解推荐细读《Java并发编程实践》。应用部分就会...
  • 开发高并发web应用的注意事项

    千次阅读 2012-08-17 11:05:27
    1 对Collection、Map接口类对象初始化时要先分配合理空间大小,同时还要按照自已实际需求选择合适对象。 例如:声明Vector vect=new Vector()时,系统调用: public Vector() { // 缺省构造函数...
  • WEB应用并发问题

    千次阅读 2017-07-20 15:38:25
    大型网站,比如门户网站。...这些解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,以下从平时的项目经验以及引用一些博客的思路来尝试解决高并发的情况。
  • 在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...
  • Java程序员应如何正确看待IO密集型应用的并发编程? 对于CPU密集型应用,性能瓶颈...在数据库性能一定的情况下,应用服务器需要支持尽可能多的并发请求,其实就是在内存一定的情况下支持更多并发的用户请求进入系统...
  • Web应用并发控制实现

    千次阅读 2014-05-28 14:26:55
    B/S构架的应用越来越普及,但由于它有别于C/S构架的特殊性,并发控制始终没能得到很好的解决,如售票系统经常会出现同一张火车票出售多次的现象。典型的案例如下: 例如若有两个客户端,A客户先读取了账户余额...
  • 泰康在线微信公众号系泰康在线财产保险股份有限公司旗下平台,希望可以通过持续不断的创新,提升客户对于保险的认知及体验,通过对大数据技术的应用,精准的为客户设计产品以及提供服务。泰康在线微信公众号,现有...
  • 测试并发应用(七)配置Eclipse来调试并发代码 声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 译者...在相同的应用里,他们提供了很多有趣的功能来整合,例如:
  • 在实际开发中我们为了提高CPU利用率,也提高程序执行效率,我们经常使用多线程进行对数据进行并发处理,下面我举一个多线程并发执行实例,大致意思就是 一个简单生产者消费者模式,二个线程进行存数据,一...
  • 面对用户量增长,记录数3W倍增长,如何保证这些记录能够在比较快时间内进入存储介质。  2. 应对用户量增长,如何在规定时间内完成采集,增加硬件设备处理能力还是使用更多服务器来处理请求。  3. ...
  • Java文件锁以及并发读写中的应用

    千次阅读 2017-06-12 09:37:04
    引言​ 在项目中,如果遇到需要并发读写文件的问题,那么对文件上锁分开访问是十分有必要的。因此这篇博文主要介绍文件锁的相关知识...从而在并发的场景下,我们才能对文件的读写进行控制。分类 共享锁:获取到共享锁,
  • 实现高并发程序时,多线程编程,或者多进程编程它们各自的优势是什么,即它们的应用场景,
  • IIS:连接数、并发连接数、最大并发工作线程数、应用程序池队列长度、应用程序池最大工作进程数详解 iis性能指标各种概念:连接数、并发连接数、最大并发工作线程数、应用程序池队列长度、应用程序池最大...
  • 【java并发】条件阻塞Condition的应用

    千次阅读 2016-06-04 16:38:45
    Condition将Object监视器方法(wait、notify 和 notifyAll)分解成截然不同对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了synchronized方法和语句...
  • CyclicBarrier,是JDK1.5java.util.concurrent并发包中提供一个并发工具类。 所谓Cyclic即 循环 意思,所谓Barrier即 屏障 意思。 所以综合起来,CyclicBarrier指就是 循环屏障,虽然这个...
  • 【java并发】Callable与Future的应用

    千次阅读 2016-06-03 19:11:55
    Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行类设计。但是 Runnable 不会返回结果,并且无法抛出经过检查异常。而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是...
  • 通常我们所说并发包也就是java.util.concurrent,集中了Java并发工具类和并发容器等,今天主要介绍Java并发编程工具类,我先从Java并发工具包谈起。 01 — 并发工具包涵盖范围 1.并发工具类 提供了比...
  • 小微金融、场景金融等新兴银行金融业务亟需一种新型弹性架构来应对高并发、大流量业务冲击,同时,要满足应用快速版本迭代升级、敏捷运维管理等需求。本文分享了BoCloud博云如何利用互联网应用架构与Docker容器...
  • 当我们在处理简单程序中,可以使用诸如count++这种简单计数器,但是这种简单处理在高并发/多线程中使用却是不安全,几乎可以百分百说,得到数据是未更新,不是实时数据,然而在JDK1.5之后,却封装了一...
  • 泰康在线微信公众号系泰康在线财产保险股份有限公司旗下平台,希望可以通过持续不断的创新,提升客户对于保险的认知及体验,通过对大数据技术的应用,精准的为客户设计产品以及提供服务。泰康在线微信公众号,现有...
  • 原创: 工匠若水 码农每日一题 首先 Lock 相对于 synchronized 来说更加面向对象,多个线程想要执行同步互斥就必须使用同一把 Lock 对象锁。而 ReadWriteLock(实现类...而多线程并发场景中对同一份数据进行读写操...
  • SQLite在多线程并发访问的应用

    万次阅读 2014-09-01 20:37:03
    最近遇到个SQLite问题把我卡住了小半天 SQLite不支持多线程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,268
精华内容 18,107
关键字:

并发的应用