使用Redis SETNX 命令实现分布式锁

使用Redis的 SETNX 命令能够实现分布式锁,下文介绍其实现方法。redis

1,实现StringRedisConnection的setNX和getSet接口json

public Boolean setNX(final String key, final String jsonString){
        Boolean result =  this.redisTemplate.execute(new RedisCallback<Boolean>(){

            @Override
            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection stringRedisConnection = (StringRedisConnection)connection;
                stringRedisConnection.select(3);
                Boolean result = stringRedisConnection.setNX(key, jsonString);
                return result;
            }
        });
        return result;
    }

    public String getSet(final String key, final String jsonString){
        String result =  this.redisTemplate.execute(new RedisCallback<String>(){

            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection stringRedisConnection = (StringRedisConnection)connection;
                stringRedisConnection.select(3);
                String result = stringRedisConnection.getSet(key, jsonString);
                return result;
            }
        });
        return result;
    }

 

2,实现例子分布式

private void acquireLock(String lock) {
        // 设置过时时间为1秒
                int expired = 1000;
                long value = System.currentTimeMillis() + expired + 1; 
                boolean result = redisClient.setNX(lock, String.valueOf(value));
                
                // true表明得到锁成功
                if(result) {
                    // TODO 实现具体业务逻辑
                } else {
                    // 不成功则判断是否死锁
                    Long oldValue  =  Long.valueOf(redisClient.gets(lock));
                    // 于当前时间比较,若是小于当前时间表明已超时
                    if(oldValue < System.currentTimeMillis()) {
                        // 设置并获取旧的值
                        String getValue = redisClient.getSet(lock, String.valueOf(value));
                        if(Long.valueOf(getValue) == oldValue) {
                            // 获取锁成功
                        } else {
                            // 已被其余进程获取锁
                        }
                    }
                    
                }
            }
相关文章
相关标签/搜索