java代码结合redis分布式锁实现秒杀功能
时间: 2023-08-28 12:06:21 浏览: 122
下面是一个简单的Java代码,结合Redis分布式锁实现秒杀功能:
```java
public class RedisLock {
private static final String LOCK_PREFIX = "redis_lock_";
private JedisPool jedisPool;
public RedisLock(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
/**
* 获取锁
* @param lockName 锁名称
* @param timeout 超时时间,单位为秒
* @return 是否获取到锁
*/
public boolean lock(String lockName, int timeout) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String lockKey = LOCK_PREFIX + lockName;
long start = System.currentTimeMillis();
while (true) {
String result = jedis.set(lockKey, "locked", "NX", "EX", timeout);
if ("OK".equals(result)) {
return true;
}
long end = System.currentTimeMillis();
if ((end - start) > (timeout * 1000 - 100)) {
return false;
}
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
return false;
}
/**
* 释放锁
* @param lockName 锁名称
* @return 是否释放成功
*/
public boolean release(String lockName) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String lockKey = LOCK_PREFIX + lockName;
jedis.del(lockKey);
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
return false;
}
}
```
接下来是使用Redis锁实现的秒杀功能的代码示例:
```java
public class SeckillService {
private RedisLock redisLock;
public SeckillService(RedisLock redisLock) {
this.redisLock = redisLock;
}
/**
* 秒杀商品
* @param productId 商品ID
* @param userId 用户ID
* @return 是否秒杀成功
*/
public boolean seckill(String productId, String userId) {
boolean lockResult = redisLock.lock(productId, 10); // 获取锁
if (!lockResult) {
return false; // 没有获取到锁,表示秒杀失败
}
try {
// TODO: 执行秒杀操作
return true; // 秒杀成功
} finally {
redisLock.release(productId); // 释放锁
}
}
}
```
在使用Redis分布式锁时,需要特别注意以下几点:
1. 锁的名称要尽可能唯一,以免与其他锁发生冲突。
2. 锁的超时时间应该设置得足够短,避免因为锁一直被占用而导致其他请求无法执行。
3. 在获取锁时,需要使用set命令的NX和EX选项,避免因为竞争而导致的死锁问题。
阅读全文