【Redis应用案例】

Redis秒杀,活动限流

import redis.clients.jedis.Jedis;

public class ShopActivityLimiter {

    private static final String REDIS_HOST = "localhost";
    private static final int REDIS_PORT = 6379;

    private Jedis jedis;

    public ShopActivityLimiter() {
        jedis = new Jedis(REDIS_HOST, REDIS_PORT);
    }

    public boolean isAllowed(String activityId, int limit) {
        String key = "activity:" + activityId;
        long count = jedis.incr(key);
        jedis.expire(key, 60); // Set the expiration time to 60 seconds
        
        if (count > limit) {
            return false;
        }
        
        return true;
    }

    public static void main(String[] args) {
        ShopActivityLimiter limiter = new ShopActivityLimiter();
        String activityId = "123";
        int limit = 100;

        for (int i = 0; i < 110; i++) {
            System.out.println("User " + i + ": " + limiter.isAllowed(activityId, limit));
        }
    }
}

这个代码使用了Redis进行商场活动的限流。当有用户请求时,会使用incr命令对活动的计数器进行自增操作,并设置计数器的过期时间为60秒。如果计数器的值超过了限制的数量,就返回false表示不允许参加活动,否则返回true表示允许参加活动。

main方法中,我们模拟了110个用户请求参加活动,限制数量为100。你可以根据实际情况修改activityIdlimit的值进行测试。

Redis秒杀,不超卖

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.exceptions.JedisException;

public class Seckill {
    
    
    
    private static final String REDIS_HOST = "localhost";
    private static final int REDIS_PORT = 6379;
    
    private Jedis jedis;
    
    public Seckill() {
    
    
        jedis = new Jedis(REDIS_HOST, REDIS_PORT);
    }
    
    public boolean seckill(String userId, String productId) {
    
    
        String productKey = "product:" + productId;
        String userKey = "user:" + userId;
        
        try {
    
    
            jedis.watch(productKey);
            int stock = Integer.parseInt(jedis.get(productKey));
            
            if (stock > 0) {
    
    
                Transaction transaction = jedis.multi();
                transaction.decr(productKey);
                transaction.sadd(userKey, productId);
                transaction.exec();
                return true;
            }
            
        } catch (JedisException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            jedis.unwatch();
        }
        
        return false;
    }
    
    public static void main(String[] args) {
    
    
        Seckill seckill = new Seckill();
        String userId = "1001";
        String productId = "p001";
        
        System.out.println("Seckill result: " + seckill.seckill(userId, productId));
    }
}

这个代码使用了Redis来实现一个简单的秒杀功能,保证不会出现超卖的情况。

seckill方法中,我们首先使用watch命令监视商品的库存。然后获取商品库存的数量,并判断是否大于0。如果大于0,就开始执行一个事务。事务中先将商品库存减1,再将购买用户添加到用户集合中。最后执行事务,如果在执行事务过程中,商品库存发生了变化,那么watch命令会捕捉到,事务会被取消。最终返回true表示秒杀成功,返回false表示秒杀失败。

main方法中,我们模拟了一个用户使用用户ID为"1001"去秒杀商品ID为"p001"的商品。根据实际情况修改userIdproductId的值进行测试。

猜你喜欢

转载自blog.csdn.net/qq_31532979/article/details/143319075