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内部是单进程.单线程,是数据安全的(只有自己的线程在操作数 ...
随机推荐
- Centos7安装JDK8以及环境配置
下载,选择centos7 64位版本 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h ...
- try catch对Spring事务的影响
一.Spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚. 异常中unchecked异常包括error和runtime异常.需要try catch或向上 ...
- 雷林鹏分享:使用 XSLT 显示 XML
使用 XSLT 显示 XML 通过使用 XSLT,您可以把 XML 文档转换成 HTML 格式. 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言. XSLT(eXtensible ...
- WCF初见之SQL数据库的增删改查
1.首先要连接数据库,自然要有数据库啦,创建一个数据库表Login,并插入一个数据: --创建数据库表login CREATE TABLE Login ( UName VARCHAR(20) PRIM ...
- 内核开启VF小结
2017-8-29 16:33:40 内核开启VF小结: 1. eth2上创建4个VFecho 4 > /sys/class/net/eth2/device/sriov_numvfs2. 关闭e ...
- Confluence 6 编辑一个空间的配色方案
空间默认继承全局的配色方案.但是,如果你是空间管理员的话,你可以对默认继承的全局方案进行调整,使用自定义的配色方案. 为一个空间修改配色方案: 进入空间后,然后从边栏的底部选择 空间工具(Space ...
- apiCloud 版本号
应用版本号:this.appVersion = api.appVersion; 更新系版本的时候可用来比较
- confirm提示弹出确定和取消按钮
js----> var con = confirm('这是一个确定加取消的提示窗口') if(con==true){ document.write("点击了确定按钮") }e ...
- 31. Next Permutation (java 字典序生成下一个排列)
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- shiro会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...