redis实现分布式锁

前言

分布式锁一般有几种实现方式,redis分布式锁,ZooKeeper分布式锁,数据库乐观锁,本文将讲解redis分布式锁的使用

何为分布式锁

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。所以:
分布式锁具有互斥性,同一时间只能有一个客户端拥有这把锁

组件依赖


     redis.clients
    jedis

加锁

public boolean tryLock(String key,int timeOut){
        key = getPreKey(key);
        ShardedJedis conn = null;
        try {
            conn = redisXmlConfigure.getConnection();
           String result=conn.set(key, key+":lock", "NX", "EX", timeOut);
           return "OK".equals(result)?true:false;
        }catch(Exception e) {
            if(conn==null) {
                conn = redisXmlConfigure.getConnection();
            }
            conn.del(key);
            return false;
        } finally {
            redisXmlConfigure.closeConnection(conn);
        }
    }

我们在这里使用到了jedis.set(String key, String value, String nxxx, String expx, int time)方法
1,key则为主键key,需要保证唯一
2,value对应的值,我们也可以存入其他数据,例如这个锁的归属,然后判断是不是这个人在释放锁,可以根据需求灵活选择
3,这个值控制的当key存在还是不存在的时候进行操作,NX是不存在的时候进行操作,XX是存在的时候进行操作
4,这个控制过期时间类型,PX是毫秒,EX表示秒,与第五个参数呼应
5,设置过期时间,设置为10,第四个参数设置为PX则为10毫秒过期,第四个参数设置为EX则为10秒过期

解锁

/**
     * 释放锁
     * 严格意义上讲,这种写法有问题,未做释放锁的权限判断
     * @param key
     */
    public void  releaseLock(String key){
        key = getPreKey(key);
        ShardedJedis conn = null;
        try {
            conn = redisXmlConfigure.getConnection();
            conn.del(key);
        } finally {
            redisXmlConfigure.closeConnection(conn);
        }   
    }

业务操作完成主动释放锁

简单使用

if(cacheService.tryLock("test:key", 10)) {
    //处理业务逻辑
    //省略N行代码
    cacheService.releaseLock("test:key");
}

你可能感兴趣的:(redis实现分布式锁)