利用 Redis 队列操作的原子性实现秒杀

jokewinl 2019-03-26


1.添加一个队列模拟商品列表 启动redis 输入 rpush str 1 2 3 4 5 6 7 8 9 10

2.利用多线程模拟 20 个人抢购这 10 件商品:

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPoolConfig;  
  
/** 
 *  通过Redis队列的原子操作实现秒杀 
 */  
public class RedisSpike {  
  
    public static void main(String[] args) {  
        // redis的队列操作是原子操作  
        // eg: 20个人抢10个商品  
        // lpush productlist 1 2 3 4 5 6 7 8 9 10 商品ID号  
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();  
        jedisPoolConfig.setMaxIdle(10);  
        jedisPoolConfig.setMaxWaitMillis(10000);  
        jedisPoolConfig.setMaxTotal(1024);  
  
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);  
        //或者java代码lpush进去  
        //String str[]= {"1","2","3","4","5","6","7","8","9","10"};  
        //Jedis client = jedisPool.getResource();  
        //client.lpush("str",str );  
        ExecutorService executor = Executors.newFixedThreadPool(30);  
  
        for (int i = 0; i < 20; i++) {  
            executor.execute(new SpikeTask(i, jedisPool));  
        }  
  
        executor.shutdown();  
    }  
  
}  
  
class SpikeTask implements Runnable {  
  
    private int customerId;  
  
    private JedisPool jedisPool;  
  
    public SpikeTask (int customerId, JedisPool jedisPool) {  
        this.customerId = customerId;  
        this.jedisPool = jedisPool;  
    }  
  
    @Override  
    public void run() {  
  
        // 执行秒杀  
        Jedis client = jedisPool.getResource();  
  
        String productId = client.lpop("str");  
  
        if (productId != null && productId.length() != 0) {  
            System.out.println("顾客" + customerId + "抢到了" + productId + "号商品");  
        } else {  
            System.out.println("顾客" + customerId + "没有抢到商品");  
        }  
  
    }  
}

 
3.秒杀结果:


利用 Redis 队列操作的原子性实现秒杀
 



相关推荐

DiamondTao / 0评论 2020-08-30