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

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

<Redis> 入门X 分布式锁的更多相关文章

  1. 基于redis实现的分布式锁

    基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...

  2. 一个Redis实现的分布式锁

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.conne ...

  3. 基于Redis的简单分布式锁的原理

    参考资料:https://redis.io/commands/setnx 加锁是为了解决多线程的资源共享问题.Java中,单机环境的锁可以用synchronized和Lock,其他语言也都应该有自己的 ...

  4. redis客户端、分布式锁及数据一致性

    Redis Java客户端有很多的开源产品比如Redission.Jedis.lettuce等. Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持:Redis ...

  5. Redis系列(二)--分布式锁、分布式ID简单实现及思路

    分布式锁: Redis可以实现分布式锁,只是讨论Redis的实现思路,而真的实现分布式锁,Zookeeper更加可靠 为什么使用分布式锁: 单机环境下只存在多线程,通过同步操作就可以实现对并发环境的安 ...

  6. 在redis上实现分布式锁

    /** *在redis上实现分布式锁 */ class RedisLock { private $redisString; private $lockedNames = []; public func ...

  7. 如何用redis正确实现分布式锁?

    先把结论抛出来:redis无法正确实现分布式锁!即使是redis单节点也不行!redis的所谓分布式锁无法用在对锁要求严格的场景下,比如:同一个时间点只能有一个客户端获取锁. 首先来看下单节点下一般r ...

  8. redis系列:分布式锁

    redis系列:分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  9. 一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

    #(1)redis分布式锁 官方叫做RedLock算法,是redis官方支持的分布式锁算法. 这个分布式锁有3个重要的考量点,互斥(只能有一个客户端获取锁),不能死锁,容错(大部分redis节点创建了 ...

随机推荐

  1. HTML标签防XSS攻击过滤模块--待优化

    HTML标签防XSS攻击过滤模块 http://cnodejs.org/topic/5058962f8ea56b5e7806b2a3

  2. Metasloit渗透测试魔鬼训练营

    总结一句话  漏洞  攻击   拿权限  维持访问 课程目标 掌握黑客渗透攻击流程 掌握常用攻击软件     渗透测试工程师 掌握常见windows漏洞挖掘和攻击 掌握常见linux漏洞挖掘和攻击 参 ...

  3. <hr />标签的颜色和粗细设定

    设置<hr />的颜色和粗细,不需要用到style,直接用标签的color和size属性: <hr color="red" size="0.5" ...

  4. C#后台调用Http外网接口(GET, POST)

    1.get方法调用接口获取json文件内容         public void GetFunction()        {            string serviceAddress =  ...

  5. jenkins构建maven项目

    使用jenkins构建部署maven项目 因为一开始我们是自定义插件,所以构建项目的时候没有显示maven风格的项目.如果要想使用maven,我们这里必须得安装一下插件,我们在插件管理器中, 可以看到 ...

  6. Linux环境下SolrCloud集群环境搭建关键步骤

    Linux环境下SolrCloud集群环境搭建关键步骤. 前提条件:已经完成ZooKeeper集群环境搭建. 一.下载介质 官网下载地址:http://www.apache.org/dyn/close ...

  7. 随机L系统分形树 分类: 计算机图形学 2014-06-01 23:27 376人阅读 评论(0) 收藏

    下面代码需要插入到MFC项目中运行,实现了计算机图形学中的L系统分形树. class Node { public: int x,y; double direction; Node(){} }; CSt ...

  8. 转-iOS开发系列--地图与定位

    来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功 ...

  9. 219 Contains Duplicate II 存在重复 II

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使 nums [i] = nums [j],并且 i 和 j 的绝对差值最大为 k. 详见:https://leetcod ...

  10. DEV—【GridControl主从表】

    先附上效果图,不是想要这个效果的朋友就不用可以继续寻找了. DEV—GridControl制作主从表: (注:此例没有用到数据库,只是单纯的在内存中操作数据.) 写这一笔,是为了能更好的理解主从表,的 ...