Redis分布式锁实例
maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
代码实现
package com.zhi.demo; import java.util.Collections; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.params.SetParams; /**
* Redis分布式锁
*
* @date 2019年03月05日17:20:05
*
*/
public class RedisLock {
private static JedisPool jedisPool;
/**
* 加锁成功标示
*/
private static final String LOCK_SUCCESS = "OK";
/**
* 解锁成功标示
*/
private static final Long RELEASE_SUCCESS = 1L; static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(5);
config.setTestOnBorrow(false); jedisPool = new JedisPool(config, "192.168.153.137", 6379);
} /**
* 申请锁
*
* @param key 锁名
* @param requestId 请求ID,一般用UUID(用于记录谁申请的锁)
* @return 是否成功
*
*/
public static boolean lock(String key, String requestId) {
try (Jedis jedis = jedisPool.getResource();) {
SetParams params = new SetParams();
params.ex(100); // 设置超时时间
params.nx(); // 若锁不存在才进行写操作
String back = jedis.set(key, requestId, params);
return LOCK_SUCCESS.equals(back);
}
} /**
* 解锁,判断requestId的一致性和删除锁必须放在一个请求中,防止时间差引起错误
*
* @param jedis
* @param key 锁名
* @param requestId 请求ID
* @return 是否解锁成功
*
*/
public static boolean unlock(String key, String requestId) {
try (Jedis jedis = jedisPool.getResource();) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList(requestId));
return RELEASE_SUCCESS.equals(result);
}
} public static void main(String[] args) {
if (RedisLock.lock("redis", "1")) {
System.out.println("申请锁成功");
if (RedisLock.lock("redis", "2")) {
System.out.println("再次申请锁成功");
} else {
System.out.println("再次申请锁失败");
}
if (RedisLock.unlock("redis", "1")) {
System.out.println("解锁成功");
} else {
System.out.println("解锁失败");
}
} else {
System.out.println("申请锁失败");
}
jedisPool.close();
}
}
有兴趣的同学可以参考:https://www.cnblogs.com/linjiqin/p/8003838.html,这个讲解比较清楚。
Redis分布式锁实例的更多相关文章
- 单实例redis分布式锁的简单实现
redis分布式锁的基本功能包括, 同一刻只能有一个人占有锁, 当锁被其他人占用时, 获取者可以等待他人释放锁, 此外锁本身必须能超时自动释放. 直接上java代码, 如下: package com. ...
- Redis分布式锁
Redis分布式锁 分布式锁是许多环境中非常有用的原语,其中不同的进程必须以相互排斥的方式与共享资源一起运行. 有许多图书馆和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都 ...
- redis分布式锁实践
分布式锁在多实例部署,分布式系统中经常会使用到,这是因为基于jvm的锁无法满足多实例中锁的需求,本篇将讲下redis如何通过Lua脚本实现分布式锁,不同于网上的redission,完全是手动实现的 我 ...
- springMVC 实现redis分布式锁
1.先配置spring-data-redis 首先是依赖 <dependency> <groupId>org.springframework.data</groupId& ...
- Lua脚本在redis分布式锁场景的运用
目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...
- Redlock(redis分布式锁)原理分析
Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁: 使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击) ...
- Redlock:Redis分布式锁最牛逼的实现
普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx.后一种方式的核心实现命令如下: - 获取锁(unique ...
- Redis 分布式锁进化史(解读 + 缺陷分析)
Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...
- 白话Redis分布式锁
redis分布式 简单来说就是,操作redis实例时,不是常规(单机)操作一个实例,而是操作两台或多台,也就是基于分布式集群: 而且redis内部是单进程.单线程,是数据安全的(只有自己的线程在操作数 ...
随机推荐
- linux查看历史操作记录并且显示执行时间
vim ~/.bashrc 或者 ~/.bash_profile 增加:export HISTTIMEFORMAT="%F %T " 查看历史记录之前先执行: 然后使用hist ...
- C#双缓冲代码
private void Form1_Load(object sender, EventArgs e) { //在窗体加载的时候 解决窗体闪烁问题 //将图像绘制到缓冲区减少闪烁 this.SetSt ...
- JsonAutoDetect注解找不到错误
RedisConfig类代码: package com.neo.SpringBoot.config; import java.lang.reflect.Method; import org.sprin ...
- R 的内部机制
在前面的章节中,我们已经学习了 R 语言的基础功能,并且了解了如何运用向量.矩阵.列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题.但是仅仅了解这些功能并不能解决所有问题.现实中的数据分析 ...
- SqlParameter的两种用法【二】
private void Loadprovince() { string sql = "select * from Tables where ArealdPid=@pid"; /第 ...
- C#配置文件
今天为大家讲一下为什么有时候我们创建项目的时候没有自带的配置文件项目,如下: 图1没有自己的配置文件,图二有自己的配置文件. 其实很简单,那是因为很多时候我们创建项目的时候,默认就会创建.NET Fr ...
- Dreamweaver 1 网页制作
1.站点 1.1 创建站点 点击菜单栏中站点进行站点创建,输入站点名称,路径 1.2 设置图像文件夹 1.3 站点管理 站点的编辑.复制.删除 2.页面属性栏 2.1 外观 1.设置页面整体的字体.大 ...
- Interval 间隔问题
2018-09-07 09:03:14 一.Merge Intervals 问题描述: 问题求解: public List<Interval> merge(List<Interval ...
- WAMP环境配置
mysql 5.7.12 php 7.1 apache 24 windows 10 64bit 下载好代码后, 1.首先把更目录的sql.sql导入到数据库2.打开application\config ...
- Windows Live Wirter
安装: 下载: Windows Live Writer (QQ 里) windows live writer 日志服务器发生问题 更新账户信息 从字面"editPost"我们不难看 ...