通过Redis实现分布式锁
来源:互联网 发布:有了源码该如何使用 编辑:程序博客网 时间:2024/06/05 21:05
当多线程的情况,可用Redis来实现锁。
关于分布式锁的原理网上很多,我这里就只给出其中一种写法。
我这个项目时用Springboot配置的,关于redis的配置是在application.yml(或者application.properties)里进行配置
spring: redis: host: 192.168.119.103 port: 6379 password: 123456附上代码:
package com.redis.service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;/** * 分布式锁 * @author hongcj * @version V1.0 * @since 2017-08-24 11:02 */@Componentpublic class RedisLock { @Autowired private StringRedisTemplate redisTemplate; private static final Logger log = LoggerFactory.getLogger(RedisLock.class); /** * 加锁 * @param key * @param value 时间戳+过期时间 * @return */ public boolean lock(String key, String value){ if(redisTemplate.opsForValue().setIfAbsent(key,value)){ //此处运用了redis的SETNX命令特性 //将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写 //返回值如下:SETNX命令 1 如果key被设置了,0 如果key没有被设置 //redis中文网详细介绍地址 http://www.redis.cn/commands/setnx.html //如果redis返回1,说明可以设置,表示缓存里不存在该锁,加锁成功 return true; } //以下为预防死锁的情况,出现死锁的情况有很多,如IO异常,程序报错等导致解锁失败 //1.获取redis里的当前值 String currentValue = redisTemplate.opsForValue().get(key); //2.判断当前值是否已过期,过期情况进行下面操作 if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()){ //3.获取设置前的值,加锁 //这里是为了处理多线程并发时,key和value相同时,保证只有一个线程能获取到锁 //此处运用了redis的GETSET命令特性 //执行过程如下:自动将key对应到value并且返回原来key对应的value。 //redis中文网详细介绍地址 http://www.redis.cn/commands/getset.html String oldValue = redisTemplate.opsForValue().getAndSet(key,value); if(!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)){ return true; } } return false; } /** * 解锁 * @param key * @param value * @return */ public void unlock(String key,String value){ try{ String currentValue = redisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(currentValue) && value.equals(currentValue)){ redisTemplate.opsForValue().getOperations().delete(key); } }catch (Exception e){ log.error("Redis分布式锁解锁失败,{}",e); } }}
阅读全文
0 0
- 通过Redis实现分布式锁
- springboot通过redis实现分布式锁实现并调用
- 通过Redisson实现基于redis的分布式锁
- Scrapy通过redis实现分布式抓取
- Redis实现分布式锁
- Redis 分布式锁实现
- Redis 分布式锁实现
- Redis实现分布式锁
- redis实现分布式锁
- Redis实现分布式锁
- 分布式锁redis实现
- Redis 分布式锁实现
- redis分布式锁实现
- redis实现分布式锁
- Redis分布式锁实现
- redis分布式锁实现
- redis实现分布式锁
- Redis分布式锁实现
- alipay-node-sdk 封装,支付宝统一支付
- JNI实现源码分析【三 间接引用表】
- Spring Boot Logging Level设置为off时Bug
- echarts 自定义按钮控制数据的显示
- Problem B: 字符串的展开
- 通过Redis实现分布式锁
- mysql数据库设计规范
- LANMP On CentOS 6
- 使用Python脚本创建OVS交换机网路
- PS技巧
- 超微公司改造服务器设计以节省数据中心空间
- strlen函数编写
- glide加载图片变绿色
- 让IE支持CSS3选择器的方法(利用JS)