redis锁的实战代码
一、apollo配置如下
#哨兵模式配置redisson设置 #redisson.sentinel.enable = true redisson.sentinel.master = master-1 redisson.sentinel.nodes = 哨兵节点地址 redisson.sentinel.masterConnectionPoolSize = 250 redisson.sentinel.slaveConnectionPoolSize = 250 redisson.sentinel.password = #单机配置 redisson.single.enable = true redisson.single.host = 10.73.74.75:8084 redisson.single.connectionPoolSize = 64 redisson.single.connectionMinimumIdleSize = 0 redisson.single.password = ererere ##哨兵和单机公共配置 redisson.database = 10 redisson.timeout = 5000 redisson.wait.timeout = 3 redisson.lock.hold = 600
二、pom文件添加如下:
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.17.4</version> </dependency>
三、加锁具体实现
import org.redisson.api.RLock; import org.redisson.api.RReadWriteLock; import org.redisson.api.RedissonClient;
@Resource
private RedissonClient redissonClient;
//此处演示,在单据保存的时候给单据加锁,防止此单据被短时间内重复保存造成数据错误 public void doSave() { //定义是否已经加上了锁,默认还没有添加 boolean isLock = false; //这是数据的唯一标识,可以是比如正在操作的单据的id String id = "232333"; /** 这是自定义的操作类型,用来区分不同业务类的锁, 比如针对同一个单据,需要加保存和删除两个锁, 那可以在单据保存的时候加个锁,类型定义为save, 然后再在删除操作的时候加个锁,类型定义为delete, 这样对同一个单据,两个不同类型的锁就不会互相干扰*/ String opType = "save"; //id和opType共同组成锁的全局唯一标识lockId StringBuffer buffer = new StringBuffer(); buffer.append(opType).append("-"); buffer.append(id); String lockId = buffer.toString(); //获取带唯一标识的读写锁实例 RReadWriteLock rReadWriteLock = redissonClient.getReadWriteLock(lockId); RLock lock = rReadWriteLock.writeLock(); try { //加锁 isLock = lock.tryLock(5000,TimeUnit.SECONDS); if (!isLock) { log.info("加锁失败:" + lockId); } log.info("获得锁成功:" + lockId); //此处实现保存的业务逻辑 }catch (BizException e) { e.printStackTrace(); throw new BizException(e.getMessage()); }catch (Exception e) { e.printStackTrace(); throw new Exception("系统异常,请联系系统管理员处理"); } finally { //解锁 if(isLock) { lock.unlock(); } } }

浙公网安备 33010602011771号