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;
    }
    

    }
    简单实现完成。

    化繁为简,极致高效。 所有代码为本人原创,转载请联系本人。
  • 相关阅读:
    热更新--动态加载framework
    封装framework注意点
    zip压缩和解压缩
    iOS 网络请求数据缓存
    tomcat服务器访问网址组成
    iOS--支付宝环境集成
    线程10--NSOperation的基本操作
    线程9--NSOperation
    线程8--GCD常见用法
    线程7--GCD的基本使用
  • 原文地址:https://www.cnblogs.com/crissblog/p/14862026.html
Copyright © 2011-2022 走看看