Redis的get和set

我们可以通过get命令获得redis中对应key的值:

get userId

如果存在则返回对应的值,如果不存在则返回null。

我们可以通过set key value的形式设置值:

localhost:0>set userId 1
OK

设置成功则返回OK。

在应用程序中,我们可以组合两者进行业务逻辑处理,比如先get对应的key,如果没有值则调用set。

但这样处理并不具有原子性操作。

原子性的setnx

redis提供了setnx方法,可以通过该方法原子性的判断和操作。

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

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

setnx 例子

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

对应的,在Java不同的类库中也提供了setIfAbsent方法,比如:

BoundValueOperations boundValueOperations = this.redisTemplate.boundValueOps(redisKey);
flag = boundValueOperations.setIfAbsent(value); // flag 表示的是否set
boundValueOperations.expire(seconds, TimeUnit.SECONDS);

if(!flag){ // 重复
    repeatSerial.add(serialNo);
    continue;
}else{// 没有重复
    norepeatSerial.add(serialNo);
}

如果使用的是spring-boot-data-redis依赖,则可以通过如下方式使用:

redisTemplate.opsForValue().setIfAbsent(userId, "lock")

这种方式,通常也会不用基于Redis的分布式锁实现中。



redis的setIfAbsent使用插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2021/10/23/redis-setifabsent/