Redis系列(六):設定/移除鍵的過期時間
阿新 • • 發佈:2020-05-07
本篇部落格是Redis系列的第6篇,主要講解以下內容:
1. 資料庫數量
2. 切換目標資料庫
3. 設定鍵的過期時間
4. 移除鍵的過期時間
本系列的前5篇可以點選以下連結檢視:
[Redis系列(一):Redis簡介及環境安裝](https://www.cnblogs.com/zwwhnly/p/12185696.html)
[Redis系列(二):Redis的5種資料結構及其常用命令](https://www.cnblogs.com/zwwhnly/p/12216550.html)
[Redis系列(三):Redis的持久化機制(RDB、AOF)](https://www.cnblogs.com/zwwhnly/p/12295692.html)
[Redis系列(四):Redis的複製機制(主從複製)](https://www.cnblogs.com/zwwhnly/p/12651527.html)
[Redis系列(五):Redis的過期鍵刪除策略](https://www.cnblogs.com/zwwhnly/p/12689792.html)
## 1. 資料庫數量
預設情況下,Redis伺服器有16個數據庫,分別為db0~db15,如下圖所示:
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_095111.png)
該數量是由配置檔案中的`databases`選項決定的,預設值為16:
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_095637.png)
## 2. 切換目標資料庫
預設情況下,我們執行的命令的目標資料庫是db0,比如我們執行如下命令:
```shell
set message "Hello,Redis"
```
這個鍵值對會儲存在資料庫db0裡,如下圖所示:
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_154340.png)
如果想要切換目標資料庫,可以使用`SELECT`命令,比如切換到db1,可以執行如下命令:
```shell
SELECT 1
```
然後執行如下圖所示的命令:
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_155701.png)
此時該鍵值對會儲存在db1裡,如下圖所示:
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_155913.png)
在實際使用時,建議遵循以下規範:
1. 各個應用使用不同的目標資料庫
2. 1個應用盡量不要操作多個目標資料庫
## 3. 設定/移除鍵的過期時間
Redis提供了7個和key的過期時間相關的命令,分別如下所示:
1. TTL
2. PTTL
3. EXPIRE
4. PEXPIRE
5. EXPIREAT
6. PEXPIREAT
7. PERSIST
接下來詳細講解每個命令的使用方法。
### 3.1 TTL
`TTL`是Time To Live的縮寫,用來檢視某個key的剩餘生存時間,單位為秒。
如果key沒有設定過期時間,返回-1。
如果key不存在,返回-2。
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_170846.png)
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_170733.png)
### 3.2 PTTL
`PTTL`和`TTL`類似,也是用來檢視某個key的剩餘生存時間,但單位為毫秒。
如果key沒有設定過期時間,返回-1。
如果key不存在,返回-2。
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_171617.png)
### 3.3 EXPIRE
`EXPIRE`命令用來給指定的key設定過期時間,單位為秒。
如果過期時間設定成功,返回1。
如果key不存在,返回0。
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_174218.png)
### 3.4 PEXPIRE
`PEXPIRE`與`EXPIRE`類似,也是用來給指定的key設定過期時間,但單位為毫秒。
如果過期時間設定成功,返回1。
如果key不存在,返回0。
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_174909.png)
### 3.5 EXPIREAT
`EXPIREAT`命令用來給指定的key設定過期時間,但指定的是某個時間點**秒數**的UNIX時間戳。
如果過期時間設定成功,返回1。
如果key不存在,返回0。
可以使用如下Java程式碼獲取秒數的時間戳:
```java
System.out.println(LocalDateTime.now().plusMinutes(2).toEpochSecond(ZoneOffset.ofHours(8)));
```
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_183235.png)
### 3.6 PEXPIREAT
`PEXPIREAT`與`EXPIREAT`類似,用來給指定的key設定過期時間,但指定的是點**毫秒數**的UNIX時間戳。
如果過期時間設定成功,返回1。
如果key不存在,返回0。
可以使用如下Java程式碼獲取毫秒數的時間戳:
```
System.out.println(System.currentTimeMillis());
System.out.println(LocalDateTime.now().plusMinutes(2).toInstant(ZoneOffset.ofHours(8)).toEpochMilli());
```
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200506_194343.png)
### 3.7 PERSIST
`PERSIST`命令用來移除指定key的過期時間。
如果過期時間移除成功,返回1。
如果key不存在或者key沒有設定過期時間,返回0。
![](https://images.zwwhnly.com/picture/2020/05/snipaste_20200507_094005.png)
## 4. 原始碼及參考
黃健巨集 《Redis設計與實現》
[https://redis.io/commands](https://redis.io/commands)
> 我是一名奮鬥在上海的程式設計師,如果有興趣,歡迎新增我的個人微信(個人主頁上有我的微信),一起交個