锁Redis锁 处理并发 原子性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁Redis锁 处理并发 原子性相关的知识,希望对你有一定的参考价值。


【锁】Redis锁 处理并发 原子性

如果为空就set值,并返回1
如果存在(不为空)不进行操作,并返回0

很明显,比get和set要好。因为先判断get,再set的用法,有可能会重复set值。

setIfAbsent 和 setnx
setIfAbsent 是java中的方法
setnx 是 redis命令中的方法

说明:当key不存在,将key的值设为value,并设置过期时间,返回true;若给定的key已经存在,则不做任何动作,并返回false。此方法是原子性的

@Autowired
private RedisTemplate redisTemplate;

/**
* 加锁
* @param key key
* @param value value
* @param timeout 过期时间单位秒
* @param false表示有锁 / true表示key不存在 无锁
*/
public boolean getLock(String key, String value, long timeout)
try
//原子性操作
boolean flag = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.SECONDS);
//如果存在false表示重复
return flag;
catch (Exception e)
logger.error("redis加锁异常", e);
//出现异常删除锁
redisTemplate.delete(key);
return true;

redis命令

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"

以上是关于锁Redis锁 处理并发 原子性的主要内容,如果未能解决你的问题,请参考以下文章

Redis的IO多路复用和多线程特性会破坏分布式锁的原子性吗?

Redis的IO多路复用和多线程特性会破坏分布式锁的原子性吗?

Redis事务和乐观锁原理详解

Springboot使用redis的setnx和getset实现并发锁、分布式锁

初始Redis分布式锁

3.Redis系列Redis的高级应用-分布式锁