正題:先說我發現的問題:當乙個事務的執行被打斷,jedis的exec()為什麼沒有返回null,返回的是乙個empty list?
static void rename(final k key, final k newkey, redisoperationsoperations) else
} while (operations.exec() == null);
return null;
}});
}
注意while中的判斷operations.exec() == null,意思是事務中斷了,exec()會返回null,迴圈執行,直到事務沒有被打斷,也就是exec()返回不為null為止。這段**有幾個需要注意的地方,要使用sessioncallback,這樣會把乙個redis的socket連線繫結到該執行緒,否則事務中的每個操作都會建立新連線(每次都建立新連線對事務的執行有什麼影響?)
於是乎,我也照著這種寫法寫了。詭異的事情來了,我自己測試發現,當監視的key被修改後,事務確實中斷了,沒有執行,但是這個exec()為什麼返回的不是null?是乙個empty list()?反覆測試都是這個結果,那還能咋辦,看原始碼,redistemplate也是對jedis的封裝。
public listexec()
listformatted = new arraylist();
for (object o : unformatted) catch (jedisdataexception e)
}return formatted;
}
注意啊,看原始碼裡這一段:
if (unformatted == null)
事務中斷的時候返回了null,然後jedis這裡卻返回了empty list?在原始碼這裡打個斷點,也證實了。
Redis 客戶端Jedis 事務
redis 事務可以一次執行多個命令,並且帶有以下兩個重要的保證 1.事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。2.事務是乙個原子操作 事務中的命令要麼全部被執行,要麼全部都不執行。乙個事務從開始到執行會經歷以下三...
Jedis事務詳解
1 正常執行的事務 編碼測試 package com.haiyang import com.alibaba.fastjson.jsonobject import redis.clients.jedis.jedis import redis.clients.jedis.transaction publ...
Jedis連線操作redis
redis是系統中最常見的快取應用,jedis可以產生執行緒安全的例項,用於連線 操作redis。string redis host redis host int redis port redis port jedispoolconfig config new jedispoolconfig 配置最...