redis 多线程_Redis解决商品秒杀中出现超卖问题(Java多线程模拟高并发环境)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:31   1883   0
89fe1614589fbfebbdd79bfa29e13a74.png

一、引入Jedis依赖

可以新建Spring或Maven工程,在pom文件中引入Jedis依赖:

 redis.clients jedis 2.9.0

二、Jedis工具类

JedisUtil.java

009996f3d7f3db62501c89c7d85b58cd.png

三、秒杀测试类(代码模拟多用户+高并发)

RedisSecKiller.java

b08984e6c3bf15981db72a2f971af1e0.png
96f1c53d0211b70d56b75b6994142382.png

注:关于多线程部分代码的说明

传统的方式是使用new Thread来创建、运行(start)线程,但那样太低效了;使用定长线程池 + ExecutorService的execute方法来创建、运行线程,比前者高效得多。

四、运行结果

4.1 Redis数据插入结果

进入RedisManager -> db0查看

156919ce16f761332f2361bec3a0d751.png
dbdbd1917e27d0c611d1878c2333ceff.png

4.2 IDEA控制台输出结果

e801ce7629eb83a8f6f907921f2cd598.png

五、有趣的测试

5.1 用户数量小于商品数量,且等于最大并发数

将RedisSecKiller类中的USER_NUM从100改为5,因为此时N_THREADS仍然为5,最大并发数仍为5,即有5个用户同时在抢购10件商品。注意,只要最大并发数大于等于用户数量,就会造成所有用户同时抢购商品(高并发)的情况出现。

运行结果如下:

43d258d7bc86ef451d9581b44e65ccd7.png

5.2 用户数量小于商品数量,且大于最大并发数

将N_THREADS从5改为3,此时有5名顾客抢购10件商品,但最多只有三名顾客在同一时刻抢购。运行结果:

935928928dd8d7497543823dd39a20ad.png

5.3 总结

(1)欢迎关注+私信【架构资料】,进我的私人群讨论技术和学习!

(2)由5.1和5.2对比可知,当用户数量小于商品数量时,并发访问量越大,用户秒杀到商品的成功率就会越低,因为并发量越大,可以进行的秒杀轮数就会越少,能抢购到商品的用户也就越少。

(3)5.1和5.2中的假设其实是不合理的,如果用户数量小于商品数量,供大于求,那也就不应该存在高并发秒杀的概念了,即使此时强行制造秒杀这个概念,但因为库存充足,所以也应该让所有用户都抢购到商品,只是抢到的先后顺序不同而已。

一个真实的网上商城的秒杀活动应该存在如下关系:用户数量(在线)>> 商品数量 > 用户并发数,举例:

由1W台手机等待秒杀,在线等待秒杀活动开始的用户数量为10W,用户并发量为3k。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP