首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Redis应用案例】

【Redis应用案例】

作者头像
贺公子之数据科学与艺术
发布2025-08-29 17:43:59
发布2025-08-29 17:43:59
16200
代码可运行
举报
运行总次数:0
代码可运行

Redis秒杀,活动限流

代码语言:javascript
代码运行次数:0
运行
复制
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秒杀,不超卖

代码语言:javascript
代码运行次数:0
运行
复制
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的值进行测试。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis秒杀,活动限流
  • Redis秒杀,不超卖
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档