redis在實際使用過程中更多的用作快取,然而快取的資料一般都是需要設定生存時間的,即到期後資料銷毀。
ttl檢視
key的剩餘時間,當返回值為
-2時,表示鍵被刪除。
當 key 不存在時,返回
-2 。 當
key
存在但沒有設定剩餘生存時間時,返回
-1 。 否則,以毫秒為單位,返回
key
的剩餘生存時間。
注意:在 redis 2.8 以前,當
key
不存在,或者
key
沒有設定剩餘生存時間時,命令都返回
-1 。
127.0.0.1:6379>flushallok127.0.0.1:6379>set bomb tnt
ok127.0.0.1:6379> expire bomb 10(integer) 1
127.0.0.1:6379>ttl bomb
(integer) 5
127.0.0.1:6379>ttl bomb
(integer) 3
127.0.0.1:6379>ttl bomb
(integer) 3
127.0.0.1:6379>ttl bomb
(integer) 2
127.0.0.1:6379>ttl bomb
(integer) 1
127.0.0.1:6379>ttl bomb
(integer) -2
127.0.0.1:6379>ttl bomb
(integer) -2
127.0.0.1:6379>
設定新的資料時需要重新設定該key的生存時間。重新設定值也會清除生存時間。
127.0.0.1:6379>set bomb tntok127.0.0.1:6379> expire bomb 60(integer) 1
127.0.0.1:6379>ttl bomb
(integer) 49
127.0.0.1:6379>persist bomb
(integer) 1
127.0.0.1:6379>ttl bomb
(integer) -1
127.0.0.1:6379>
設定生存時間為毫秒,可以做到更精確的控制。
127.0.0.1:6379>set bomb tntok127.0.0.1:6379> pexpire bomb 10000
(integer) 1
127.0.0.1:6379>ttl bomb
(integer) 6
127.0.0.1:6379>ttl bomb
(integer) 3
127.0.0.1:6379>ttl bomb
(integer) -2
127.0.0.1:6379>
redis是單執行緒時,提交命令時,其它命令無法插入其中,輕鬆利用單執行緒實現了事務的原子性。
那如果執行多個
redis
命令呢?就沒有辦法保證事務啦,
於是redis
有下列相關的
redis
命令來實現事務管理。
multi 開啟事務exec 提交事務
discard 取消事務
watch 監控,如果監控的值發生變化,則提交事務時會失敗
unwatch 去掉監控
redis保證乙個事務中的所有命令要麼都執行,要麼都不執行。
如果在傳送
exec
命令前客戶端斷線了,則
redis
會清空事務佇列,事務中的所有命令都不會執行。
而 一旦客戶端傳送了
exec
命令,所有的命令就都會被執行,即使此後客戶端斷線也沒關係,因為
redis
中已經記錄了所有要執行的命令。
例如:模擬轉賬,王有200,張有
700,張給王轉
100。過程如下:
127.0.0.1:6379> set w 200ok127.0.0.1:6379> set z 700ok
127.0.0.1:6379>mget w z #mget:一次取多值
1) "200"
2) "700"
127.0.0.1:6379>multi
ok127.0.0.1:6379> decrby z 100 #decrby 設定遞減步長,預設的遞減步長為1
queued #注意此命令根本沒有執行,而是把其放在乙個佇列中
127.0.0.1:6379> incrby w 100 #設定遞增步長,預設的遞增步長是1
queued
127.0.0.1:6379>mget w zqueued
127.0.0.1:6379>get w #同時,這些相關的變數也不能再讀取
queued
127.0.0.1:6379>get z
queued
127.0.0.1:6379>exec
1) (integer) 600
2) (integer) 300
3) 1) "300"
2) "600"
4) "300"
5) "600"
127.0.0.1:6379>mget w z
1) "300"
2) "600"
127.0.0.1:6379>
127.0.0.1:6379>mget w z1)"300"2) "600"
127.0.0.1:6379>multi #開啟事務
ok127.0.0.1:6379>get w
queued
127.0.0.1:6379>set w 100queued
127.0.0.1:6379>abc(error)err unknown command'abc'#錯誤命令
127.0.0.1:6379>exec
(error) execabort transaction discarded because of previous errors.
127.0.0.1:6379>get w
"300"127.0.0.1:6379>
redis事務太簡單,沒有回滾,而只有取消。
discard 命令用於取消乙個事務, 它清空客戶端的整個事務佇列, 然後將客戶端從事務狀態調整回非事務狀態,
最後返回字串 ok 給客戶端, 說明事務已被取消
127.0.0.1:6379>mget z w1) "600"
2) "300"
127.0.0.1:6379>multi
ok127.0.0.1:6379> incrby z 100queued
127.0.0.1:6379>discard
ok127.0.0.1:6379>get z
"600"
127.0.0.1:6379>exec
(error) err exec without multi
客戶端1:127.0.0.1:6379>clear
127.0.0.1:6379> set ticket 1ok
127.0.0.1:6379> set money 0ok
127.0.0.1:6379>watch ticket #樂觀鎖,對值進行觀察,改變則事務失敗
ok127.0.0.1:6379>multi #開啟事務
ok127.0.0.1:6379>decr ticket #用於value值自減
queued
127.0.0.1:6379> incrby money 100queued
客戶端2:還沒等客戶端1提交事務,此時客戶端2把票買到了。
127.0.0.1:6379>get ticket
"1"127.0.0.1:6379>decr ticket
(integer) 0客戶端1:
127.0.0.1:6379>exec
(nil) #執行事務,失敗
127.0.0.1:6379>get ticket
"0"127.0.0.1:6379> unwatch #取消監控
C 筆試題第三波
include using namespace std static int gflags 0 楊氏矩陣的查詢。int findval int a 8 int x,int y,int val gflags 1 return 1 int main cout 5,8,12 include include...
劍指offer 第三波
輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 解題思路 有兩點需要注意的,一是可以再新增乙個函式,該函式用於判斷兩子樹以當前點作為根節點是否相互包含。另外需要注意的是,遞迴的部分可以做一點優化,如果左子樹已經包含了proot2,則可以不用再判斷右子樹而直接得...
redis使用ttl檢視key 鍵 的生存時間
ttl key 以秒為單位,返回給定 key 的剩餘生存時間 ttl,time to live 可用版本 1.0.0時間複雜度 o 1 返回值 當 key 不存在時,返回 2 當 key 存在但沒有設定剩餘生存時間時,返回 1 否則,以秒為單位,返回 key 的剩餘生存時間。在 redis 2.8 ...