跳过正文
  1. 博客/
  2. 后端/
  3. 框架/

秒杀系统的思考

·2 分钟· ·
后端 框架 Java
目录

最近的业务也做了一个类似秒杀业务的,自己在做的过程中也感悟到没有完美的解决方案,每种方法都有自己的缺点,
要基于业务去设计核心,而不是为了秒杀而秒杀

什么是秒杀系统
#

秒杀系统就是:

用生活的例子就是,一群人去超市排队买瓜,一人只能买一个,一共100个,抢完了就没有了

秒杀系统核心
#

秒杀系统最核心就是,如何确保数据一致性,不超买超卖,网上这种文章一搜一大把,你只要安安静静看几篇就能明白的七七八八了

在你看完之后大概就能设计出一个简单的Redis Lua脚本来进行秒杀,我这里就不介绍怎么写,教程实在是太多了

我这里想提出一点就是,大部分的教程都不会告诉你,Redis其实很脆弱的,它可能会崩溃,虽然概念很低,但是一旦崩溃,你的数据就不准确了

假如你完全依赖Redis作为秒杀成功标注的话,在极端case下面会出现超买超卖现象

怎么解决这个呢,其实很简单,只依赖Redis作为秒杀的过滤器,通过Redis完成秒杀,不一定抢购成功,要等数据库确认之后才能算秒杀成功

那么我们Redis是不是完全没有用了呢,恰恰相反,作用非常大,Redis将流量过滤到数据库可以接受的程度,假如流量全部打到数据库上面,数据库瞬间就崩溃了

扩展
#

在使用Redis过程中,我发现一个好玩的事情就是使用Redis做一个消息队列,并且对消息进行压缩,
这个压缩是指在消费的过程中,使用Lua脚本,批量获取队列值,然后清空队列,达到一个消息压缩的情况

相当于在Redis层做了一个数据处理的工作,优化了数据传输,但是有可能会造成Redis性能下降

总结
#

秒杀系统说难不难,说容易不容易,新手很容易忽视在高流量下面各个系统崩溃的极端情况,然而这些情况都是必须要重视的

相关文章

IO总结
·2 分钟
后端 框架 Java
最近被NIO这个概念弄得有点晕,一会是Linux的NIO一会是Java 的NewIO也叫NIO,然后Linux又有一个AIO的概念,但是Java里面好像没有,所以就好好理理IO到底是个啥东西
Bean复制真的那么慢吗
·3 分钟
后端 框架 Java
引言 # 最近在业务代码中经常用到的BeanUtils.copyProperties,有的时候在想,这个东西在Java里面真方便,但是性能怎么样呢,然后找了一篇博文 https://www.cnblogs.com/kancy/p/12089126.html
RPC大纲
·1 分钟
后端 框架 Java RPC
最近想系统学一下RPC框架,下面是我学习路径
SPI破坏了双亲委派吗
·4 分钟
后端 框架 Java
最近在学JVM的时候,把ClassLoader部分给过了一遍,谈到ClassLoader少不了双亲委派,谈到双亲委派少不了说破坏双亲委派的SPI,也看到了知乎上一些观点 ,这个时候我就疑惑了,有两个问题围绕在我头上,什么是双亲委派,为什么说SPI破坏了双亲委派,这篇博客就从源码出发,讲一讲我的理解
AOP再思考
·4 分钟
后端 框架 Java
我记得之前写过Spring AOP相关的文章,但是最近在观看Cat源代码的时候发现 @Aspect 这个注解与AspectJ这个项目,查阅了不少博客,感觉还是云里雾里,这篇博客就是基于博客以及自己实际实验与测试搞懂 Spring AOP和 AspectJ之间的关系
压测心得
·2 分钟
后端 框架 Java
最近在做一个接口的压测,一开始以为自己优化后的代码应该没得问题,没想到中途遇到不少问题