redis的setIfAbsent使用
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的分布式锁实现中。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接