api demo:
set("key","value",30, TimeUnit.SECONDS);
redisTemplate demo:
redisTemplate.opsForValue().setIfAbsent("onlykey","value",10, TimeUnit.SECONDS);
redis分布式锁大致实现原理分析:
主要依托了它的key不存在才能set成功的特性,线程A拿到锁,在没有删除锁的Key时,线程B获取锁就失败了。
使用redisTemplate setIfAbsent实现分布式锁大致原理:
setIfAbsent的特性是key不存在才能set成功,并会返回boolean结果,这种原子性特性刚好可以用来实现分布式锁。
业务场景:限制用户频繁请求,默认在分布式场景下同一个方法在不允许并发执行(用户疯狂点击没有限制的按钮等)
Java伪代码逻辑:
//1.设置对用户维度的唯一值,作为key
String key = “synRedisKey:”+onlyValue;
//2.对锁进行判断
if(!redisTemplate.opsForValue().setIfAbsent("onlykey","value",3, TimeUnit.SECONDS)){
//锁存在
return "操作太频繁啦";
}
//3.业务逻辑....end
//4.删除(释放)锁
redisTemplate.delete(key);