zoukankan      html  css  js  c++  java
  • <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;
        }
    }
  • 相关阅读:
    连续两天写论文
    既然杂事比较多,索性统统处理一下
    Power symbol
    不要被一些无谓的事情烦扰
    今天提前回去吧,整理一下,为下周做好准备。
    天气暖和了,我却感冒了
    每天回想一下,今天到底完成了什么
    opensue12.1硬盘升级安装12.2问题解决
    IPmsg(飞鸽传书)协议翻译
    关于交叉验证和过拟合
  • 原文地址:https://www.cnblogs.com/mapleins/p/10168896.html
Copyright © 2011-2022 走看看