讲在redux-sagas异步操作之前,算是铺垫。
举个银行的排队例子。
看了很多的队列实例,都没举个简单例子。 其实银行的叫号系统就是形成队列的机制。 为什么叫队列,就是解决排队的问题。排队有什么问题?耗时间,插队,队列不稳定。通过程序就可以解决些问题。
实际的例子就是银行业务处理
1 第一种实例,大家都排队,每个人 花二十分钟办理业务。如果一百个人按顺序来要花很长的时间 。这种系统大家春节回家买票是肯定经历过,很漫长很痛苦,效率极低。 最可气的是如果售票员去吃饭去了,这个队伍就崩溃啦(线程)。在代售点是这样的,售票大厅为了解决这个问题就多增加几个窗口(多线程)来解决这个问题。
2 第二种实例。 到银行以后,抽号机或保安按照时间顺序给每个人发一个号码(几乎不花什么时间就可以完成这个任务),你不用一直在队伍里。可以去干其他事,等到柜台叫你的号码时,你就可以去办相关业务。这样队伍很长,但是保障了只要你有号码,即使某个柜员临时离开了,你的业务还是可以办理。
3 第三种实例。在第二种实例的基础上实行。抽完号以后。保安说大家有什么业务,先要按照规范来填单子,以免到了柜台反复的修改。 比如你要汇款,填完单子以后,保安说你这里面有几个问题需要修改一下。。。。经过修改以后,单子(表单)没有问题了。保安说你留下要办的材料和电话号码后可以走了。办完业务以后,我们会电话通知你的。过了两天,银行通知你业务量很大,这个业务刚才才办完。(有点夸张的例子) 。这个流程就是标准的队列流程。
发邮件,秒杀等等其实和这个流程一样的。最关键的地方就是要在很短的时间内形成队列,不要在队列里处理具体细节。可以把细节存起来后期处理。
说到这个后期处理,我想插一下nodejs的事件循环原理。以上的例子就是nodejs的事件循环实例的简单化, 细节存起来后期处理就是nodejs中的回调函数,每个人去办理业务都没有阻碍其他人办理业务,队伍不会因为一个人在柜台办理业务而暂停下来。尽管柜台只有一个柜员在处理业务。 这就是nodejs的单线程非阻塞机制。当然实际不是这么简单的,但是流程大概就是这样。所以现在nodejs很火,处理机制很高效。
那么在第三种模式你你是在什么时间开始办理业务的呢?实际上你一进银行大厅就开始办理业务了。 这个问题nodejs也有介绍的。
目前实现这个队列流程的简单方法是使用redis就相当于叫号的过程,memcache也可以,但是redis 可以在内存中使用,也可以存入物理数据库。
两者都可以使用内存来形成队列。 速度就是在使用内存存储机制来实现高速处理过程。
秒杀的例子原理也想不大明白,其实秒杀也是 队列。 用户登录以后,等待后台服务器启动秒杀程序(计划任务)。 抢购开始,先检查商品数量是否大于1,如果大于1,之后商品数量减1,队列写入用户信息,当前时间,秒杀内容。 写入完成以后,通知用户秒杀成功,可以处理后续的事务(出队列秒杀数据写入数据库)。前段时间魅族的note3很火,我哥很长时间都没有抢到,其实这里有是分队列的问题。点击抢购以后jd可能会根据不同区域来建立多个队列,每个地区的发货量是不同的,所以会出现有的地区能抢到好几次,有的地区每次都抢不到。就像是售票窗口1分了10张票,2号分了0张,你如果按照规则分到2号窗口是怎么也抢不到票的。
队列这个方法就是用来解决实际问题的。 具体的细节大家可以看看redis怎么处理实际的问题,网上有教程。 这里的队列先见先出。 关键点两个:怎么入队,怎么出队。 redis教程花很短时间就可以掌握, 基本操作和mysql是差不多的。
这是我原来学习node.js和php是写的内容。