本篇内容介绍了“redis实现秒杀的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
我们提供的服务有:做网站、成都网站建设、微信公众号开发、网站优化、网站认证、水城ssl等。为超过千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的水城网站制作公司

1、秒杀逻辑
秒杀:解决计数器和人员记录的事务操作
1.uid和proid非空判断
2.连接redis
3.拼接key
4.获取库存,如果库存为null,秒杀还没开始
5.判断用户是否重复秒杀操作
6.判断商品数量,库存数量小于1,秒杀结束
7.秒杀过程
2、存在问题
2.1、连接超时
原因:由于大量创建连接,十分消耗性能,并且有时获取连接不及时,出现连接超时的情况
2.2、超卖
在并发的情况下发生的,就是在输出没有库存(秒杀结束)后还有商品售出导致库存数量为负数。

2.3、库存遗留
使用乐观锁解决问题2之后,出现问题3
如果库存数量相对并发更多,由于使用乐观锁,第一个用户秒杀成功后会修改库存键的版本号,其他抢到的用户会因为版本号不同导致无法继续购买,就会有库存遗留问题
3、解决
3.1、连接超时
使用连接池,工具类如下:
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil() {
}
public static JedisPool getJedisPoolInstance() {
if (null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if (null == jedisPool) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(32);
poolConfig.setMaxWaitMillis(100 * 1000);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379, 60000);
}
}
}
return jedisPool;
}}//使用JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();Jedis jedis = jedisPoolInstance.getResource();
springBoot版本(pom.xml引入,application.yml配置,然后注入对象即可)
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
3.2.0
spring:
redis:
host: 127.0.0.1 port: 6379
database: 0
timeout: 1800000
lettuce:
pool:
max-active: 20
max-wait: -1
max-idle: 5
min-idle: 0
@Autowired
private RedisTemplate redisTemplate;
3.2、超卖问题
使用Redis事务,乐观锁 + watch
//监视库存
jedis.watch(kcKey);//中间代码忽略
//7 秒杀过程
//使用事务
Transaction multi = jedis.multi();//组队操作
multi.decr(kcKey);multi.sadd(userKey,uid);//执行
List