redis 分布式锁 获取redis的key

今天翻看去年写的代码,发现了有一块用redis写了分布式锁,业务场景就是,再搭建第一版爬虫的时候,用来 定时任务来获取redis里的key值,保证同一时间只有一台机器拿到这个key,用到这样的办法来做,可以后来发现,机器多的话,反而花费时间在争抢锁上,毫无意义,也就放弃了这版爬虫框架。

下面是代码,自己可以拿去试试,调调,因为用的时间短,可能会有bug。

/**

* 获取redis对应的爬虫key的锁

* @param lockKey

* @return

*/

public boolean obtainLock(String lockKey) {

// 1. 通过SETNX试图获取一个lock

boolean obtainLockSuccess = false;

boolean lock = false;

//默认为当前时间加6000毫秒,一分钟,根据需求更改

long value  = System.currentTimeMillis() + 6000 + 1;

//分布式锁开始

lock = setNX(lockKey, String.valueOf(value));

if (lock) {//如果等于true,说明setNX成功,不懂的话可以自己登陆redis客户端试一试setnx命令

obtainLockSuccess = true;

}else {

long oldValue = Long.valueOf(getLock(lockKey));

//超时

if (oldValue < System.currentTimeMillis()) {

String getValue = getSet(lockKey, String.valueOf(value));

// 获取锁成功,什么意思?是因为需要判断最开始设值进去的value和getset得道的value是否是一样的,不一样啊,说明这期间

//有人getset了,你得到的是别得值,说明获取这个锁失败,就是并发的有人比你快一步,自己这块需要拿笔在本上写一写。

if (Long.valueOf(getValue) == oldValue) {

obtainLockSuccess = true;

}else { //获取锁失败

obtainLockSuccess = false;

}

}else { //未超时,则直接返回失败,现在还要人用到这个key的锁

obtainLockSuccess = false;

}

}

return obtainLockSuccess;

}

/**

* 释放锁,也就是删除锁

* @param lockKey

*/

public void releaseLock(String lockKey) {

long current = System.currentTimeMillis();

// 避免删除非自己获取得到的锁

if (current < Long.valueOf(valueOperations.get(lockKey)))

redisTemplate.delete(lockKey);

}

/**

* 获取这个Key的value,把这个value当入key,再放入redis队列里,String类型

* @param key

* @param value

* @return

*/

public boolean setNX(String key, String value) {

return valueOperations.setIfAbsent(key, value);

}

/**

* 获取setNx放入里的Key

* @param key

* @return

*/

public String getLock(String key) {

return valueOperations.get(key);

}

/**

* 这个getSet是redis的特性,这个是先设置新的值覆盖,返回给原来老的值

* @param key

* @param value

* @return

*/

public String getSet(String key, String value) {

return valueOperations.getAndSet(key, value);

}

时间: 2024-11-04 17:02:37

redis 分布式锁 获取redis的key的相关文章

SpringBoot集成Redis分布式锁以及Redis缓存

https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 <!-- 引入redis依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifa

【分布式锁】Redis实现可重入的分布式锁

一.前言 之前写的一篇文章<细说分布式锁>介绍了分布式锁的三种实现方式,但是Redis实现分布式锁关于Lua脚本实现.自定义分布式锁注解以及需要注意的问题都没描述.本文就是详细说明如何利用Redis实现重入的分布式锁. 二.方案 死锁问题 当一个客户端获取锁成功之后,假如它崩溃了导致它再也无法和 Redis 节点通信,那么它就会一直持有这个锁,导致其它客户端永远无法获得锁了,因此锁必须要有一个自动释放的时间.   我们需要保证setnx命令和expire命令以原子的方式执行,否则如果客户端执行

Redis专题(3):锁的基本概念到Redis分布式锁实现

拓展阅读:Redis闲谈(1):构建知识图谱 Redis专题(2):Redis数据结构底层探秘 近来,分布式的问题被广泛提及,比如分布式事务.分布式框架.ZooKeeper.SpringCloud等等.本文先回顾锁的概念,再介绍分布式锁,以及如何用Redis来实现分布式锁. 一.锁的基本了解 首先,回顾一下我们工作学习中的锁的概念. 为什么要先讲锁再讲分布式锁呢? 我们都清楚,锁的作用是要解决多线程对共享资源的访问而产生的线程安全问题,而在平时生活中用到锁的情况其实并不多,可能有些朋友对锁的概念

Redis - Redis分布式锁

Redis分布式锁 一丶什么是分布式锁 普通的锁,用于同一进程内不同线程在操作同一资源时,为解决冲突而加上的,使得多线程在操作统一资源时以单线程顺序执行. JVM的内存模型: 主内存保存变量值, 每个线程内也有自己的内存, 一般情况下, 线程会在本内存中操作数据后,在刷入主内存, 如果多个线程都同时在各自内存操作数据后, 在刷入主内存, 可能会导致结果不正确. 如 主内存中变量a=1, 线程t1和t2, 同时读取变量a后加1, 最后刷进主内存, 则主内存a可能为2, 正确的结果为3. 如果对操作

Redis分布式锁服务(转)

原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redi

Redis分布式锁服务(八)

阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redis有三个最基本属性来保证分布式锁的有效实现: 安全

Redis分布式锁实现

直接上代码: 1 package cn.wywk.yac.comm.redis; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import redis.clients.jedis.Jedis; 7 8 /** 9 * ClassName: redis分布式锁实现 <br/> 10 * date: 2017年2月17日 上午10:23:24 <br/> 11 * 12 * @author 134

redis分布式锁和消息队列

最近博主在看redis的时候发现了两种redis使用方式,与之前redis作为缓存不同,利用的是redis可设置key的有效时间和redis的BRPOP命令. 分布式锁 由于目前一些编程语言,如PHP等,不能在内存中使用锁,或者如Java这样的,需要一下更为简单的锁校验的时候,redis分布式锁的使用就足够满足了.redis的分布式锁其实就是基于setnx方法和redis对key可设置有效时间的功能来实现的.基本用法比较简单. public boolean tryLock(String lock

Redis分布式锁及分区

以下内容是翻译的官网文档RedLock和分区部分,可以简单了解分布式锁在redis如何实现及其方式 redis分区的方法 redis实现的分布式锁RedLock算法,分布式锁,即在多个master上获取同一个锁 1.in order to get the lock,the client get the current ms time 2.顺序对n个实例获取锁权限(n个都是master),尝试锁时,设置连接超时时间,防止由于实例挂了,导致长时间无法执行操作 3.计算为了获取锁消耗的时间,有且仅有,