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

redis setIfAbsent和setnx的区别与使用

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

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

setIfAbsent 和 setnx 使用范围

setIfAbsent 是java中的方法

setnx 是 redis命令中的方法

setnx 例子

redis> SETNX testkey "test"
(integer) 1
redis> SETNX testkey "test"
(integer) 0
redis> GET testkey
"test"

setIfAbsent 例子

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就永远不会消失了

可以采用以下的方法

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;
}

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

(0)

相关推荐

  • 基于redis setIfAbsent的使用说明

    如果为空就set值,并返回1 如果存在(不为空)不进行操作,并返回0 很明显,比get和set要好.因为先判断get,再set的用法,有可能会重复set值. setIfAbsent 和 setnx setIfAbsent 是java中的方法 setnx 是 redis命令中的方法 setnx 例子 redis> SETNX mykey "Hello" (integer) 1 redis> SETNX mykey "World" (integer) 0 r

  • Redis的Expire与Setex区别说明

    Expire 为key设置过期时间 Setex 为key设置value值,并且,设置过期时间 区别 Setex是一个原子操作 设置值,设置过期时间两个动作,会在同一时间完成 在Redis缓存中,非常实用 补充知识:redis之setnx.setex.setrange.mset 1.setnx 设置 key对应的值为 string类型的 value. 如果key 已经存在,返回 0,nx 是not exist 的意思. 例如我们添加一个name= HongWan_new 的键值对,可以这样做: r

  • 详解使用Redis SETNX 命令实现分布式锁

    使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若给定的 key 已经存在,则 SETNX 不做任何动作. SETNX 是SET if Not eXists的简写. 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 例子 redis> SETNX mykey "hello" (integer

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

    redis setIfAbsent和setnx的区别与使用 如果为空就set值,并返回1 如果存在(不为空)不进行操作,并返回0 setIfAbsent 和 setnx 使用范围 setIfAbsent 是java中的方法 setnx 是 redis命令中的方法 setnx 例子 redis> SETNX testkey "test" (integer) 1 redis> SETNX testkey "test" (integer) 0 redis>

  • 分布式缓存Redis与Memcached的优缺点区别比较

    目录 Memcache与Redis的区别都有哪些? 1).存储方式 2).数据支持类型 3).使用底层模型不同 4),value大小 redis相比memcached有哪些优势? 使用redis有哪些好处? 为什么Memcached和Redis如此流行? 不仅是其具有超高的性能,还因为相对来说他们都非常简单. 对程序员来说上手使用Memcached或Redis相当容易. 安装和设置并集成到系统中可能只需要几分钟时间. 因此花费一点点时间和精力就能立刻大幅提升系统性能 —— 通常是提升一个数量级.

  • Redis持久化RDB和AOF区别详解

    RDB是Redis内存到硬盘的快照,用于redis持久化,创建RDB二进制文件,将存储在内存中的数据,持久化的放到硬盘中,当我们需要这些数据的时候,启动载入RDB文件,数据将会被存入内存中,其实RDB就是一种快照的方式持久化存储数据,也可以作为一种复制媒介,这个我们后面在谈. RDB 触发机制--主要三种方式 save 同步命令(会阻塞redis) bgsave 异步命令(fork) 自动 Save同步命令 save 文件策略:生成一个临时文件,如果存在老的文件,将会替换旧文件 bgsave 异

  • redis setIfAbsent返回null的问题及解决

    目录 起因 原因 解决 起因 今天在写业务代码的时候,用到了StringRedisTemplate中redisTemplate.opsForValue().setIfAbsent()中并不是我期望的true或者false而是返回了null,起初我还以为是因为Returns:null when used in pipeline / transaction.这个原因,但是我并没有在业务中使用到事务. 原因 遂使用谷歌大法,才搜到原来这是因为Redisson的bug,网友给出的解决方案是去掉就好了,但

  • Tree、Unformat、Vsafe命令的区别与使用说明

    tree      显示命令树结构 [适用场合] 查看所有的子目录 [用 法] tree [盘符] 显示所有的子目录树 tree /f 显示目录时同时显示文件名 tree /a 以ASCII码显示目录树 [例 子] C:\WINDOWS>tree /a unformat   恢复已被格式化的磁盘 [建 议] 你把有重要信息的软盘格式化了?快用unformat--什么?你用了    format /u,那死定了 [用 法] unformat [盘符]  恢复指定的被格式化的磁盘 unformat

  • redis keys与scan命令的区别说明

    redis keys和scan的区别 redis的keys命令,通常在用来删除相关key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys时,执行速度会比较慢,更致命的是,这个命令会阻塞redis多路复用的io主线程,如果这个线程阻塞,在此期间,其他发向redis服务端的命令,都会被阻塞,从而引发一系列级联反应,导致瞬间相应卡顿,从而引发超时等问题,所以应该在生产环境禁止用使用keys和类似的命令smembers,这种时间复杂度为O(N),且会阻塞主线程的命令,是非常危险的.

  • 利用Redis进行数据缓存的项目实践

    目录 1. 引言 2. 将信息添加到缓存的业务流程 3. 实现代码 3.1 代码实现(信息添加到缓存中) 3.2 缓存更新策略 3.3 实现主动更新 4. 缓存穿透 4.1 解决缓存穿透(使用空对象进行解决) 5. 缓存雪崩 6. 缓存击穿 6.1 互斥锁代码 6.2 逻辑过期实现 1. 引言 缓存有啥用? 降低对数据库的请求,减轻服务器压力 提高了读写效率 缓存有啥缺点? 如何保证数据库与缓存的数据一致性问题? 维护缓存代码 搭建缓存一般是以集群的形式进行搭建,需要运维的成本 2. 将信息添加

随机推荐