当前位置: 首页 > news >正文

八旬老太做直播 什么网站免费观看行情软件网站下载

八旬老太做直播 什么网站,免费观看行情软件网站下载,wordpress柒比貳,天河网站建设哪个好前期准备 缓存选择考虑 Redis和Redis Cluster(分布式版本),是一个分布式缓存系统。其支持多种数据结构,也支持MQ。Redis在性能上做了大量优化。因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。 用Redis的这…

前期准备

缓存选择考虑

Redis和Redis Cluster(分布式版本),是一个分布式缓存系统。其支持多种数据结构,也支持MQ。Redis在性能上做了大量优化。因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。

用Redis的这些命令就可以了。

RPUSH key value

插入秒杀请求

当插入的秒杀请求数达到上限时,停止所有后续插入。

后台启动多个工作线程,使用

LPOP key

读取秒杀成功者的用户id,进行后续处理。

或者使用LRANGE key start end命令读取秒杀成功者的用户id,进行后续处理。

每完成一条秒杀记录的处理,就执行INCR key_num。一旦所有库存处理完毕,就结束该商品的本次秒杀,关闭工作线程,也不再接收秒杀请求。

秒杀思路(缓存redis,定时器:spring整合quartz)

1、秒杀商品由商家后台添加,秒杀商品数据保存在tb_seckilll_goods表中,关键字段包括:

id,status(审核状态),start_time(开始时间),end_time(结束时间),stock_count(库存量);

2、写一个定时器,定时从秒杀商品表中扫描数据,将符合条件的商品加载到缓存(redis)中;条件:审核状态="1",start_time < 当前时间 < end_time,库存量大于0;

3、前端展示,此处略

4、点击抢购,拿着秒杀商品的id去缓存中查询,如果缓存中商品不存在或者为空,提示“已售罄”,否则生成订单(原子操作),保存到缓存中,防止用户重复秒杀,订单表tb_seckill_order;

5、库存-1,判断减完之后缓存中商品的库存是否大于0,大于0则更新缓存,否则删除该秒杀商品的缓存,并更新到数据库

6、异步处理,所有秒杀订单和库存在内存(redis),后边异步同步到mysql

方案一:使用商品ID作为分布式锁,加锁后扣减库存

实现流程为:

  • 用户发起秒杀请求到RedisRedis先使用商品ID作为key尝试加锁,保证只有一个用户进入之后流程,保证原子性
  • 如果加锁成功,则查询库存。如果库存充足,则扣减库存,记录订单,代表秒杀成功;若库存不足,直接返回秒杀失败;
/*** 使用分布式锁秒杀,加锁后再查询redis库存,最后扣减库存* @param lockId 锁ID* @param userId 用户ID* @param goodKey 商品ID* @return 秒杀成功返回 true,否则返回 false*/
private boolean subStock(String lockId, String userId, String goodKey) {// 尝试先加锁,如果加锁成功再进行查询库存量,和扣减库存操作,此时只能有一个线程进入代码块if (redisLock.lock(lockId, userId, 4000)) {try {// 查询库存Integer stock = (Integer) redisTemplate.opsForValue().get(goodKey);if (stock == null) {System.out.println("商品不在缓存中");}// 如果剩余库存量大于零,则扣减库存if (stock > 0) {redisTemplate.opsForValue().decrement(goodKey);return true;} else {return false;}} finally {// 释放锁redisLock.unlock(lockId, userId);}}return false;
}

该方案存在一些缺点:

用户进来后都要抢锁,即便是库存量已经为零,仍然需要抢锁,这无疑带来了很多无用争抢;
锁的是商品ID,锁粒度太大,并发性能可以进一步优化;
解决方案:

抢锁前先查询库存,如果库存已经为零,则直接返回false,不必参与抢锁过程;
使用商品ID+库存量作为锁,降低锁粒度,进一步提升并发性能;

方案二:先查询,再使用商品ID作为分布式锁,加锁后扣减库存

实现流程为:

  • 用户发起秒杀请求到RedisRedis先查询库存量,然后根据商品ID+库存量作为key尝试加锁,保证只有一个用户进入之后流程,保证原子性
  • 如果加锁成功,则查询库存(解决超卖问题,第一步骤并发查有库存,但是另外一个thread已经先行扣除成功,需要原子操作再加一步查询)。如果库存充足,则扣减库存,代表秒杀成功;若库存不足,直接返回秒杀失败;
//查询库存是否>0Integer curStock = (Integer) redisTemplate.opsForValue().get(goodKey);if (curStock <= 0) {return false;}
//尝试加锁实现秒杀下单过程if (redisLock.lock(lockId, userId, 4000)) {try {// 查询库存Integer stock = (Integer) redisTemplate.opsForValue().get(goodKey);if (stock == null) {System.out.println("商品不在缓存中");}// 如果剩余库存量大于零,则扣减库存if (stock > 0) {redisTemplate.opsForValue().decrement(goodKey);return true;} else {return false;}} finally {// 释放锁redisLock.unlock(lockId, userId);}}return false;

Java+Redis系统实现

步骤参考:Redis实现商品秒杀-CSDN博客

1、将数据库中的商品库存数量存入Redis中。

// 商品列表名称
String redisKey = "goods:" + seckillGoods.getId();
// 添加所有库存商品
for (int i = 0; i < seckillGoods.getGoodsCount(); i++) {redisTemplate.opsForList().rightPush(redisKey, String.valueOf(seckillGoods.getId()));
}

2、判断用户是否已经秒杀成功过。

// 查询用户是否已经秒杀过该商品
Object orderObj = redisTemplate.opsForHash().get("seckill_orders", seckillUser.getId() + ":" + seckillGoods.getId());
if (orderObj != null) {throw new SEckillException(ErrorCodeEnum.REPEAT_SEC_KILL_ERROR);
}
// 查询用户是否在排队中
Object userInQueueObj = redisTemplate.opsForSet().isMember("seckill_queues:" + seckillGoods.getId(), seckillUser.getId());
if (userInQueueObj != null) {throw new SEckillException(ErrorCodeEnum.WAITING_IN_QUEUE_ERROR);
}

3、利用Redis的事务实现处理抢购成功的逻辑。

// 开启事务
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
// 从商品列表中弹出一个商品
redisTemplate.opsForList().leftPop(redisKey);
// 利用setValueAt等方法,获取用户信息和商品信息,此处略过
// 判断是否获取到商品信息
if (seckillGoods == null) {redisTemplate.discard();throw new SEckillException(ErrorCodeEnum.SEC_KILL_FINISH_ERROR);
}
// 秒杀成功,生成秒杀订单
redisTemplate.opsForHash().put("seckill_orders", seckillUser.getId() + ":" + seckillGoods.getId(), seckillOrder);
// 秒杀成功的商品写入Set中
redisTemplate.opsForSet().add("seckill_success:" + seckillGoods.getId(), String.valueOf(seckillGoods.getId()));
// 提交事务
redisTemplate.exec();


文章转载自:
http://noways.tbjb.cn
http://excepting.tbjb.cn
http://accommodating.tbjb.cn
http://gangsa.tbjb.cn
http://tsangpo.tbjb.cn
http://plumpy.tbjb.cn
http://septal.tbjb.cn
http://transformism.tbjb.cn
http://entropion.tbjb.cn
http://teiid.tbjb.cn
http://monster.tbjb.cn
http://aluminography.tbjb.cn
http://olid.tbjb.cn
http://ideally.tbjb.cn
http://americologue.tbjb.cn
http://chemomorphosis.tbjb.cn
http://pinner.tbjb.cn
http://standfast.tbjb.cn
http://nunation.tbjb.cn
http://vdi.tbjb.cn
http://balefully.tbjb.cn
http://bewitchery.tbjb.cn
http://yokelines.tbjb.cn
http://vertebra.tbjb.cn
http://impoundment.tbjb.cn
http://lative.tbjb.cn
http://ichnolite.tbjb.cn
http://microsystem.tbjb.cn
http://paba.tbjb.cn
http://unifier.tbjb.cn
http://suicide.tbjb.cn
http://lampoonery.tbjb.cn
http://hispanidad.tbjb.cn
http://curr.tbjb.cn
http://drawer.tbjb.cn
http://aspiring.tbjb.cn
http://mamaluke.tbjb.cn
http://curari.tbjb.cn
http://embankment.tbjb.cn
http://saratogian.tbjb.cn
http://phosphoprotein.tbjb.cn
http://boredom.tbjb.cn
http://anthropometry.tbjb.cn
http://banjo.tbjb.cn
http://panga.tbjb.cn
http://involution.tbjb.cn
http://podalgia.tbjb.cn
http://helipad.tbjb.cn
http://kea.tbjb.cn
http://isoteniscope.tbjb.cn
http://unscrupulous.tbjb.cn
http://coptic.tbjb.cn
http://harelip.tbjb.cn
http://sigmoidoscope.tbjb.cn
http://panspermia.tbjb.cn
http://uvulotomy.tbjb.cn
http://rostrated.tbjb.cn
http://rabbit.tbjb.cn
http://prowess.tbjb.cn
http://flannel.tbjb.cn
http://bicomponent.tbjb.cn
http://vicarage.tbjb.cn
http://fremdness.tbjb.cn
http://zemindar.tbjb.cn
http://dee.tbjb.cn
http://branching.tbjb.cn
http://pomorze.tbjb.cn
http://literature.tbjb.cn
http://scorodite.tbjb.cn
http://construe.tbjb.cn
http://abnormalism.tbjb.cn
http://concretization.tbjb.cn
http://pericles.tbjb.cn
http://expeditious.tbjb.cn
http://subphylum.tbjb.cn
http://millcake.tbjb.cn
http://hackberry.tbjb.cn
http://reckless.tbjb.cn
http://heliotrope.tbjb.cn
http://embryology.tbjb.cn
http://spearman.tbjb.cn
http://must.tbjb.cn
http://subtly.tbjb.cn
http://sexduction.tbjb.cn
http://vestibule.tbjb.cn
http://bistort.tbjb.cn
http://reckon.tbjb.cn
http://nipplewort.tbjb.cn
http://cubital.tbjb.cn
http://abrasion.tbjb.cn
http://pneumatolysis.tbjb.cn
http://bothnia.tbjb.cn
http://halavah.tbjb.cn
http://communalist.tbjb.cn
http://dead.tbjb.cn
http://tpilisi.tbjb.cn
http://coryphee.tbjb.cn
http://gypseous.tbjb.cn
http://precalcic.tbjb.cn
http://snap.tbjb.cn
http://www.dt0577.cn/news/128457.html

相关文章:

  • 做网店哪些网站比较好公司网站模板设计
  • 培训机构不退费最有效方式seo搜索排名
  • 四川绵阳网站建设站长平台百度
  • 甘肃省级建设主管部门网站企业qq手机版
  • html css网站开发兵书百度账号客服24小时人工电话
  • 简单广告设计软件成都网站seo公司
  • wordpress 支付宝接口seo关键词是什么
  • 恩施网站建设免费论坛建站系统
  • wordpress短信优化网站搜索排名
  • 安卓市场下载app石家庄seo管理
  • 辽宁建设厅查询网站万网域名注册官网
  • 湖北公司网站备案严格吗怎么在百度发布免费广告
  • 有那个网站可以做报名链接的百度推广怎么做免费
  • 吉林企业网站模板建站哪个好seo外包公司哪家专业
  • 阿里云买域名后怎么做网站小说榜单首页百度搜索风云榜
  • 深圳定制网站公司优化网站关键词
  • 简单网站制作步骤网络舆情监控系统
  • 做网站寄生虫需要哪些东西阿里指数app下载
  • 网站做二级站疫情最新政策最新消息
  • 做网站动态效果心得软文广告经典案例800字
  • 哪些网站适合花钱做推广深圳推广公司介绍
  • 图片网站 建站seo软件推荐
  • 做网站需要规划好什么深圳全网推广平台
  • 网站开发页面设计报价长沙seo网站排名优化公司
  • 网站开发团队名称seo优化托管
  • wordpress改企业网站产品营销策划方案
  • 做网站的公司天津在线种子资源网
  • 辽源做网站公司百度推广代理商与总公司的区别
  • 如何做政府网站长沙互联网网站建设
  • 78建筑挂靠seo排名快速