亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis中鍵值過(guò)期操作示例詳解

 更新時(shí)間:2019年11月14日 08:38:11   作者:王磊的博客  
這篇文章主要給大家介紹了關(guān)于Redis中鍵值過(guò)期操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.過(guò)期設(shè)置

Redis 中設(shè)置過(guò)期時(shí)間主要通過(guò)以下四種方式:

  • expire key seconds:設(shè)置 key 在 n 秒后過(guò)期;
  • pexpire key milliseconds:設(shè)置 key 在 n 毫秒后過(guò)期;
  • expireat key timestamp:設(shè)置 key 在某個(gè)時(shí)間戳(精確到秒)之后過(guò)期;
  • pexpireat key millisecondsTimestamp:設(shè)置 key 在某個(gè)時(shí)間戳(精確到毫秒)之后過(guò)期;

下面分別來(lái)看以上這些命令的具體實(shí)現(xiàn)。

1)expire:N 秒后過(guò)期

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

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

2)pexpire:N 毫秒后過(guò)期

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

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

3)expireat:過(guò)期時(shí)間戳精確到秒

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

其中 expireat key3 1573472683 表示 key3 在時(shí)間戳 1573472683 后過(guò)期(精確到秒),使用 ttl 查詢可以發(fā)現(xiàn)在 67s 后 key3 會(huì)過(guò)期。

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

4)pexpireat:過(guò)期時(shí)間戳精確到毫秒

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

其中 pexpireat key4 1573472683000 表示 key4 在時(shí)間戳 1573472683000 后過(guò)期(精確到毫秒),使用 ttl 查詢可以發(fā)現(xiàn)在 3522ms 后 key4 會(huì)過(guò)期。

5)字符串中的過(guò)期操作

字符串中幾個(gè)直接操作過(guò)期時(shí)間的方法,如下列表:

  • set key value ex seconds:設(shè)置鍵值對(duì)的同時(shí)指定過(guò)期時(shí)間(精確到秒);
  • set key value ex milliseconds:設(shè)置鍵值對(duì)的同時(shí)指定過(guò)期時(shí)間(精確到毫秒);
  • setex key seconds valule:設(shè)置鍵值對(duì)的同時(shí)指定過(guò)期時(shí)間(精確到秒)。

實(shí)現(xiàn)示例如下:

① set key value ex seconds

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

② set key value ex milliseconds

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

③ setex key seconds valule

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

2.移除過(guò)期時(shí)間

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

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 會(huì)在 97s 后過(guò)期,當(dāng)使用了 persist 命令之后,在查詢 k3 的存活時(shí)間發(fā)現(xiàn)結(jié)果是 -1,它表示 k3 永不過(guò)期。

3.Java實(shí)現(xiàn)過(guò)期操作

本文將使用 Jedis 框架來(lái)實(shí)現(xiàn)對(duì) Redis 過(guò)期時(shí)間的操作,如下代碼所示:

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

程序的執(zhí)行結(jié)果為:

過(guò)期時(shí)間:-1
執(zhí)行 expire 后的 TTL=99

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

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

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

更多過(guò)期操作方法,如下列表:

  • pexpire(String key, long milliseconds):設(shè)置 n 毫秒后過(guò)期;
  • expireAt(String key, long unixTime):設(shè)置某個(gè)時(shí)間戳后過(guò)期(精確到秒);
  • pexpireAt(String key, long millisecondsTimestamp):設(shè)置某個(gè)時(shí)間戳后過(guò)期(精確到毫秒);
  • persist(String key):移除過(guò)期時(shí)間。

完整示例代碼如下:

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

4.持久化中的過(guò)期鍵

上面我們講了過(guò)期鍵在 Redis 正常運(yùn)行中一些使用案例,接下來(lái),我們來(lái)看 Redis 在持久化的過(guò)程中是如何處理過(guò)期鍵的。

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

1)RDB中的過(guò)期鍵

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

① RDB 文件生成

從內(nèi)存狀態(tài)持久化成 RDB(文件)的時(shí)候,會(huì)對(duì) key 進(jìn)行過(guò)期檢查,過(guò)期的鍵不會(huì)被保存到新的 RDB 文件中,因此 Redis 中的過(guò)期鍵不會(huì)對(duì)生成新 RDB 文件產(chǎn)生任何影響。

② RDB 文件加載

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

  • 如果 Redis 是主服務(wù)器運(yùn)行模式的話,在載入 RDB 文件時(shí),程序會(huì)對(duì)文件中保存的鍵進(jìn)行檢查,過(guò)期鍵不會(huì)被載入到數(shù)據(jù)庫(kù)中。所以過(guò)期鍵不會(huì)對(duì)載入 RDB 文件的主服務(wù)器造成影響;
  • 如果 Redis 是從服務(wù)器運(yùn)行模式的話,在載入 RDB 文件時(shí),不論鍵是否過(guò)期都會(huì)被載入到數(shù)據(jù)庫(kù)中。但由于主從服務(wù)器在進(jìn)行數(shù)據(jù)同步時(shí),從服務(wù)器的數(shù)據(jù)會(huì)被清空。所以一般來(lái)說(shuō),過(guò)期鍵對(duì)載入 RDB 文件的從服務(wù)器也不會(huì)造成影響。

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

/* 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. 
*
* 如果服務(wù)器為主節(jié)點(diǎn)的話,
* 那么在鍵已經(jīng)過(guò)期的時(shí)候,不再將它們關(guān)聯(lián)到數(shù)據(jù)庫(kù)中去
*/
if (server.masterhost == NULL && expiretime != -1 && expiretime < now) {
 decrRefCount(key);
 decrRefCount(val);
 // 跳過(guò)
 continue;
}

2)AOF中的過(guò)期鍵

① AOF 文件寫入

當(dāng) Redis 以 AOF 模式持久化時(shí),如果數(shù)據(jù)庫(kù)某個(gè)過(guò)期鍵還沒(méi)被刪除,那么 AOF 文件會(huì)保留此過(guò)期鍵,當(dāng)此過(guò)期鍵被刪除后,Redis 會(huì)向 AOF 文件追加一條 DEL 命令來(lái)顯式地刪除該鍵值。

② AOF 重寫

執(zhí)行 AOF 重寫時(shí),會(huì)對(duì) Redis 中的鍵值對(duì)進(jìn)行檢查已過(guò)期的鍵不會(huì)被保存到重寫后的 AOF 文件中,因此不會(huì)對(duì) AOF 重寫造成任何影響。

5.主從庫(kù)的過(guò)期鍵

當(dāng) Redis 運(yùn)行在主從模式下時(shí),從庫(kù)不會(huì)進(jìn)行過(guò)期掃描,從庫(kù)對(duì)過(guò)期的處理是被動(dòng)的。也就是即時(shí)從庫(kù)中的 key 過(guò)期了,如果有客戶端訪問(wèn)從庫(kù)時(shí),依然可以得到 key 對(duì)應(yīng)的值,像未過(guò)期的鍵值對(duì)一樣返回。

從庫(kù)的過(guò)期鍵處理依靠主服務(wù)器控制,主庫(kù)在 key 到期時(shí),會(huì)在 AOF 文件里增加一條 del 指令,同步到所有的從庫(kù),從庫(kù)通過(guò)執(zhí)行這條 del 指令來(lái)刪除過(guò)期的 key。

6.小結(jié)

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

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

過(guò)期鍵在主從模式下,從庫(kù)對(duì)過(guò)期鍵的處理要完全依靠主庫(kù),主庫(kù)刪除過(guò)期鍵之后會(huì)發(fā)送 del 命令給所有的從庫(kù)。

本文的知識(shí)點(diǎn),如下圖所示:

7.引用&鳴謝

http://chabaoo.cn/article/174204.htm

http://chabaoo.cn/article/174207.htm

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Redis+Caffeine實(shí)現(xiàn)分布式二級(jí)緩存組件實(shí)戰(zhàn)教程

    Redis+Caffeine實(shí)現(xiàn)分布式二級(jí)緩存組件實(shí)戰(zhàn)教程

    這篇文章主要介紹了Redis+Caffeine實(shí)現(xiàn)分布式二級(jí)緩存組件實(shí)戰(zhàn)教程,介紹了分布式二級(jí)緩存的優(yōu)勢(shì),使用組件的方法,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 淺談Redis存儲(chǔ)數(shù)據(jù)類型及存取值方法

    淺談Redis存儲(chǔ)數(shù)據(jù)類型及存取值方法

    這篇文章主要介紹了淺談Redis存儲(chǔ)數(shù)據(jù)類型及存取值方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • redis常用命令小結(jié)

    redis常用命令小結(jié)

    這篇文章主要介紹了redis的一些常用命令,需要的朋友可以參考下
    2014-06-06
  • Redis分布式鎖及4種常見(jiàn)實(shí)現(xiàn)方法

    Redis分布式鎖及4種常見(jiàn)實(shí)現(xiàn)方法

    本文主要介紹了Redis分布式鎖及4種常見(jiàn)實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Redis 內(nèi)存碎片原因及清理

    Redis 內(nèi)存碎片原因及清理

    內(nèi)存碎片是指在內(nèi)存分配的時(shí)候,產(chǎn)生的不能重復(fù)利用的空間,本文主要介紹了Redis 內(nèi)存碎片原因及清理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Redis?Brpop?命令作用詳解

    Redis?Brpop?命令作用詳解

    BRPOP?是一個(gè)阻塞的列表彈出原語(yǔ),該命令會(huì)按照給出的?key?順序查看?list,并在找到的第一個(gè)非空?list?的尾部彈出一個(gè)元素,今天通過(guò)本文給大家介紹Redis?Brpop?命令相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-07-07
  • Redis教程(九):主從復(fù)制配置實(shí)例

    Redis教程(九):主從復(fù)制配置實(shí)例

    這篇文章主要介紹了Redis教程(九):主從復(fù)制配置實(shí)例,本文講解了Redis的Replication、Replication的工作原理、如何配置Replication、應(yīng)用示例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Redis Cluster集群主從切換的踩坑與填坑

    Redis Cluster集群主從切換的踩坑與填坑

    這篇文章主要介紹了Redis Cluster集群主從切換的踩坑與填坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Redisson分布式鎖之加解鎖詳解

    Redisson分布式鎖之加解鎖詳解

    這篇文章主要為大家介紹了Redisson分布式鎖加解鎖的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Redis有序集合類型的操作_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Redis有序集合類型的操作_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    今天通過(guò)本文給大家說(shuō)一下Redis中最后一個(gè)數(shù)據(jù)類型 “有序集合類型”,需要的的朋友參考下吧
    2017-08-08

最新評(píng)論