Redis整理第三波(生存時間 事務管理)

2022-05-16 13:03:26 字數 4472 閱讀 3228

redis在實際使用過程中更多的用作快取,然而快取的資料一般都是需要設定生存時間的,即到期後資料銷毀。

ttl檢視

key的剩餘時間,當返回值為

-2時,表示鍵被刪除。

當 key 不存在時,返回

-2 。 當

key

存在但沒有設定剩餘生存時間時,返回

-1 。 否則,以毫秒為單位,返回

key

的剩餘生存時間。

注意:在 redis 2.8 以前,當

key

不存在,或者

key

沒有設定剩餘生存時間時,命令都返回

-1 。

127.0.0.1:6379>flushall

ok127.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 tnt

ok127.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 tnt

ok127.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 200ok

127.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 z

queued

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 z

1)"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 w

1) "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 ...