Redis資料到期策略探究

來源:互聯網
上載者:User

標籤:redis   expire   

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

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

當key被DEL命令刪除或者被SET、GETSET命令重設後與之關聯的到期時間會被清除。
redis 127.0.0.1:6379> set mykey "test expire"OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 97redis 127.0.0.1:6379> ttl mykey(integer) 93redis 127.0.0.1:6379> set mykey "test expire reset"OKredis 127.0.0.1:6379> ttl mykey(integer) -1redis 127.0.0.1:6379> set mykey "test expire"OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 98redis 127.0.0.1:6379> ttl mykey(integer) 91redis 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 1OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 95redis 127.0.0.1:6379> incr mykey(integer) 2redis 127.0.0.1:6379> ttl mykey(integer) 77redis 127.0.0.1:6379> lpush listkey 1(integer) 1redis 127.0.0.1:6379> expire listkey 100(integer) 1redis 127.0.0.1:6379> ttl listkey(integer) 94redis 127.0.0.1:6379> lpush listkey 2(integer) 2redis 127.0.0.1:6379> ttl listkey(integer) 82redis 127.0.0.1:6379> hmset hashkey name "redis" passwd "redis"OKredis 127.0.0.1:6379> expire hashkey 100(integer) 1redis 127.0.0.1:6379> ttl hashkey(integer) 95redis 127.0.0.1:6379> hset hashkey  passwd "redis.vs.mysql"(integer) 0redis 127.0.0.1:6379> ttl hashkey(integer) 66
當然也可通過PERSIST命令清除已設定的到期時間重新將key變為持久的。
redis 127.0.0.1:6379> set mykey 'test clear expire'OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 96redis 127.0.0.1:6379> persist mykey(integer) 1redis 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'OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 96redis 127.0.0.1:6379> rename mykey mykeynewOKredis 127.0.0.1:6379> ttl mykey(integer) -1redis 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'OKredis 127.0.0.1:6379> set mykey_a 'a'OKredis 127.0.0.1:6379> expire mykey_b 100(integer) 1redis 127.0.0.1:6379> ttl mykey_b(integer) 93redis 127.0.0.1:6379> ttl mykey_a(integer) -1redis 127.0.0.1:6379> rename mykey_b mykey_aOKredis 127.0.0.1:6379> ttl mykey_b(integer) -1redis 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'OKredis 127.0.0.1:6379> expire mykey 100(integer) 1redis 127.0.0.1:6379> ttl mykey(integer) 95redis 127.0.0.1:6379> expire mykey 1000(integer) 1redis 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一樣獨立的進行到期處理。

Redis資料到期策略探究

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.