`

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分布式锁实现Redisson 15问.doc

    Redis分布式锁是指在分布式系统中,多个服务实例之间对同一个资源加锁的机制,以保证数据的一致性和安全性。Redisson是一个基于Redis的分布式锁实现,它提供了一个高效、可靠的加锁机制。在本文中,我们将深入探讨...

    redis分布式锁.zip

    Redis 的高可用性和低延迟特性使其成为实现分布式锁的理想选择。下面将详细介绍如何使用 Redis 实现分布式锁以及其中可能遇到的问题和解决方案。 首先,我们需要理解分布式锁的基本概念。分布式锁是一种在分布式...

    redis分布式锁使用实例.rar

    通过学习和实践这个“redis分布式锁使用实例”,你可以深入理解如何在实际项目中使用 Redis 和 Redisson 来实现高效且可靠的分布式锁,这对于处理分布式系统中的并发控制至关重要。同时,这也为你提供了设计和实现...

    redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程.zip

    Redis 分布式锁工具包是为了解决在分布式系统中实现锁的问题,它提供了一种纯Java的方式来调用,使得在传统的Spring工程中可以轻松集成和使用。在现代的高并发、分布式环境下,单机锁已经无法满足需求,因为它们不能...

    记录redisson实现redis分布式事务锁

    本篇文章将详细探讨如何使用Redisson实现Redis分布式事务锁,以及在Spring Boot环境中如何进行集成。 首先,Redis作为一个内存数据库,其高速读写性能使其成为实现分布式锁的理想选择。分布式锁的主要作用是在多...

    C++基于redis的分布式锁redisAPI

    本文将深入探讨如何使用C++结合Redis实现分布式锁,并详细讲解Redis API在C++中的应用,以及如何处理与Boost库的集成。 首先,Redis是一个高性能的键值存储数据库,广泛用于缓存、消息队列、分布式锁等场景。分布式...

    C#.net Redis分布式锁源码实现

    本篇文章将深入探讨如何在C#.NET环境下利用Redis实现分布式锁,以及相关的核心知识点。 首先,让我们理解什么是分布式锁。分布式锁是在分布式系统中,用于协调不同节点间对共享资源访问的一种工具。它确保在任何...

    用Redis实现分布式锁_redis_分布式_

    2. Redlock:由Redis作者Antirez提出的分布式锁算法,通过在多台Redis实例上实现锁来提高可用性和容错性。 综上所述,Redis是实现分布式锁的理想选择,其高效、原子性的特性使得在分布式系统中控制共享资源成为可能...

    zk:redis分布式锁.zip

    分布式锁是一种在分布式系统中实现锁机制的技术,用于在多节点之间协调访问共享资源,确保在高并发环境下数据的一致性和完整性。本压缩包“zk:redis分布式锁.zip”提供了基于Zookeeper(zk)和Redis两种分布式锁实现...

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

    Redis分布式锁是解决多节点集群部署中并发控制的重要工具,但在使用过程中,它存在一些问题,需要谨慎处理。本文将详细探讨这些问题及其解决方案。 首先,死锁问题是Redis分布式锁的一个常见挑战。当一个进程获取了...

    Redis分布式锁----乐观锁的实现,以秒杀系统为例.rar

    本文件“Redis分布式锁----乐观锁的实现,以秒杀系统为例”主要探讨了如何利用Redis实现乐观锁,并通过秒杀系统的实例进行详细阐述。 首先,我们需要理解什么是分布式锁。在分布式系统中,当多个节点同时访问同一...

    Redis 分布式锁使用

    本文将深入探讨如何在实际应用中使用Redis实现分布式锁,以及涉及的相关技术细节。 ### Redis 分布式锁的基本概念 分布式锁是一种在分布式系统中协调多个节点共享资源的机制。它确保在同一时刻,只有一个客户端...

    Tedu五阶段Redis分布式锁

    本文将详细介绍基于Redis实现的分布式锁——“Tedu五阶段Redis分布式锁”。 #### 二、Redis基本概念及应用场景 Redis是一种开源的、高性能的键值存储系统,提供了多种数据结构的支持,如字符串(String)、哈希...

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

    在SpringBoot应用中集成Redis分布式锁,可以创建一个`RedisLock`工具类,包含加锁和解锁的方法。加锁操作需要确保原子性,即同时设置键和过期时间,这在SpringBoot 2.x版本以上可以通过`opsForValue().setIfAbsent()...

    redis和zookeeper实现分布式锁的区别

    `SETNX`命令在键不存在时设置键值,但如果存在则返回失败,这可以用来简单地实现锁。然而,单实例的Redis分布式锁存在一定的风险,如主节点故障可能导致锁无法释放。 RedLock算法是Redis创始人Antirez提出的一种...

    springboot版本redis分布式锁.zip

    本案例主要探讨如何在SpringBoot项目中集成Redis实现分布式锁以及防止缓存穿透。 首先,我们要了解什么是分布式锁。分布式锁是一种在分布式系统中协调不同节点间对共享资源访问的机制。它确保在任何时刻只有一个...

    springboot redis分布式锁代码实例

    SpringBoot Redis分布式锁代码实例是指通过SpringBoot框架和Redis数据库来实现分布式锁的机制。分布式锁是指在分布式系统中,多个节点或进程需要访问共享资源时,为了避免冲突和竞争,使用锁机制来保护这些资源。...

    Redis分布式锁.zip

    **Redis分布式锁的原理** 分布式锁通常需要满足以下条件: 1. **互斥性**:在同一时刻,只能有一个客户端获取锁。 2. **可重入性**:持有锁的客户端可以再次获取该锁,防止死锁。 3. **自动续期**:防止锁过期导致...

Global site tag (gtag.js) - Google Analytics