Redis資料到期策略探究

來源:互聯網
上載者:User

Redis資料到期策略探究

通過EXPIRE key seconds命令來設定資料的到期時間。返回1表明設定成功,返回0表明key不存在或者不能成功設定到期時間。

在key上設定了到期時間後key將在指定的秒數後被自動刪除。被指定了到期時間的key在Redis中被稱為是不穩定的。

當key被DEL命令刪除或者被SET、GETSET命令重設後與之關聯的到期時間會被清除。

redis 127.0.0.1:6379> set mykey "test expire"
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 97
redis 127.0.0.1:6379> ttl mykey
(integer) 93
redis 127.0.0.1:6379> set mykey "test expire reset"
OK
redis 127.0.0.1:6379> ttl mykey
(integer) -1

redis 127.0.0.1:6379> set mykey "test expire"
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 98
redis 127.0.0.1:6379> ttl mykey
(integer) 91
redis 127.0.0.1:6379> getset mykey "test expire reset"
"test expire"
redis 127.0.0.1:6379> ttl mykey
(integer) -1

這也意味著僅從概念上更新了儲存在key中的值而沒有用全新的值替換key原有值的所有操作都不會影響在該key上設定的到期時間。例如使用INCR命令增加key的值或者通過LPUSH命令在list中增加一個新的元素或者使用HSET命令更新hash欄位的值都會回清除原有的到期時間設定。

redis 127.0.0.1:6379> set mykey 1
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 95
redis 127.0.0.1:6379> incr mykey
(integer) 2
redis 127.0.0.1:6379> ttl mykey
(integer) 77

redis 127.0.0.1:6379> lpush listkey 1
(integer) 1
redis 127.0.0.1:6379> expire listkey 100
(integer) 1
redis 127.0.0.1:6379> ttl listkey
(integer) 94
redis 127.0.0.1:6379> lpush listkey 2
(integer) 2
redis 127.0.0.1:6379> ttl listkey
(integer) 82

redis 127.0.0.1:6379> hmset hashkey name "redis" passwd "redis"
OK
redis 127.0.0.1:6379> expire hashkey 100
(integer) 1
redis 127.0.0.1:6379> ttl hashkey
(integer) 95
redis 127.0.0.1:6379> hset hashkey  passwd "redis.vs.mysql"
(integer) 0
redis 127.0.0.1:6379> ttl hashkey
(integer) 66

當然也可通過PERSIST命令清除已設定的到期時間重新將key變為持久的。

redis 127.0.0.1:6379> set mykey 'test clear expire'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 96
redis 127.0.0.1:6379> persist mykey
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) -1

若key被RENAME命令重新命名則與之關聯的到期時間將傳遞到新名稱的key。

redis 127.0.0.1:6379> get mykeynew
(nil)
redis 127.0.0.1:6379> set mykey 'test expire transfer'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 96
redis 127.0.0.1:6379> rename mykey mykeynew
OK
redis 127.0.0.1:6379> ttl mykey
(integer) -1
redis 127.0.0.1:6379> ttl mykeynew
(integer) 80

若key被RENAME命令重寫,比如本存在名為mykey_a和mykey_b的key一個RENAME mykey_b mykey_a命令將mykey_b重新命名為本已存在的mykey_a那麼無論mykey_a原來的設定如何都將繼承mykey_b的所有特性,包括到期時間設定。

redis 127.0.0.1:6379> set mykey_b 'b'
OK
redis 127.0.0.1:6379> set mykey_a 'a'
OK
redis 127.0.0.1:6379> expire mykey_b 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey_b
(integer) 93
redis 127.0.0.1:6379> ttl mykey_a
(integer) -1
redis 127.0.0.1:6379> rename mykey_b mykey_a
OK
redis 127.0.0.1:6379> ttl mykey_b
(integer) -1
redis 127.0.0.1:6379> ttl mykey_a
(integer) 66

EXPIRE key seconds應用於一個已經設定了到期時間的key上時原有的到期時間將被更新為新的到期時間

redis 127.0.0.1:6379> set mykey 'test expire update'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 95
redis 127.0.0.1:6379> expire mykey 1000
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 998

附錄:
key的到期時間
通常,Redis key被建立時不會自動關聯到期時間,key將長久存在,除非通過DEL等命令顯示的刪除。EXPIRE命令簇可以為指定的key關聯一個到期時間,代價是一點額外的記憶體開銷。當key被設定了到期時間後Redis要保證在逾時時移除該key。key的到期時間可被EXPIRE命令更新或者被PERSIST命令完全移除。

到期時間的精度
Redis2.4中expire精度不高,通常在0到1秒間,Redis2.6以後expire精度可以控制在0到1毫秒內。

到期與持久化

key的到期資訊以絕對Unix時間戳記的形式儲存(Redis2.6之後以毫秒層級的精度儲存)。這意味著,即使Redis執行個體沒有運行也不會對key的到期時間造成影響。
為了使到期時間更正確的工作,必須檢查電腦的時間。如果將RDB快照從一台電腦移動到另一台時間超前或滯後的電腦便會發生好玩的事情,比如資料剛載入便逾時。即使是在同一機器的同一執行個體中若電腦的時間不正確或發生了變化同樣為引起問題,比如一批資料的到期時間被設定為了1000,之後電腦時間意外的快了2000秒,那麼這些key將立刻到期,而不是1000秒後到期。

Redis如何使key到期
Redis key到期的方式有二:被動方式和主動方式
當clients試圖訪問設定了到期時間且已到期的key時,為主動到期方式。
但僅是這樣是不夠的,以為可能存在一些key永遠不會被再次訪問到,這些設定了到期時間的key也是需要在到期後被刪除的。因此,Redis會周期性的隨機測試一批設定了到期時間的key並進行處理。測試到的已到期的key將被刪除。典型的方式為,Redis每秒做10次如下的步驟:
1.隨機測試100個設定了到期時間的key
2.刪除所有發現的已到期的key
3.若刪除的key超過25個則重複步驟1
這是一個基於機率的簡單演算法,基本的假設是抽出的樣本能夠代表整個key空間,redis持續清理到期的資料直至將要到期的key的百分比降到了25%以下。這也意味著在任何給定的時刻已經到期但仍佔據著記憶體空間的key的量最多為每秒的寫操作量除以4.

replication link和AOF檔案中的到期處理
為了獲得正確的行為而不至於導致一致性問題,當一個key到期時DEL操作將被記錄在AOF檔案並傳遞到所有相關的slave。也即到期刪除操作統一在master執行個體中進行並向下傳遞,而不是各salve各自掌控。這樣一來便不會出現資料不一致的情形。當slave串連到master後並不能立即清理已到期的key(需要等待由master傳遞過來的DEL操作),slave仍需對資料集中的到期狀態進行管理維護以便於在slave被提升為master會能像master一樣獨立的進行到期處理。

Ubuntu 14.04下Redis安裝及簡單測試

Redis叢集明細文檔

Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis

Redis系列-安裝部署維護篇

CentOS 6.3安裝Redis

Redis安裝部署學習筆記

Redis設定檔redis.conf 詳解

Redis 的詳細介紹:請點這裡
Redis 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.