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)不會消失了
可以采用以下的方法
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è)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring?bean標(biāo)簽中的init-method和destroy-method詳解
這篇文章主要介紹了spring?bean標(biāo)簽中的init-method和destroy-method,在很多項(xiàng)目中,經(jīng)常在xml配置文件中看到init-method 或者 destroy-method ,因此整理收集下,方便以后參考和學(xué)習(xí),需要的朋友可以參考下2023-04-04
JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑
這篇文章主要介紹了JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
java實(shí)現(xiàn)檢測Linux網(wǎng)絡(luò)狀態(tài)(附源碼)
實(shí)時(shí)監(jiān)控服務(wù)器網(wǎng)絡(luò)狀態(tài)是保證業(yè)務(wù)高可用性和可靠性的重要環(huán)節(jié),本文主要介紹了如何設(shè)計(jì)并實(shí)現(xiàn)一個(gè)高性能,可擴(kuò)展,支持事件訂閱與周期采樣的Linux?網(wǎng)絡(luò)狀態(tài)檢測工具,需要的可以了解下2025-06-06
Spring如何解決接口多實(shí)現(xiàn)類的依賴注入沖突
在 Spring 中,當(dāng)一個(gè)接口有多個(gè)實(shí)現(xiàn)類時(shí),依賴注入(DI)的歧義性問題是一個(gè)常見挑戰(zhàn),本文為大家介紹了如何根據(jù)場景選擇最優(yōu)方案,希望對大家有所幫助2025-08-08
SpringBoot配置SSL同時(shí)支持http和https訪問實(shí)現(xiàn)
本文主要介紹了SpringBoot配置SSL同時(shí)支持http和https訪問實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

