久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么在Redis中實現鍵值過期操作

149次閱讀
沒有評論

共計 5206 個字符,預計需要花費 14 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章將為大家詳細講解有關怎么在 Redis 中實現鍵值過期操作,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1. 過期設置

Redis 中設置過期時間主要通過以下四種方式:

expire key seconds:設置 key 在 n 秒后過期;

pexpire key milliseconds:設置 key 在 n 毫秒后過期;

expireat key timestamp:設置 key 在某個時間戳(精確到秒)之后過期;

pexpireat key millisecondsTimestamp:設置 key 在某個時間戳(精確到毫秒)之后過期;

下面分別來看以上這些命令的具體實現。

1)expire:N 秒后過期

127.0.0.1:6379  set key value
127.0.0.1:6379  expire key 100
(integer) 1
127.0.0.1:6379  ttl key
(integer) 97

其中命令 ttl 的全稱是 Time To Live 表示此鍵值在 n 秒后過期。例如,上面的結果 97 表示 key 在 97s 后過期。

2)pexpire:N 毫秒后過期

127.0.0.1:6379  set key2 value2
127.0.0.1:6379  pexpire key2 100000
(integer) 1
127.0.0.1:6379  pttl key2
(integer) 94524

其中 pexpire key2 100000 表示設置 key2 在 100000 毫秒(100 秒)后過期。

3)expireat:過期時間戳精確到秒

127.0.0.1:6379  set key3 value3
127.0.0.1:6379  expireat key3 1573472683
(integer) 1
127.0.0.1:6379  ttl key3
(integer) 67

其中 expireat key3 1573472683 表示 key3 在時間戳 1573472683 后過期(精確到秒),使用 ttl 查詢可以發現在 67s 后 key3 會過期。

小貼士:在 Redis 可以使用 time 命令查詢當前時間的時間戳(精確到秒),示例如下:
127.0.0.1:6379 time
1) 1573472563
2) 248426

4)pexpireat:過期時間戳精確到毫秒

127.0.0.1:6379  set key4 value4
127.0.0.1:6379  pexpireat key4 1573472683000
(integer) 1
127.0.0.1:6379  pttl key4
(integer) 3522

其中 pexpireat key4 1573472683000 表示 key4 在時間戳 1573472683000 后過期(精確到毫秒),使用 ttl 查詢可以發現在 3522ms 后 key4 會過期。

5)字符串中的過期操作

字符串中幾個直接操作過期時間的方法,如下列表:

set key value ex seconds:設置鍵值對的同時指定過期時間(精確到秒);

set key value ex milliseconds:設置鍵值對的同時指定過期時間(精確到毫秒);

setex key seconds valule:設置鍵值對的同時指定過期時間(精確到秒)。

實現示例如下:

① set key value ex seconds

127.0.0.1:6379  set k v ex 100
127.0.0.1:6379  ttl k
(integer) 97

② set key value ex milliseconds

127.0.0.1:6379  set k2 v2 px 100000
127.0.0.1:6379  pttl k2
(integer) 92483

③ setex key seconds valule

127.0.0.1:6379  setex k3 100 v3
127.0.0.1:6379  ttl k3
(integer) 91

2. 移除過期時間

使用命令:persist key 可以移除鍵值的過期時間,如下代碼所示:

127.0.0.1:6379  ttl k3
(integer) 97
127.0.0.1:6379  persist k3
(integer) 1
127.0.0.1:6379  ttl k3
(integer) -1

可以看出第一次使用 ttl 查詢 k3 會在 97s 后過期,當使用了 persist 命令之后,在查詢 k3 的存活時間發現結果是 -1,它表示 k3 永不過期。

3.Java 實現過期操作

本文將使用 Jedis 框架來實現對 Redis 過期時間的操作,如下代碼所示:

public class TTLTest { public static void main(String[] args) throws InterruptedException {
 //  創建  Redis  連接
 Jedis jedis = new Jedis(xxx.xxx.xxx.xxx , 6379);
 //  設置  Redis  密碼 (如果沒有密碼,此行可省略)
 jedis.auth( xxx 
 //  存儲鍵值對(默認情況下永不過期) jedis.set( k ,  v 
 //  查詢  TTL(過期時間) Long ttl = jedis.ttl( k 
 //  打印過期日志
 System.out.println(過期時間: + ttl);
 //  設置  100s  后過期
 jedis.expire(k , 100);
 //  等待  1s  后執行
 Thread.sleep(1000);
 //  打印過期日志
 System.out.println(執行  expire  后的  TTL=  + jedis.ttl( k));
 }
}

程序的執行結果為:

過期時間:-1
執行 expire 后的 TTL=99

可以看出使用 Jedis 來操作 Redis 的過期時間還是很方便的,可直接使用 jedis.ttl(k) 查詢鍵值的生存時間,使用 jedis.expire(k ,seconds) 方法設置過期時間(精確到秒)。

小貼士:使用 Jedis 之前,先要把 Jedis 引入到程序中,如果使用的是 Maven 項目的,直接在 pom.xml 文件中添加以下引用:

!-- https://mvnrepository.com/artifact/redis.clients/jedis -- 
 dependency 
  groupId redis.clients /groupId 
  artifactId jedis /artifactId 
  version version /version 
 /dependency

更多過期操作方法,如下列表:

pexpire(String key, long milliseconds):設置 n 毫秒后過期;

expireAt(String key, long unixTime):設置某個時間戳后過期(精確到秒);

pexpireAt(String key, long millisecondsTimestamp):設置某個時間戳后過期(精確到毫秒);

persist(String key):移除過期時間。

完整示例代碼如下:

public class TTLTest { public static void main(String[] args) throws InterruptedException {
 //  創建  Redis  連接
 Jedis jedis = new Jedis(xxx.xxx.xxx.xxx , 6379);
 //  設置  Redis  密碼 (如果沒有密碼,此行可省略)
 jedis.auth( xxx 
 //  存儲鍵值對(默認情況下永不過期) jedis.set( k ,  v 
 //  查詢  TTL(過期時間) Long ttl = jedis.ttl( k 
 //  打印過期日志
 System.out.println(過期時間: + ttl);
 //  設置  100s  后過期
 jedis.expire(k , 100);
 //  等待  1s  后執行
 Thread.sleep(1000);
 //  打印過期日志
 System.out.println(執行  expire  后的  TTL=  + jedis.ttl( k));
 //  設置  n  毫秒后過期
 jedis.pexpire(k , 100000);
 //  設置某個時間戳后過期(精確到秒) jedis.expireAt(k , 1573468990);
 //  設置某個時間戳后過期(精確到毫秒) jedis.pexpireAt(k , 1573468990000L);
 //  移除過期時間
 jedis.persist( k 
 }
}

4. 持久化中的過期鍵

上面我們講了過期鍵在 Redis 正常運行中一些使用案例,接下來,我們來看 Redis 在持久化的過程中是如何處理過期鍵的。

Redis 持久化文件有兩種格式:RDB(Redis Database)和 AOF(Append Only File),下面我們分別來看過期鍵在這兩種格式中的呈現狀態。

1)RDB 中的過期鍵

RDB 文件分為兩個階段,RDB 文件生成階段和加載階段。

① RDB 文件生成

從內存狀態持久化成 RDB(文件)的時候,會對 key 進行過期檢查,過期的鍵不會被保存到新的 RDB 文件中,因此 Redis 中的過期鍵不會對生成新 RDB 文件產生任何影響。

② RDB 文件加載

RDB 加載分為以下兩種情況:

如果 Redis 是主服務器運行模式的話,在載入 RDB 文件時,程序會對文件中保存的鍵進行檢查,過期鍵不會被載入到數據庫中。所以過期鍵不會對載入 RDB 文件的主服務器造成影響;

如果 Redis 是從服務器運行模式的話,在載入 RDB 文件時,不論鍵是否過期都會被載入到數據庫中。但由于主從服務器在進行數據同步時,從服務器的數據會被清空。所以一般來說,過期鍵對載入 RDB 文件的從服務器也不會造成影響。

RDB 文件加載的源碼可以在 rdb.c 文件的 rdbLoad() 函數中找到,源碼所示:

/* Check if the key already expired. This function is used when loading
* an RDB file from disk, either at startup, or when an RDB was
* received from the master. In the latter case, the master is
* responsible for key expiry. If we would expire keys here, the
* snapshot taken by the master may not be reflected on the slave. 
*  如果服務器為主節點的話,*  那么在鍵已經過期的時候,不再將它們關聯到數據庫中去
if (server.masterhost == NULL   expiretime != -1   expiretime   now) { decrRefCount(key);
 decrRefCount(val);
 //  跳過
 continue;
}

2)AOF 中的過期鍵

① AOF 文件寫入

當 Redis 以 AOF 模式持久化時,如果數據庫某個過期鍵還沒被刪除,那么 AOF 文件會保留此過期鍵,當此過期鍵被刪除后,Redis 會向 AOF 文件追加一條 DEL 命令來顯式地刪除該鍵值。

② AOF 重寫

執行 AOF 重寫時,會對 Redis 中的鍵值對進行檢查已過期的鍵不會被保存到重寫后的 AOF 文件中,因此不會對 AOF 重寫造成任何影響。

5. 主從庫的過期鍵

當 Redis 運行在主從模式下時,從庫不會進行過期掃描,從庫對過期的處理是被動的。也就是即時從庫中的 key 過期了,如果有客戶端訪問從庫時,依然可以得到 key 對應的值,像未過期的鍵值對一樣返回。

從庫的過期鍵處理依靠主服務器控制,主庫在 key 到期時,會在 AOF 文件里增加一條 del 指令,同步到所有的從庫,從庫通過執行這條 del 指令來刪除過期的 key。

6. 小結

本文我們知道了 Redis 中的四種設置過期時間的方式:expire、pexpire、expireat、pexpireat,其中比較常用的是 expire 設置鍵值 n 秒后過期。

字符串中可以在添加鍵值的同時設置過期時間,并可以使用 persist 命令移除過期時間。同時我們也知道了過期鍵在 RDB 寫入和 AOF 重寫時都不會被記錄。

過期鍵在主從模式下,從庫對過期鍵的處理要完全依靠主庫,主庫刪除過期鍵之后會發送 del 命令給所有的從庫。

本文的知識點,如下圖所示:

怎么在 Redis 中實現鍵值過期操作

關于怎么在 Redis 中實現鍵值過期操作就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計5206字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 汽车| 文成县| 泽州县| 丁青县| 中宁县| 册亨县| 高阳县| 辽中县| 泰和县| 赤壁市| 平湖市| 东城区| 平乐县| 阳春市| 和龙市| 房产| 安阳市| 漠河县| 山丹县| 峨眉山市| 璧山县| 奎屯市| 神农架林区| 陆河县| 中阳县| 宜丰县| 宜川县| 密云县| 伊春市| 卢湾区| 沙洋县| 稻城县| 工布江达县| 河津市| 拜泉县| 襄垣县| 寿阳县| 北辰区| 璧山县| 高安市| 涿州市|