日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

redis源码剖析(六)—— Redis 数据库、键过期的实现

發(fā)布時間:2023/11/30 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis源码剖析(六)—— Redis 数据库、键过期的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 數(shù)據(jù)庫的實現(xiàn)
    • 數(shù)據(jù)庫讀寫操作
    • 鍵的過期實現(xiàn)

數(shù)據(jù)庫的實現(xiàn)

我們先看代碼 server.h/redisServer

struct redisServer{...//保存 db 的數(shù)組redisDb *db;//db 的數(shù)量int dbnum;... }

再看redisDb的代碼:

typedef struct redisDb {dict *dict; /* The keyspace for this DB */dict *expires; /* Timeout of keys with a timeout set */dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/dict *ready_keys; /* Blocked keys that received a PUSH */dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */int id; /* Database ID */long long avg_ttl; /* Average TTL, just for stats */ } redisDb;

總體來說redis的 server 包含若干個(默認16個) redisDb 數(shù)據(jù)庫。


Redis 是一個 k-v 存儲的鍵值對數(shù)據(jù)庫。其中字典 dict 保存了數(shù)據(jù)庫中的所有鍵值對,這個地方叫做 keyspace 直譯過來就是“鍵空間”。

所以我們就可以這么認為,在 redisDb 中我們使用 dict(字典)來維護鍵空間。

keyspace 的 key 是數(shù)據(jù)庫的 key,每一個key 是一個字符串對象。注意不是字符串,而是字符串對象。

keyspace 的 value 是數(shù)據(jù)庫的 value,這個 value 可以是 redis 的,字符串對象,列表對象,哈希表對象,集合對象或者有序?qū)ο笾械囊环N。

數(shù)據(jù)庫讀寫操作

所以對于數(shù)據(jù)的增刪改查,就是對 keyspace 這個大 map 的增刪改查。

當我們執(zhí)行:

redis SET mobile "13800000000"
實際上就是為 keyspace 增加了一個 key 是包含字符串“mobile”的字符串對象,value 為包含字符“13800000000”的字符串對象。

看圖:

對于刪改查,沒啥好說的。類似java 的 map 操作,大多數(shù)程序員應(yīng)該都能理解。

需要特別注意的是,再執(zhí)行對鍵的讀寫操作的時候,Redis 還要做一些額外的維護動作:

  • 維護 hit 和 miss 兩個計數(shù)器。用于統(tǒng)計 Redis 的緩存命中率。
  • 更新鍵的 LRU 時間,記錄鍵的最后活躍時間。
  • 如果在讀取的時候發(fā)現(xiàn)鍵已經(jīng)過期,Redis 先刪除這個過期的鍵然后再執(zhí)行余下操作。
  • 如果有客戶對這個鍵執(zhí)行了 WATCH 操作,會把這個鍵標記為 dirty,讓事務(wù)注意到這個鍵已經(jīng)被改過。
  • 沒修改一次 dirty 會增加1。
  • 如果服務(wù)器開啟了數(shù)據(jù)庫通知功能,鍵被修改之后,會按照配置發(fā)送通知。

鍵的過期實現(xiàn)

Redis 作為緩存使用最主要的一個特性就是可以為鍵值對設(shè)置過期時間。

在 Redis 中與過期時間有關(guān)的命令

  • EXPIRE 設(shè)置 key 的存活時間單位秒
  • EXPIREAT 設(shè)置 key 的過期時間點單位秒
  • PEXPIRE 設(shè)置 key 的存活時間單位毫秒
  • PEXPIREAT 設(shè)置 key 的過期時間點單位毫秒

其實這些命令,底層的命令都是由 REXPIREAT 實現(xiàn)的。

在 redisDb 中使用了 dict *expires,來存儲過期時間的。其中 key 指向了 keyspace 中的 key(c 語言中的指針), value 是一個 long long 類型的時間戳,標定這個 key 過期的時間點,單位是毫秒。

如果我們?yōu)樯衔牡?mobile 增加一個過期時間。

redis PEXPIREAT mobile 1521469812000
這個時候就會在過期的 字典中增加一個鍵值對。如下圖:


對于過期的判斷邏輯就很簡單:

  • 在 字典 expires 中 key 是否存在。
  • 如果 key 存在,value 的時間戳是否小于當前系統(tǒng)時間戳。
  • 總結(jié)

    以上是生活随笔為你收集整理的redis源码剖析(六)—— Redis 数据库、键过期的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。