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。你可以根据实际情况修改activityId
和limit
的值进行测试。
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"的商品。根据实际情况修改userId
和productId
的值进行测试。