除了前面介紹過的?`type`?、?`encoding`?、?`ptr`?和?`refcount`?四個屬性之外,?`redisObject`?結構包含的最后一個屬性為?`lru`?屬性, 該屬性記錄了對象最后一次被命令程序訪問的時間:
~~~
typedef struct redisObject {
// ...
unsigned lru:22;
// ...
} robj;
~~~
OBJECT IDLETIME?命令可以打印出給定鍵的空轉時長, 這一空轉時長就是通過將當前時間減去鍵的值對象的?`lru`?時間計算得出的:
~~~
redis> SET msg "hello world"
OK
# 等待一小段時間
redis> OBJECT IDLETIME msg
(integer) 20
# 等待一陣子
redis> OBJECT IDLETIME msg
(integer) 180
# 訪問 msg 鍵的值
redis> GET msg
"hello world"
# 鍵處于活躍狀態,空轉時長為 0
redis> OBJECT IDLETIME msg
(integer) 0
~~~
注意
OBJECT IDLETIME?命令的實現是特殊的, 這個命令在訪問鍵的值對象時, 不會修改值對象的?`lru`?屬性。
除了可以被?OBJECT IDLETIME?命令打印出來之外, 鍵的空轉時長還有另外一項作用: 如果服務器打開了?`maxmemory`?選項, 并且服務器用于回收內存的算法為?`volatile-lru`?或者?`allkeys-lru`?, 那么當服務器占用的內存數超過了?`maxmemory`?選項所設置的上限值時, 空轉時長較高的那部分鍵會優先被服務器釋放, 從而回收內存。
配置文件的?`maxmemory`?選項和?`maxmemory-policy`?選項的說明介紹了關于這方面的更多信息。
- 介紹
- 前言
- 致謝
- 簡介
- 第一部分:數據結構與對象
- 簡單動態字符串
- SDS 的定義
- SDS 與 C 字符串的區別
- SDS API
- 重點回顧
- 參考資料
- 鏈表
- 鏈表和鏈表節點的實現
- 鏈表和鏈表節點的 API
- 重點回顧
- 字典
- 字典的實現
- 哈希算法
- 解決鍵沖突
- rehash
- 漸進式 rehash
- 字典 API
- 重點回顧
- 跳躍表
- 跳躍表的實現
- 跳躍表 API
- 重點回顧
- 整數集合
- 整數集合的實現
- 升級
- 升級的好處
- 降級
- 整數集合 API
- 重點回顧
- 壓縮列表
- 壓縮列表的構成
- 壓縮列表節點的構成
- 連鎖更新
- 壓縮列表 API
- 重點回顧
- 對象
- 對象的類型與編碼
- 字符串對象
- 列表對象
- 哈希對象
- 集合對象
- 有序集合對象
- 類型檢查與命令多態
- 內存回收
- 對象共享
- 對象的空轉時長
- 重點回顧
- 第二部分:單機數據庫的實現
- 數據庫
- 數據庫鍵空間
- 重點回顧
- RDB 持久化
- RDB 文件結構
- 重點回顧
- AOF 持久化
- AOF 持久化的實現
- 重點回顧
- 事件
- 文件事件
- 重點回顧
- 參考資料
- 客戶端
- 客戶端屬性
- 重點回顧
- 服務器
- 命令請求的執行過程
- 重點回顧
- 第三部分:多機數據庫的實現
- 復制
- 舊版復制功能的實現
- 重點回顧
- Sentinel
- 啟動并初始化 Sentinel
- 重點回顧
- 參考資料
- 集群
- 節點
- 重點回顧
- 第四部分:獨立功能的實現
- 發布與訂閱
- 頻道的訂閱與退訂
- 重點回顧
- 參考資料
- 事務
- 事務的實現
- 重點回顧
- Lua 腳本
- 創建并修改 Lua 環境
- 重點回顧
- 排序
- SORT <key> 命令的實現
- 重點回顧
- 二進制位數組
- GETBIT 命令的實現
- 重點回顧
- 慢查詢日志
- 慢查詢記錄的保存
- 慢查詢日志的閱覽和刪除
- 添加新日志
- 重點回顧
- 監視器
- 成為監視器
- 向監視器發送命令信息
- 重點回顧
- 源碼、相關資源和勘誤