redis setIfAbsent和setnx的區(qū)別與使用說明
redis setIfAbsent和setnx的區(qū)別與使用
如果為空就set值,并返回1
如果存在(不為空)不進(jìn)行操作,并返回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 實(shí)現(xiàn) setnx exptime (擴(kuò)展 redisTemplate.setIfAbsent)
之前用 redisTemplate 實(shí)現(xiàn)setnx exptime 時(shí) 是分兩步的
1. redisTemplate.setIfAbsent
2. redisTemplate.expire
這樣的不是原子性的 可能在第一步與第二步之間 重新發(fā)布了或者服務(wù)器重啟了 這個(gè)key就永遠(yuǎn)不會(huì)消失了
可以采用以下的方法
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;
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問題及解決
- Redis實(shí)現(xiàn)分布式鎖(setnx、getset、incr)以及如何處理超時(shí)情況
- 詳解使用Redis SETNX 命令實(shí)現(xiàn)分布式鎖
- SpringCloud之Config配置中心與Redis分布式鎖詳解
- SpringCloud?分布式鎖的多種實(shí)現(xiàn)
- springcloud如何用Redlock實(shí)現(xiàn)分布式鎖
- 詳解如何在springcloud分布式系統(tǒng)中實(shí)現(xiàn)分布式鎖
- Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解
相關(guān)文章
SpringCloud?Alibaba環(huán)境集成之nacos詳解
Spring?Cloud?Alibaba提供了越來越完善的各類微服務(wù)治理組件,比如分布式服務(wù)配置與注冊(cè)中心nacos,服務(wù)限流、熔斷組件sentinel等,本篇先來介紹SpringCloud?Alibaba環(huán)境集成之nacos詳解,需要的朋友可以參考下2023-03-03
java實(shí)體類轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為"null"問題
這篇文章主要介紹了java實(shí)體類轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為“null”問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
java調(diào)用js文件的兩種常用方法示例(支持V8引擎)
在Java中調(diào)用JavaScript的方法通常涉及到使用Java的腳本引擎,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用js文件的兩種常用方法(支持V8引擎)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
SpringBoot啟動(dòng)嵌入式Tomcat的實(shí)現(xiàn)步驟
本文主要介紹了淺談SpringBoot如何啟動(dòng)嵌入式Tomcat,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

