`

Redis分布式锁实现实例

阅读更多
今天面试官问Redis分布式锁实现代码简单步骤,其中有一点面试官坚持说set操作和超时设置必须是2行代码,我当时懵了一下,我只能说这违反了“原子”操作,以下是我的实现示例代码:

上锁:
	@Override
	public boolean lock(String lockKey, String requestId, Long expireTime) {

		Assert.isTrue(StringUtils.isNotBlank(lockKey), "lockKey不能为空");
		Assert.isTrue(StringUtils.isNotBlank(requestId), "请求标识不能为空");

		Object result = stringRedisTemplate.execute(new RedisCallback<Boolean>() {

			@Override
			public Boolean doInRedis(RedisConnection connection) throws DataAccessException {

				Expiration expiration = Expiration.milliseconds(null == expireTime ? 1000L * 60 : expireTime);
				byte[] key = lockKey.getBytes(Charset.forName("UTF-8"));
				byte[] value = requestId.getBytes(Charset.forName("UTF-8"));

				return connection.set(key, value, expiration, SetOption.SET_IF_ABSENT);

			}
		});

		return (null == result) ? false : result.equals(true);

	}


释放锁:
	@Override
	public boolean unlock(String lockKey, String requestId) {

		Assert.isTrue(StringUtils.isNotBlank(lockKey), "lockKey不能为空");
		Assert.isTrue(StringUtils.isNotBlank(requestId), "请求标识不能为空");

		String lua = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

		Object result = stringRedisTemplate.execute(new RedisCallback<Boolean>() {

			@Override
			public Boolean doInRedis(RedisConnection connection) throws DataAccessException {

				byte[] script = lua.getBytes(Charset.forName("UTF-8"));
				byte[] key = lockKey.getBytes(Charset.forName("UTF-8"));
				byte[] value = requestId.getBytes(Charset.forName("UTF-8"));

				Long result = connection.eval(script, ReturnType.INTEGER, 1, key, value);
				return (null == result ? false : result.equals(1L));

			}
		});

		return (null == result) ? false : result.equals(true);

		/* 若redis是2.6.0以下版本,则不支持lua脚本,只能降级采用redisTemplate.delete解锁,但不能保证原子操作 */

	}


spring boot之Redis分布式锁示例代码
分享到:
评论

相关推荐

    Java基于redis实现分布式锁代码实例

    主要介绍了Java基于redis实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    redis分布式锁使用实例.rar

    利用redis实现的分布式锁的使用实例,代码注释详细,对有分布式锁业务需求有很好的参考作用 redis 分布式锁 redisson

    Redis分布式锁存在的问题及解决方案(值得珍藏)

    Redis分布式锁在实现跨进程、跨机器的互斥访问时,虽功能强大,但也存在一些常见问题。这些问题主要源于网络延迟、系统时钟误差以及Redis自身的特性。 一个典型问题是锁的"死锁"现象,即因进程意外终止或网络故障,...

    Redis Template实现分布式锁的实例代码

    虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁...

    使用redis分布式锁解决并发线程资源共享问题

    但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个实例有效,就需要用到分布式锁—-redis setnx 原理 修改某个资源时, 在redis中设置一个key,value根据实际情况自行决定如何表示 我们既然要通过...

    Python实现的redis分布式锁功能示例

    主要介绍了Python实现的redis分布式锁功能,结合实例形式分析了Python操作redis分布式锁与解锁功能相关操作技巧,需要的朋友可以参考下

    springboot redis分布式锁代码实例

    主要介绍了springboot redis分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Redis分布式锁使用+Redis处理数据并发+springboot整合Redis

    springboot整合Redis实现在分布式情况,使用分布式锁解决数据并发的方案,主要使用Redis提供的setIfAbsent方法实现,并且考虑到了setIfAbsent在极端情况下的多实例同时设置一个key成功的情况。 本案例通过实现对库存...

    SpringBoot 使用 Redis 分布式锁解决并发问题.docx

    但是服务的多副本运行随之也会引来一些分布式问题,比如某个接口的处理逻辑是这样的:接收到请求后,先查询 DB 看是否有相关的数据,如果没有则插入数据,如果有则更新数据。在这种场景下如果相同的 N 个请求并发发...

    Redis实现分布式锁的方法示例

    锁的本质就是互斥,保证任何时候能有一个客户端持有同一个锁,如果考虑使用redis来实现一个分布式锁,最简单的方案就是在实例里面创建一个键值,释放锁的时候,将键值删除。但是一个可靠完善的分布式锁需要考虑的...

    redis-distributed-lock:redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程, 为spring boot应用提供了starter,更方便快捷的调用

    原生redis分布式锁实现,支持注解,不推荐项目中使用,仅供学习使用 redis-distributed-lock-demo-spring redis-distributed-lock-core 调用实例,仅供学习 基于Redisson的分布式锁spring starter实现,可用于实际...

    scrapy-redis分布式爬虫实现案例

    只需将该项目放到不同的机器,简单配置一下redis /mysql 就可以运行,实现分布式抓取数据,需配置相同的环境scrapy/scrapy-redis/itemadapter/redis/mysql

    利用分布式共享锁实现防止方法重复调用

    利用分布式共享锁实现防止方法重复调用(防刷单及redis分布式锁的实现)

    基于Redis实现简单的分布式锁

    分布式锁实现的方案有很多,比如基于ZooKeeper实现、或者基于Mysql实现等等,我们来一起看看如何基于Redis实现分布式锁服务。  分布式锁要点  对于分布式锁的目标,我们必须首先明确三点:  1、任何一个时间点...

    浅析Redis分布式锁

    本篇文章通过实例给大家讲解了Redis分布式锁工作原理以及用法分享,有需要的朋友参考学习下吧。

    java7源码-distributed-lock:分布式锁

    今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现原理。 如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用...

    分布式服务API的幂等设计方案SpringBoot+Redis拦截器实现实例.docx

    分布式服务API的幂等设计方案SpringBoot+Redis拦截器实现实例.docx

    python如何使用Redis构建分布式锁

    这篇文章主要介绍了python如何使用Redis构建分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在实际应用场景中,我们可能有多个worker,可能在一台机器...

Global site tag (gtag.js) - Google Analytics