1、引入Jedis依赖java
能够新建Spring或Maven工程,在pom文件中引入Jedis依赖:redis
<dependency>多线程
<groupId>redis.clients</groupId>架构
<artifactId>jedis</artifactId>并发
<version>2.9.0</version>高并发
</dependency>工具
2、Jedis工具类学习
JedisUtil.java测试
3、秒杀测试类(代码模拟多用户+高并发)线程
RedisSecKiller.java
注:关于多线程部分代码的说明
传统的方式是使用new Thread来建立、运行(start)线程,但那样过低效了;使用定长线程池 + ExecutorService的execute方法来建立、运行线程,比前者高效得多。
4、运行结果
4.1 Redis数据插入结果
进入RedisManager -> db0查看
4.2 IDEA控制台输出结果
5、有趣的测试
5.1 用户数量小于商品数量,且等于最大并发数
将RedisSecKiller类中的USER_NUM从100改成5,由于此时N_THREADS仍然为5,最大并发数仍为5,即有5个用户同时在抢购10件商品。注意,只要最大并发数大于等于用户数量,就会形成全部用户同时抢购商品(高并发)的状况出现。
运行结果以下:
5.2 用户数量小于商品数量,且大于最大并发数
将N_THREADS从5改成3,此时有5名顾客抢购10件商品,但最多只有三名顾客在同一时刻抢购。运行结果:
5.3 总结
(1)欢迎加入QQ群架构华山论剑:836442475【点击进入】(大牛汇集地)进个人私人群讨论技术和学习!
(2)由5.1和5.2对比可知,当用户数量小于商品数量时,并发访问量越大,用户秒杀到商品的成功率就会越低,由于并发量越大,能够进行的秒杀轮数就会越少,能抢购到商品的用户也就越少。
(3)5.1和5.2中的假设实际上是不合理的,若是用户数量小于商品数量,供大于求,那也就不该该存在高并发秒杀的概念了,即便此时强行制造秒杀这个概念,但由于库存充足,因此也应该让全部用户都抢购到商品,只是抢到的前后顺序不一样而已。
一个真实的网上商城的秒杀活动应该存在以下关系:用户数量(在线)>> 商品数量 > 用户并发数,举例:
由1W台手机等待秒杀,在线等待秒杀活动开始的用户数量为10W,用户并发量为3k。