zoukankan      html  css  js  c++  java
  • 原创 抢购秒杀之redis高性能实现

    1redis-list实现

    @Slf4j
    @RestController
    public class ProductController {

    public static final String LUASCRIPT;
    static {
    	StringBuilder sb = new StringBuilder();
    	// 使用list实现
    	sb.append("local length = redis.call('LLEN', KEYS[1]);");
    	sb.append("
     ").append("if length < tonumber(ARGV[1]) then");
    	sb.append("
     ").append("redis.call('LPUSH', KEYS[1], ARGV[2])");
    	sb.append("
     ").append("return 1");
    	sb.append("
     ").append("else");
    	sb.append("
     ").append("return 2");
    	sb.append("
     ").append("end");
    	LUASCRIPT = sb.toString();
    }
    
    @Value("${server.port}")
    String port;    
    
    @Autowired
    ProductInfoMapper productInfoMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    
    @PostMapping("/snapUp")    
    public long snapUp(@RequestBody JSONObject json) {
    	System.err.println("snapUp---请求进入6");
    	// 1。判断是否已抢购
    	// 2.尝试减库存
    	// 3.保存抢购成功id
        List<String> keys = ImmutableList.of("tuanmembers1");
        RedisScript<Long> redisScript = new DefaultRedisScript<>(LUASCRIPT, Long.class);
        Long left = redisTemplate.execute(redisScript, keys, 100, json.getStr("userId"));
        log.info("抢购用户id{},结果{}", json.getStr("userId"), left);
        return left;
    }
    }
    

    2redis-set实现

    @Slf4j
    @RestController
    public class ProductController {

    public static final String LUASCRIPT;
    static {
    	StringBuilder sb = new StringBuilder();
    	sb.append("local has = redis.call('SISMEMBER', KEYS[1], ARGV[1]);");
        sb.append("
     ").append("if has == 1 then");
        sb.append("
     ").append("return 0");
        sb.append("
     ").append("else");
        sb.append("
     ").append("local left = redis.call('decr', KEYS[2])");
        sb.append("
     ").append("if left >= 0 then");
        sb.append("
     ").append("redis.call('SADD', KEYS[1], ARGV[1])");
        sb.append("
     ").append("return 1");
        sb.append("
     ").append("else");
        sb.append("
     ").append("return 2");
        sb.append("
     ").append("end");
        sb.append("
     ").append("end");
        LUASCRIPT = sb.toString();
    }
    
    @Value("${server.port}")
    String port;    
    
    @Autowired
    ProductInfoMapper productInfoMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    
    @PostMapping("/snapUp")    
    public long snapUp(@RequestBody JSONObject json) {
    	System.err.println("snapUp---请求进入7");
    	// 1。判断是否已抢购
    	// 2.尝试减库存
    	// 3.保存抢购成功id
    	List<String> keys = ImmutableList.of("buyedUsers", "products");
        RedisScript<Long> redisScript = new DefaultRedisScript<>(LUASCRIPT, Long.class);
        Long left = redisTemplate.execute(redisScript, keys, json.getStr("userId"));
        log.info("抢购用户id{},结果{}", json.getStr("userId"), left);
        return left;
    }
    

    }
    简单实现完成。

    化繁为简,极致高效。 所有代码为本人原创,转载请联系本人。
  • 相关阅读:
    Android源码学习之模板方法模式应用
    CSS3特性修改(自定义)浏览器默认滚动条
    【JQ+锚标记实现点击页面回到顶部】
    网页响应式媒体查询
    CSS3新特性,绘制常见图形
    【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动
    MySQL索引详解
    Eclipse快捷键大全(转载)
    深入Java集合学习系列:HashMap的实现原理
    HTML5 的Drawing Path
  • 原文地址:https://www.cnblogs.com/crissblog/p/14862026.html
Copyright © 2011-2022 走看看