好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

redis setIfAbsent和setnx的区别与使用说明

redis setIfAbsent和setnx的区别与使用

如果为空就set值,并返回1

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

setIfAbsent 和 setnx 使用范围

setIfAbsent 是java中的方法

setnx 是 redis命令中的方法

setnx 例子

?

1

2

3

4

5

6

redis> SETNX testkey "test"

(integer) 1

redis> SETNX testkey "test"

(integer) 0

redis> GET testkey

"test"

setIfAbsent 例子

?

1

2

3

4

5

6

redis> SETNX testkey "test"

(integer) 1

redis> SETNX testkey "test"

(integer) 0

redis> GET testkey

"test"

RedisTemplate 实现 setnx exptime (扩展 redisTemplate.setIfAbsent)

之前用 redisTemplate 实现setnx exptime 时 是分两步的

1. redisTemplate.setIfAbsent

2. redisTemplate.expire

这样的不是原子性的 可能在第一步与第二步之间 重新发布了或者服务器重启了 这个key就永远不会消失了

可以采用以下的方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static boolean setIfAbsent( final String key, final Serializable value, final long exptime) {

     Boolean b = (Boolean) redisTemplate.execute( new RedisCallback<Boolean>() {

         @Override

         public Boolean doInRedis(RedisConnection connection) throws DataAccessException {

             RedisSerializer valueSerializer = redisTemplate.getValueSerializer();

             RedisSerializer keySerializer = redisTemplate.getKeySerializer();

             Object obj = connection.execute( "set" , keySerializer.serialize(key),

                                 valueSerializer.serialize(value),

                                 SafeEncoder.encode( "NX" ),

                                 SafeEncoder.encode( "EX" ),

                                 Protocol.toByteArray(exptime));

             return obj != null ;

         }

     });

     return b;

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/enthan809882/article/details/107783440

查看更多关于redis setIfAbsent和setnx的区别与使用说明的详细内容...

  阅读:17次