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();
            }
        }
    }

 

posted @ 2022-11-22 10:20  跳之夭夭  阅读(133)  评论(0)    收藏  举报