首先配置jedis包

redis.clients

jedis

3.0.1

直接上main方法代码,里面注释已经包含了说明 :

package com.xh.test;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.LinkedBlockingDeque;

import java.util.concurrent.Semaphore;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import redis.clients.jedis.Jedis;

public class Main {

static Boolean isEmpty = false;

public static void main(String[] args) {

int threadNumber = 500;

int goodsNumber = 50;

// TODO Auto-generated method stub

//线程池,无限缓存线程池

ExecutorService excutor = Executors.newCachedThreadPool();

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

if(!jedis.exists("goods")){

System.out.println("无商品数据,开始添加!");

//插入100个商品

for(int i = 0;imap = new HashMap<>();

long length = jedis.llen("goods");

System.out.println("商品剩余数量:"+length);

//模拟秒杀代码

CountDownLatch countDown = new CountDownLatch(threadNumber);

for (int i = 0; i < threadNumber; i++) {

final int index = i;

excutor.execute( () ->{

System.out.println("用户 "+index+" 开始秒杀商品!");

//如果已经被抢完则直接拒绝后面的请求了。

if(isEmpty){

System.out.println("用户"+index+" 抱歉商品已秒杀完毕!");

countDown.countDown();

return;

}

Jedis checkJedis = new Jedis("localhost");

String result = checkJedis.lpop("goods");

//如果成功删除redis里的数据则表示抢到,如果存储数字则还需要事务控制并修改商品数字,比较影响性能,因此使用list比较好。

if(result!=null&&!result.equals("")){

System.out.println("用户 "+ index+" 成功抢到!");

map.put(index+"", result);

}else{

//只允许一个线程修改状态

synchronized (isEmpty) {

isEmpty = true;

}

System.out.println("用户 "+index+" 很遗憾你没有抢到,商品已秒杀完。");

}

checkJedis.close();

//表示一个线程执行完毕了

countDown.countDown();

});

}

try {

//等待所有线程执行完毕

countDown.await();

System.out.println("所有用户秒杀完毕,开始公布结果:");

for (String key : map.keySet()) {

System.out.println("恭喜用户"+key+" 成功抢到!");

}

System.out.println("共"+map.size()+"位用户成功抢到。");

jedis.close();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("done");

}

}

小总结

1、结果来看还是无法模拟真正的高并发,秒杀成功的几乎都是前100个线程,后面启动的400个线程根本没有机会。。。

2、如果使用redis存储数字则还需要事务控制并修改商品数字,比较影响性能,因此使用list比较好。

3、一开始用的时候的低级错误: 每个线程都是直接用最开始new的那个jedis对象,这样做的后果就是一个连接发送大量操作请求,然后请求直接被redis的保护模式拒绝了。。

4、同一用户不能秒杀多个商品的代码未模拟

java redis高并发demo_java使用redis模拟高并发秒杀活动相关推荐

  1. Spring Boot集成Redis缓存之模拟高并发场景处理

    前言 同样我们以上一篇文章为例子,搭建好环境之后,我欧美可以模拟高并发场景下,我们的缓存效率怎么样,到底能不能解决我们实际项目中的缓存问题.也就是如何解决缓存穿透? Spring Boot集成Redi ...

  2. java redis使用卡死_jedispool连redis高并发卡死的问题

    java端在使用jedispool 连接redis的时候,在高并发的时候经常死锁,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...

  3. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  4. java并发令牌机制,redis令牌机制实现秒杀

    一.前言1. 秒杀介绍 秒杀是电商系统非常常见的功能模块,是商家进行相关促销推广的常用方式.主要特点是商品库存有限,抢购时间有限.那么在系统设计之初就应该考虑在数量和时间有限的情况下导致的一个高并发以 ...

  5. php redis 高并发队列,laravel+Redis简单实现队列通过压力测试的高并发处理

    这篇文章主要介绍了关于laravel+Redis简单实现队列通过压力测试的高并发处理 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 秒杀活动 在一般的网络商城中我们会经常接触到一些高 ...

  6. java redis计数器_Redis原子计数器incr,防止并发请求

    一.前言 在一些对高并发请求有限制的系统或者功能里,比如说秒杀活动,或者一些网站返回的当前用户过多,请稍后尝试.这些都是通过对同一时刻请求数量进行了限制,一般用作对后台系统的保护,防止系统因为过大的流 ...

  7. 阿里技术文档:Redis+Spring全家桶+Dubbo精选+高性能+高并发

    最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档.今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题 ...

  8. 当 高并发系统下 Redis 发生高延迟时,其内部到底发生了什么

    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解 ...

  9. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  10. B2C商城项目源码,基于Java开发的高可用分布式B2C商城系统,Java+Spring MVC+Dubbo+Zookeeper+MySQL+Redis+FastDFS+Nginx+Solr

    目录 前言 B2C商城-AIYOU 一.项目总体架构 二.系统软硬件设施总体规划 1.系统服务规划 2.应用服务规划 3.应用系统域名规划 三.系统运行环境构建 四.项目数据库创建 五.项目拉取 六. ...

最新文章

  1. 爬虫之requests模块在headers参数中携带cookie发送请求
  2. 引用wx.getclipboarddata中的内容_教材、图书在引用时要注意哪些方面
  3. SUN服务器清除所有报错信息,SUN服务器可能遇到的问题总结.doc
  4. Java 发起http GET POST请求实例
  5. 跨境电商ERP系统怎么使用?
  6. 论文理解(一)树形lstm
  7. keepalived做nginx的高可用,企业版简单介绍。
  8. 就国内而言,读大学的意义是什么?
  9. k8s运维-06-kubectl delete node的过程
  10. PHP语言弹窗图片,render函数生成图片弹窗的代码示例
  11. 客户价值度和活跃度建模
  12. ccf-20161203--权限查询
  13. mongo慢查询排查
  14. WordPress缩略图美化插件ThnBoV1.3.1ThnBo
  15. ANSI最全介绍linux终端字体改变颜色等
  16. 内网穿透是什么?哪些作用?
  17. ifconfig内容解析
  18. 手把手带你爬取猫眼电影,正则解析
  19. Linux环境搭建:CentOS7安装Oracle
  20. 自己动手写CPU(5)——移动指令说明

热门文章

  1. 给Silverlight三十分钟
  2. MySQL数据库学习2 - 数据库的操作
  3. 分库分表中间件sharding-jdbc的使用
  4. Ubuntu使用——9(搜狗输入法安装)
  5. JavaScript之jQuery
  6. POJ 1265 计算几何 多边形面积 内部格点数 边上格点数
  7. [Python]将Excel文件中的数据导入MySQL
  8. Emmet的高级功能与使用技巧
  9. 浅谈JavaScript函数重载
  10. 20200725每日一句