今天面试官问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实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
利用redis实现的分布式锁的使用实例,代码注释详细,对有分布式锁业务需求有很好的参考作用 redis 分布式锁 redisson
Redis分布式锁在实现跨进程、跨机器的互斥访问时,虽功能强大,但也存在一些常见问题。这些问题主要源于网络延迟、系统时钟误差以及Redis自身的特性。 一个典型问题是锁的"死锁"现象,即因进程意外终止或网络故障,...
虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁...
但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个实例有效,就需要用到分布式锁—-redis setnx 原理 修改某个资源时, 在redis中设置一个key,value根据实际情况自行决定如何表示 我们既然要通过...
主要介绍了Python实现的redis分布式锁功能,结合实例形式分析了Python操作redis分布式锁与解锁功能相关操作技巧,需要的朋友可以参考下
主要介绍了springboot redis分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
springboot整合Redis实现在分布式情况,使用分布式锁解决数据并发的方案,主要使用Redis提供的setIfAbsent方法实现,并且考虑到了setIfAbsent在极端情况下的多实例同时设置一个key成功的情况。 本案例通过实现对库存...
但是服务的多副本运行随之也会引来一些分布式问题,比如某个接口的处理逻辑是这样的:接收到请求后,先查询 DB 看是否有相关的数据,如果没有则插入数据,如果有则更新数据。在这种场景下如果相同的 N 个请求并发发...
锁的本质就是互斥,保证任何时候能有一个客户端持有同一个锁,如果考虑使用redis来实现一个分布式锁,最简单的方案就是在实例里面创建一个键值,释放锁的时候,将键值删除。但是一个可靠完善的分布式锁需要考虑的...
原生redis分布式锁实现,支持注解,不推荐项目中使用,仅供学习使用 redis-distributed-lock-demo-spring redis-distributed-lock-core 调用实例,仅供学习 基于Redisson的分布式锁spring starter实现,可用于实际...
只需将该项目放到不同的机器,简单配置一下redis /mysql 就可以运行,实现分布式抓取数据,需配置相同的环境scrapy/scrapy-redis/itemadapter/redis/mysql
利用分布式共享锁实现防止方法重复调用(防刷单及redis分布式锁的实现)
分布式锁实现的方案有很多,比如基于ZooKeeper实现、或者基于Mysql实现等等,我们来一起看看如何基于Redis实现分布式锁服务。 分布式锁要点 对于分布式锁的目标,我们必须首先明确三点: 1、任何一个时间点...
本篇文章通过实例给大家讲解了Redis分布式锁工作原理以及用法分享,有需要的朋友参考学习下吧。
今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现原理。 如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用...
分布式服务API的幂等设计方案SpringBoot+Redis拦截器实现实例.docx
这篇文章主要介绍了python如何使用Redis构建分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在实际应用场景中,我们可能有多个worker,可能在一台机器...