Skip to content
gqlxj1987's Blog
Go back

秒杀架构浅析

Edit page

原文链接

其实抛开秒杀这个场景来说正常的一个下单流程可以简单分为以下几步:

超卖现象

采用乐观锁的实现方式

<update id="updateByOptimistic" parameterType="com.crossoverJie.seconds.kill.pojo.Stock">
    update stock
    <set>
        sale = sale + 1,
        version = version + 1,
    </set>
    WHERE id = #{id,jdbcType=INTEGER}
    AND version = #{version,jdbcType=INTEGER}
</update>
CREATE TABLE `stock` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
  `count` int(11) NOT NULL COMMENT '库存',
  `sale` int(11) NOT NULL COMMENT '已售',
  `version` int(11) NOT NULL COMMENT '乐观锁,版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

version作为关键字来使用?

分布式限流的方式

//限流
boolean limit = redisLimit.limit();
if (!limit){
    res.setCode(StatusEnum.REQUEST_LIMIT.getCode());
    res.setMessage(StatusEnum.REQUEST_LIMIT.getMessage());
    return res ;
}
--lua 下标从 1 开始
-- 限流 key
local key = KEYS[1]
-- 限流大小
local limit = tonumber(ARGV[1])
-- 获取当前流量大小
local curentLimit = tonumber(redis.call('get', key) or "0")
if curentLimit + 1 > limit then
    -- 达到限流大小 返回
    return 0;
else
    -- 没有达到阈值 value + 1
    redis.call("INCRBY", key, 1)
    redis.call("EXPIRE", key, 2)
    return curentLimit + 1
end
public boolean limit() {
    String key = String.valueOf(System.currentTimeMillis() / 1000);
    Object result = null;
    if (jedis instanceof Jedis) {
        result = ((Jedis) this.jedis).eval(script, Collections.singletonList(key), Collections.singletonList(String.valueOf(limit)));
    } else if (jedis instanceof JedisCluster) {
        result = ((JedisCluster) this.jedis).eval(script, Collections.singletonList(key), Collections.singletonList(String.valueOf(limit)));
    } else {
        //throw new RuntimeException("instance is error") ;
        return false;
    }
    if (FAIL_CODE != (Long) result) {
        return true;
    } else {
        return false;
    }
}

乐观锁更新+分布式限流+redis缓存

更进一步,加上kafka异步队列

因为异步了,所以最终需要采取回调或者是其他提醒的方式提醒用户购买完成。

但好像代码里面没有采用回调的方式?

其实经过上面的一顿优化总结起来无非就是以下几点:


Edit page
Share this post on:

Previous Post
winter is coming
Next Post
Resteasy