redis秒杀代码案例

用redis实现的秒杀代码案例

public class JedisInstance {
    public synchronized static Jedis getSingleJedis() {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("123456");
        return jedis;
    }
}

/**
 * @author xuleyan
 * @version Seckill.java, v 0.1 2020-03-22 6:25 PM xuleyan
 */
public class Seckill {
    // 库存key
    private static final String redisKey = "stock";

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Seckill seckill = new Seckill();
        seckill.doKill();
    }

    private void doKill() throws ExecutionException, InterruptedException {
    	// 线程池
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        Jedis jedis = new Jedis();
        try {
            jedis = JedisInstance.getSingleJedis();
            jedis.set(redisKey, "0");
            jedis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        Seckill seckill = new Seckill();
        for (int i = 0; i < 1000; i++) {
            executorService.execute(seckill::kill);
        }

        executorService.shutdown();
    }

    private String kill() {
        Jedis jedis1 = JedisInstance.getSingleJedis();
        try {
        	// 监控redisKey,如果在执行事务的期间有改动,则事务回滚
            jedis1.watch(redisKey);
            String redisValue = jedis1.get(redisKey);
            int valInteger = Integer.valueOf(redisValue);
            String userInfo = UUID.randomUUID().toString();

            String message = "";
            // 如果没有秒完
            if (valInteger < 20) {
            	// 开启事务
                Transaction tx = jedis1.multi();
                // 自增1
                tx.incr(redisKey);
                // 提交事务
                List list = tx.exec();
                if (list != null && list.size() > 0) {
                    message = "用户:" + userInfo + ", 秒杀成功!当前成功人数:" + (valInteger + 1);
                    System.out.println(message);
                } else {
                    // 版本变化,别别人抢了
                    message = "用户:" + userInfo + ", 秒杀失败!";
                    System.out.println(message);
                }
            } else {
                // 秒完了
                message = "已有20人秒杀成功,秒杀结束";
                System.out.println(message);
            }
            return message;
        } catch (Exception ex) {
            ex.printStackTrace();
            return "异常";
        }
    }
}

代码运行结果:

用户:f7e78f59-a9ec-4337-a4f2-b591ab4474b5, 秒杀失败!
用户:cb7a7770-4543-465a-ba40-a9926841dd4a, 秒杀失败!
用户:6359579e-71a9-48f6-926d-bb0225fd6dd8, 秒杀失败!
用户:2e5b5d60-1b62-48cd-9d60-bdef3e77b9b9, 秒杀失败!
用户:60281d39-b5bd-47f5-b101-b0b8b13a53be, 秒杀失败!
用户:40eae4d9-ecf6-451f-8e63-c11e99a7d837, 秒杀失败!
用户:6fae9daf-09c3-4e73-8968-130946459434, 秒杀失败!
用户:b11732eb-4f95-4996-af9d-921378c8c504, 秒杀失败!
用户:ecf95ce5-1b85-49d5-ac01-eddcbe1edcf8, 秒杀成功!当前成功人数:1
用户:a51be020-87fa-4ca6-a051-5172109e6171, 秒杀失败!
用户:3e14b9ff-3982-42e5-9089-b2627efef38b, 秒杀失败!
用户:5828bccc-11b3-4758-9657-24ca6cbafb99, 秒杀失败!
用户:06c8233a-9626-4082-b5a5-feec4bfdd2fa, 秒杀失败!
用户:df2070c1-acc8-4b77-b55f-2425b5e2943d, 秒杀失败!
用户:50459dca-212e-49cc-a325-179a09dfe6f9, 秒杀失败!
用户:db09ee20-c0b5-4737-bcec-e0e4b106ea65, 秒杀失败!
用户:c1bdddb0-c1f0-43a7-b6ec-d2c4528992f7, 秒杀失败!
用户:762b3c3b-7afc-49f7-9ea7-b652494d53a3, 秒杀失败!
用户:98b13e92-c699-43c7-9098-2e035815d2b4, 秒杀失败!
用户:1778f3e6-6c24-49d0-aa99-7e26527e3e37, 秒杀失败!
用户:97ea0ca5-90ac-4c5b-960d-b17e72a293e3, 秒杀成功!当前成功人数:2
用户:d2f7c0c7-1394-483f-be27-65d033e02664, 秒杀成功!当前成功人数:3
用户:d6fc200a-44f3-4129-90d6-51189f389b91, 秒杀成功!当前成功人数:4
用户:35a4c3e1-172a-4f49-8ad8-1f31a1e2bcf1, 秒杀成功!当前成功人数:5
用户:86b74976-be2e-4d74-9349-22e5c59be955, 秒杀成功!当前成功人数:6
用户:2d781304-c5c6-4dd1-9694-3dbc90dfe3d1, 秒杀成功!当前成功人数:7
用户:bd46339f-cf60-4d21-a90e-9bcdde113c31, 秒杀成功!当前成功人数:8
用户:eb4986fa-8291-489e-8736-8b97656ea771, 秒杀成功!当前成功人数:9
用户:96b32aa6-e3a9-4f17-956f-e8e06125a394, 秒杀成功!当前成功人数:10
用户:1534bfd3-b661-4cb1-946d-8667985afe22, 秒杀成功!当前成功人数:11
用户:215c9792-1e2d-4c0f-a3e3-5935a505c9f7, 秒杀成功!当前成功人数:12
用户:e7a21430-5384-4b32-896a-02433dfbcda7, 秒杀成功!当前成功人数:13
用户:b75bec91-9e5c-4e34-8683-346ca8ff3b15, 秒杀成功!当前成功人数:14
用户:4826adaf-ac51-44f7-b484-ef2760bbb675, 秒杀失败!
用户:694f8761-73f6-405e-9f00-1a9ae4920d3b, 秒杀成功!当前成功人数:15
用户:5145aa57-7386-4cdd-81f1-60459c32651b, 秒杀失败!
用户:158d850b-8fbd-45ce-a613-2011a174e340, 秒杀失败!
用户:95768081-f78b-4a62-8595-4e9029b11f0b, 秒杀失败!
用户:aecd3138-eb50-4f18-a4ed-c1103b2fb465, 秒杀失败!
用户:20488ec5-4d79-4f42-b918-c5e8cae5ab5e, 秒杀成功!当前成功人数:16
用户:d9111248-e2b9-4559-91c5-3b82ae792deb, 秒杀成功!当前成功人数:17
用户:ab1cea6c-9cb5-4a21-a225-b78beb731dd6, 秒杀成功!当前成功人数:18
用户:f2886c5a-f11d-4dc4-961f-03c5119b0140, 秒杀成功!当前成功人数:19
用户:e5fb5414-2325-45e6-bb93-14d33d4db34d, 秒杀成功!当前成功人数:20
已有20人秒杀成功,秒杀结束
已有20人秒杀成功,秒杀结束
已有20人秒杀成功,秒杀结束
已有20人秒杀成功,秒杀结束
发布了97 篇原创文章 · 获赞 59 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/b1303110335/article/details/105057259