redisson的使用及LUA脚本实现分布式秒杀
import org.redisson.Redisson;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonSecKill {
private RedissonClient redissonClient;
private RAtomicLong stockCount;
public RedissonSecKill() {
// 配置Redisson客户端
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
redissonClient = Redisson.create(config);
// 初始化库存计数器
stockCount = redissonClient.getAtomicLong("stockCount");
stockCount.set(10); // 假设只有10件商品
}
// 秒杀方法
public boolean secKill() {
// 使用LUA脚本保证操作的原子性
String luaScript = "if (redisson.call('GET', KEYS[1]) < ARGV[1]) then return redisson.call('DECR', KEYS[1]) else return 0 end";
// 执行LUA脚本
Object result = redissonClient.getScript()
.eval(RScript.Mode.READ_WRITE,
luaScript,
RType.INTEGER,
stockCount.getEntryName(),
new Long(1));
return (Boolean) (result != null && (Integer) result > 0);
}
public static void main(String[] args) {
RedissonSecKill secKill = new RedissonSecKill();
for (int i = 0; i < 100; i++) { // 模拟高并发下的秒杀
new Thread(() -> {
if (secKill.secKill()) {
System.out.println("秒杀成功!");
} else {
System.out.println("秒杀失败!");
}
}).start();
}
}
}
这段代码首先配置了Redisson客户端,并初始化了库存计数器。secKill
方法使用了LUA脚本来保证在高并发情况下的原子操作,减少了商品库存,并通过返回值判断秒杀是否成功。在main
方法中,我们模拟了高并发下的秒杀操作,并输出了相应的秒杀结果。
评论已关闭