Redis的key過期設定 查詢 清理

2021-10-25 11:57:03 字數 4016 閱讀 4958

1.redis過期時間介紹

有時候我們並不希望redis的key一直存在。例如快取,驗證碼等資料,我們希望它們能在一定時間內自動的被銷毀。redis提供了一些命令,能夠讓我們對key設定過期時間,並且讓key過期之後被自動刪除

2.redis過期時間相關命令

1.expire pexpire

expire介面定義:expire key "seconds"

介面描述:設定乙個key在當前時間"seconds"(秒)之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

pexpire介面定義:pexpire key "milliseconds"

介面描述:設定乙個key在當前時間"milliseconds"(毫秒)之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

127.0.0.1:6379>setaa bb

ok

127.0.0.1:6379> expire aa 60

(integer) 1

127.0.0.1:6379> expire aa 600

(integer) 1

2.expireat pexpireat

expireat介面定義:expireat key "timestamp"

介面描述:設定乙個key在"timestamp"(時間戳(秒))之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

pexpireat介面定義:pexpireat key "milliseconds-timestamp"

介面描述:設定乙個key在"milliseconds-timestamp"(時間戳(毫秒))之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間

127.0.0.1:6379>setaa bb

ok

127.0.0.1:6379> expireat aa 1586941008

(integer) 1

127.0.0.1:6379> pexpireat aa 1586941008000

(integer) 1

3.ttl pttl

ttl介面定義:ttl key

介面描述:獲取key的過期時間。如果key存在過期時間,返回剩餘生存時間(秒);如果key是永久的,返回-1;如果key不存在或者已過期,返回-2。

pttl介面定義:pttl key

介面描述:獲取key的過期時間。如果key存在過期時間,返回剩餘生存時間(毫秒);如果key是永久的,返回-1;如果key不存在或者已過期,返回-2。

127.0.0.1:6379>setaa bb

ok

127.0.0.1:6379> expire  aa 60

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 58

127.0.0.1:6379> ttl aa

(integer) 56

127.0.0.1:6379> pttl aa

(integer) 40395

4.persist

persist介面定義:persist key

介面描述:移除key的過期時間,將其轉換為永久狀態。如果返回1,代表轉換成功。如果返回0,代表key不存在或者之前就已經是永久狀態。

127.0.0.1:6379>setaa bb

ok

127.0.0.1:6379> expire  aa 600

(integer) 1

127.0.0.1:6379> ttl aa

(integer) 596

127.0.0.1:6379> persist aa

(integer) 1

127.0.0.1:6379> ttl aa

(integer) -1

5.setex

setex介面定義:setex key "seconds" "value"

介面描述:setex在邏輯上等價於set和expire合併的操作,區別之處在於setex是一條命令,而命令的執行是原子性的,所以不會出現併發問題。

127.0.0.1:6379> setex aa 100 bb

ok

127.0.0.1:6379> pttl aa

(integer) 95834

127.0.0.1:6379> ttl aa

(integer) 81

3.redis如何清理過期key 

redis出於效能上的考慮,無法做到對每乙個過期的key進行即時的過期監聽和刪除。但是redis提供了其它的方法來清理過期的key。

1.被動清理(或者稱惰性過期)

當使用者主動訪問乙個過期的key時,redis會將其直接從記憶體中刪除。

2.主動清理(或者稱定期過期)

在redis的持久化中,我們知道redis為了保持系統的穩定性,健壯性,會週期性的執行乙個函式。在這個過程中,會進行之前已經提到過的自動的持久化操作,同時也會進行記憶體的主動清理。

在記憶體主動清理的過程中,redis採用了乙個隨機演算法來進行這個過程:簡單來說,redis會隨機的抽取n(預設100)個被設定了過期時間的key,檢查這其中已經過期的key,將其清除。同時,如果這其中已經過期的key超過了一定的百分比m(預設是25),則將繼續執行一次主動清理,直至過期key的百分比在概率上降低到m以下。

4.redis記憶體不足時的策略

redis是乙個基於記憶體的資料庫,如果儲存的資料量很大,達到了記憶體限制的最大值(設定maxmemory),將會出現記憶體不足的問題。redis允許使用者通過配置maxmemory-policy引數,指定redis在記憶體不足時的解決策略

當使用volatile-lru、volatile-random、volatile-ttl這三種策略時,如果沒有key可以被淘汰,則和noeviction一樣返回錯誤。

lru和lfu:

redis中記憶體滿時的lru是靠資料的訪問時間的對比,訪問時間在獲取時並不是獲取系統時間,而是乙個定時(100ms)重新整理時間的執行緒提供的。 

Redis設定和更新Key的過期時間

為給定key設定生存時間,當key過期時 生存時間為0 它會被自動刪除。在 redis 中,帶有生存時間的key被稱為 易失的 volatile 生存時間可以通過使用 del 命令來刪除整個key來移除,或者被 set 和 getset 命令覆寫 overwrite 這意味著,如果乙個命令只是修改 ...

redis過期key監聽

修改配置檔案 redis.conf notify keyspace events ex k 鍵空間通知,以 keyspace 為字首 e 鍵事件通知,以 keysevent 為字首 g del expipre rename 等型別無關的通用命令的通知,string命令 l list命令 s set命...

Redis如何過期key

過期redis key有兩種方式 被動和主動方式。被動過期 當一些客戶端要訪問這個key時,發現它已經過期,則刪除。顯然這樣做是不夠的,因為可能有些key不會被再次訪問。這種情況下也同樣要刪除這些過期的key。因此就有了主動過期的方式。主動過期 redis會定期,通過隨機的方式在設定了過期時間的ke...