<Redis> 入门X 分布式锁

分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题:

1.资源共享的竞争问题

2.数据的安全性

分布式锁的解决方案:

1.怎么去获取锁

  数据库

  zookeeper

  redis

2.怎么释放锁

package org.maple.lock;

import org.maple.redis.RedisManager;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.List;
import java.util.UUID;

/**
 * @author mapleins
 * @Date 2018-12-25 12:25
 * @Desc Redis实现分布式锁
 **/
public class RedisLock {

    public String getLock(String key, int timeout) {
        try {
            Jedis jedis = RedisManager.getJedis();
            String value = UUID.randomUUID().toString();
            long end = System.currentTimeMillis() + timeout;
            while (System.currentTimeMillis() < end) {
                if (jedis.setnx(key, value) == 1) {
                    jedis.expire(key,timeout);
                    //锁设置成功,redis操作成功
                    return value;
                }
                //如果在setnx,redis宕机,那么就不会设置过期时间,此处加一个判断,防止永不过期
                if(jedis.ttl(key)==-1){
                    jedis.expire(key,timeout);
                }
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public boolean releaseLock(String key, String value) {
        try {
            Jedis jedis = RedisManager.getJedis();
            while (true) {
                jedis.watch(key);
                if (value.equals(jedis.get(key))) { //确保当前获得锁的线程和redis中存的是同一把锁
                    Transaction transaction = jedis.multi();
                    transaction.del(key);
                    List<Object> list = transaction.exec();
                    if(list==null){
                        continue;
                    }
                    return true;
                }
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}
原文地址:https://www.cnblogs.com/mapleins/p/10168896.html