关键词:
这是在一个方法调用下面代码的部分
if (!this.checkSoldCountByRedisDate(key, limitCount, buyCount, endDate)) // 标注10:
throw new ServiceException("您购买的商品【" + commodityTitle + "】,数量已达到活动限购量");
2、下面是判断超卖的方法
/** 根据缓存数据查询是否卖超 */
//标注:1;synchronized
private synchronized boolean checkSoldCountByRedisDate(String key, int limitCount, int buyCount, Date endDate)
boolean flag = false;
if (redisUtil.exists(key)) //标注:2;redisUtil.exists(key)
Integer soldCount = (int) redisUtil.get(key);//标注:3;redisUtil.get(key)
Integer totalSoldCount = soldCount + buyCount;
if (limitCount > (totalSoldCount))
flag = false;//标注:4;flag = false
else
if (redisUtil.tryLock(key, 80)) //标注:5;rdisUtil.tryLock(key, 80)
redisUtil.remove(key);// 解锁 //标注:6;redisUtil.remove(key)
redisUtil.set(key, totalSoldCount);//标注:7;redisUtil.set(key, totalSoldCount)
flag = true;
else
throw new ServiceException("活动太火爆啦,请稍后重试");
else
//标注:8;redisUtil.set(key, new String("buyCount"), DateUtil.diffDateTime(endDate, new Date()))
redisUtil.set(key, new String("buyCount"), DateUtil.diffDateTime(endDate, new Date()));
flag = false;
return flag;
3、上面提到的redisUtil类中的方法,其中redisTemplate为org.springframework.data.redis.core.RedisTemplate;这个不了解的可以去网上找下,spring-data-redis.jar的相关文档,贴出来redisUtil用到的相关方法:
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public boolean exists(final String key)
return redisTemplate.hasKey(key);
/**
* 将键值对设定一个指定的时间timeout.
*
* @param key
* @param timeout
* 键值对缓存的时间,单位是毫秒
* @return 设置成功返回true,否则返回false
*/
public boolean tryLock(String key, long timeout)
boolean isSuccess = redisTemplate.opsForValue().setIfAbsent(key, "");
if (isSuccess) //标注:9;redisTemplate.expire
redisTemplate.expire(key, timeout, TimeUnit.MILLISECONDS);
return isSuccess;
/**
* 读取缓存
*
* @param key
* @return
*/
public Object get(final String key)
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
/**
* 删除对应的value
*
* @param key
*/
public void remove(final String key)
if (exists(key))
redisTemplate.delete(key);
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value)
return set(key, value, null);
/**
*
* @Title: set
* @Description: 写入缓存带有效期
* @param key
* @param value
* @param expireTime
* @return boolean 返回类型
* @throws
*/
public boolean set(final String key, Object value, Long expireTime)
boolean result = false;
try
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
if (expireTime != null)
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
catch (Exception e)
e.printStackTrace();
return result;
redis解决秒杀微服务抢购代金券超卖和同一个用户多次抢购(代码片段)
...n问题解决之前的博客,我通过传统的数据库方式实现秒杀按照正常逻辑来走,通过压 查看详情
javaredis实现抢购秒杀
2018.10.24今天研究了下抢购秒杀的功能实现网上查了一大堆用redis的最多。主要是通过redis的watchmulti事务来控制秒杀数量不超卖。这里说下自己的感受:不超卖的话那就要一个个的来减库存这样的话效率上会有点问题这里上下代码... 查看详情
秒杀踩坑记:库存超卖(代码片段)
本案例发生在别人身上,觉得有学习借鉴的意义特转载过来记录一下。PM说有一个类似于抢购的小需求,我们第一反应就想到是典型的防止库存超卖场景,于是理所因当地选用了Redis方案。只要保证是原子操作,即可防止库存超... 查看详情
redis实现高并发下的抢购秒杀功能
博主最近在项目中遇到了抢购问题!现在分享下。抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1高并发对数据库产生的压力2竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经... 查看详情
成为架构师课程系列消息队列:秒杀时如何处理每秒上万次的下单请求?
目录消息队列:秒杀时如何处理每秒上万次的下单请求?#我所理解的消息队列#削去秒杀场景下的峰值写流量 查看详情
微服务架构的分布式事务问题如何处理?
分布式系统架构中,分布式事务问题是一个绕不过去的挑战。而微服务架构的流行,让分布式事问题日益突出!下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!如上图所... 查看详情
大型车祸现场,电商秒杀超卖,这个锅到底有谁来背?(代码片段)
背景小明在一家在线购物商城工作,最近来了一个新需求,需要他负责开发一个商品秒杀模块,而且需求很紧急,老板要求必须尽快上线。方案小明一开始是这么做的,直接用数据库锁进行控制,获取秒杀商品数量并加锁,如果... 查看详情
解决redis秒杀超卖的问题
我们再使用redis做秒杀程序的时候,解决超卖问题,是重中之重。以下是一个思路。 用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来则证明还有库存,且秒杀成功... 查看详情
电商的秒杀和抢购
转载自:【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数... 查看详情
秒杀系统防止库存超卖
第一种:通过数据库乐观锁实现(小型电商)updateproductstockssetrealstock=realstock-#buyswheresku=#skuandrealstock-#buys>=0根据受影响的行数判断是否执行成功大型互联网不是这么玩的数据库有瓶颈第二种:使用redis分布式锁实现varresource="the... 查看详情
您如何处理 SaaS 平台的 MySQL 连接?
】您如何处理SaaS平台的MySQL连接?【英文标题】:HowdoyouhandleMySQLconnectionsforaSaaSplatform?【发布时间】:2020-12-2000:52:44【问题描述】:几个月来我一直在构建一个SaaS平台,当我开始扩展时,我遇到了一笔巨额GCPCloudSQL账单,这让我... 查看详情
java示例代码_用Java解析JSON——如何处理不同的值
java示例代码_用Java解析JSON——如何处理不同的值 查看详情
redis基础知识之————如何处理客户端连接
redis连接建立 RedisRedis通过监听一个TCP端口或者Unixsocket的方式来接收来自客户端的连接,当一个连接建立后,Redis内部会进行以下一些操作:首先,客户端socket会被设置为非阻塞模式,因为Redis在网络事件处理上... 查看详情
web系统大规模并发——电商秒杀与抢购
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒... 查看详情
web系统大规模并发——电商秒杀与抢购
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒... 查看详情
redis轻松实现秒杀系统(代码片段)
...xff0c;实用技术文章及时了解什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商... 查看详情
redis轻松实现秒杀系统(代码片段)
...xff0c;实用技术文章及时了解什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商... 查看详情
mq——消息积压如何处理
一、消息积压的原因1、producer生产消息突然增多比如大促期间,抢购,秒杀业务。2、consumer消费性能突然下降比如消费失败时重试,程序死锁,io阻塞。3、消费系统本身出现瓶颈这种情况很少,对于绝大多数使用消息队列的业务... 查看详情