Redis 加锁和解锁的应用
上代码
应用调用示例
RedisLockEntity lockEntityYlb = RedisLockEntity.builder().lockKey(TradeConstants.HP_APP_AMOUNT_LOCK_PREFIX + appUser.getAccount()).value(orderId).build();boolean isLockedYlb = false;try {if (redisLock.tryLock(lockEntityYlb)) {业务逻辑}else {logger.info("给用户分ylb加锁失败,账户正在交易中");}}catch (Exception e){logger.info("给用户分ylb加锁失败,账户正在交易中");}finally {if (isLockedYlb) {try {redisLock.unlock(lockEntityYlb);} catch (LockException e) {logger.error(lockEntityYlb.toString());}}}
RedisLockEntity 实体类
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Getter
@Setter
@Builder
@ToString
public class RedisLockEntity {private String lockKey;private String value;
}
RedisLock 类
import java.util.concurrent.TimeUnit;import com.happypay.trade.exception.LockException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import lombok.extern.slf4j.Slf4j;@Service
@Slf4j
public class RedisLock {private static final Logger logger = LoggerFactory.getLogger(RedisLock.class);@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private static final int TRY_COUNT = 4;public boolean tryLock(RedisLockEntity redisLockEntity) throws LockException {boolean locked = false;int tryCount = TRY_COUNT;try {while (!locked && tryCount > 0) {locked = redisTemplate.opsForValue().setIfAbsent(redisLockEntity.getLockKey(),redisLockEntity.getValue(), 2, TimeUnit.MINUTES);tryCount--;try {Thread.sleep(300);} catch (InterruptedException e) {log.error("线程被中断" + Thread.currentThread().getId(), e);}}} catch (Exception e) {throw new LockException(e);}if (locked) {logger.info("获取操作锁成功:" + redisLockEntity.toString());}return locked;}public boolean unlock(RedisLockEntity redisLockEntity) throws LockException {boolean releaseLock = false;try {if (redisLockEntity == null || redisLockEntity.getLockKey() == null || redisLockEntity.getValue() == null)return false;releaseLock = false;String value = (String) redisTemplate.opsForValue().get(redisLockEntity.getLockKey());if (redisLockEntity.getValue().equals(value)) {releaseLock = redisTemplate.delete(redisLockEntity.getLockKey());}logger.info("释放操作锁成功:" + redisLockEntity.toString());} catch (Exception e) {logger.error("释放锁出错", e);throw new LockException(e);}return releaseLock;}}