import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.UUID;
@Component
public class RedisUtils {
private static final RedisScript<String> SCRIPT_LOCK = new DefaultRedisScript<>("return redis.call('set',KEYS[1],ARGV[1],'NX','PX',ARGV[2])", String.class);
private static final RedisScript<String> SCRIPT_UNLOCK = new DefaultRedisScript<>("if redis.call('get',KEYS[1]) == ARGV[1] then return tostring(redis.call('del', KEYS[1])==1) else return 'false' end", String.class);
private static final String LOCK_SUCCESS = "OK";
@Resource
private StringRedisTemplate stringRedisTemplate;
public String acquire(String lockKey, long second) {
String lockValue = UUID.randomUUID().toString();
Object lockResult = stringRedisTemplate.execute(SCRIPT_LOCK,
//stringRedisTemplate.getStringSerializer(),
//stringRedisTemplate.getStringSerializer(),
Collections.singletonList(lockKey),
lockValue, String.valueOf(second * 1000));
if (LOCK_SUCCESS.equals(lockResult)) {
return lockValue;
}
return null;
}
public boolean releaseLock(String lockKey, String lockValue) {
Object releaseResult = stringRedisTemplate.execute(SCRIPT_UNLOCK,
//stringRedisTemplate.getStringSerializer(),
//stringRedisTemplate.getStringSerializer(),
Collections.singletonList(lockKey),
lockValue);
return Boolean.valueOf(releaseResult.toString());
}
}
springboot redis 分布式锁
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使用她;本篇不涉及...
- 本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟小米手机秒杀抢购的场景来使用她...
- 本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使用她;本篇不涉及...
- 蛋疼问题,想使用 方法解决多点和并发问题,但是由于redis版本问题不存在,只好曲线救国 springboot ...