中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

如何理解Redis數據庫、鍵過期的實現

如何理解redis數據庫、鍵過期的實現,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

創新互聯建站2013年至今,是專業互聯網技術服務公司,擁有項目成都網站設計、網站制作、外貿營銷網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元那曲做網站,已為上家服務,為那曲各地企業和個人服務,聯系電話:18980820575

數據庫的實現

我們先看代碼 server.h/redisServer

struct redisServer{
    ...
   //保存 db 的數組
   redisDb *db;
   
   //db 的數量
   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 數據庫。

如何理解Redis數據庫、鍵過期的實現

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

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

  • keyspace 的 kay 是數據庫的 key,每一個key 是一個字符串對象。注意不是字符串,而是字符串對象。

  • keyspace 的 value 是數據庫的 value,這個 value 可以是 redis 的,字符串對象,列表對象,哈希表對象,集合對象或者有序對象中的一種。

數據庫讀寫操作

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

當我們執行:

>redis SET mobile "13800000000"

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

看圖:

如何理解Redis數據庫、鍵過期的實現

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

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

  • 維護 hit 和 miss 兩個計數器。用于統計 Redis 的緩存命中率。

  • 更新鍵的 LRU 時間,記錄鍵的最后活躍時間。

  • 如果在讀取的時候發現鍵已經過期,Redis 先刪除這個過期的鍵然后再執行余下操作。

  • 如果有客戶對這個鍵執行了 WATCH 操作,會把這個鍵標記為 dirty,讓事務注意到這個鍵已經被改過。

  • 沒修改一次 dirty 會增加1。

  • 如果服務器開啟了數據庫通知功能,鍵被修改之后,會按照配置發送通知。

鍵的過期實現

Redis 作為緩存使用最主要的一個特性就是可以為鍵值對設置過期時間。就看看 Redis 是如果實現這一個最重要的特性的?

在 Redis 中與過期時間有關的命令

  • EXPIRE 設置 key 的存活時間單位秒

  • EXPIREAT 設置 key 的過期時間點單位秒

  • PEXPIRE 設置 key 的存活時間單位毫秒

  • PEXPIREAT 設置 key 的過期時間點單位毫秒

其實這些命令,底層的命令都是由 REXPIREAT 實現的。

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

如果我們為上文的 mobile 增加一個過期時間。

>redis PEXPIREAT mobile 1521469812000

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

如何理解Redis數據庫、鍵過期的實現

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

  1. 在 字典 expires 中 key 是否存在。

  2. 如果 key 存在,value 的時間戳是否小于當前系統時間戳。

接下來就需要討論一下過期的鍵的刪除策略。

key的刪除有三種策略:

  1. 定時刪除,Redis定時的刪除內存里面所有過期的鍵值對,這樣能夠保證內存友好,過期的key都會被刪除,但是如果key的數量很多,一次刪除需要CPU運算,CPU不友好。

  2. 惰性刪除,只有 key 在被調用的時候才去檢查鍵值對是否過期,但是會造成內存中存儲大量的過期鍵值對,內存不友好,但是極大的減輕CPU 的負擔。

  3. 定時部分刪除,Redis定時掃描過期鍵,但是只刪除部分,至于刪除多少鍵,根據當前 Redis 的狀態決定。

這三種策略就是對時間和空間有不同的傾向。Redis為了平衡時間和空間,采用了后兩種策略 惰性刪除和定時部分刪除。

惰性刪除比較簡單,不做過多介紹。主要討論一下定時部分刪除。

過期鍵的定時刪除的策略由 expire.c/activeExpireCycle() 函數實現,server.c/serverCron() 定時的調用 activieExpireCycle() 。

activeExpireCycle 的大的操作原則是,如果過期的key比較少,則刪除key的數量也比較保守,如果,過期的鍵多,刪除key的策略就會很激進。

static unsigned int current_db = 0; /* Last DB tested. */
static int timelimit_exit = 0;      /* Time limit hit in previous call? */
static long long last_fast_cycle = 0; /* When last fast cycle ran. */
  • 首先三個 static 全局參數分別記錄目前遍歷的 db下標,上一次刪除是否是超時退出的,上一次快速操作是什么時候進行的。

  • 計算 timelimit = 1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/server.hz/100; 可以理解為 25% 的 cpu 時間。

  • 如果 db 中 expire 的大小為0 不操作

  • expire 占總 key 小于 1% 不操作

  • num = dictSize(db->expires);num 是 expire 使用的key的數量。

  • slots = dictSlots(db->expires); slots 是 expire 字典的尺寸大小。

  • 已使用的key(num) 大于 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 則設置為 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP。也就是說每次只檢查 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 個鍵。

  • 隨機獲取帶過期的 key。計算是否過期,如果過期就刪除。

  • 然后各種統計,包括刪除鍵的次數,平均過期時間。

  • 每遍歷十六次,計算操作時間,如果超過 timelimit 結束返回。

  • 如果刪除的過期鍵大于 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 的 1\4 就跳出循環,結束。

步驟比較復雜,總結一下:(這里都是以默認配置描述)

  1. redis 會用最多 25% 的 cpu 時間處理鍵的過期。

  2. 遍歷所有的 redisDb

  3. 在每個 redisDb 中如果數據中沒有過期鍵或者過期鍵比例過低就直接進入下一個 redisDb。

  4. 否則,遍歷 redisDb 中的過期鍵,如果刪除的鍵達到有過期時間的的key 的25% ,或者操作時間大于 cpu 時間的 25% 就結束當前循環,進入下一個redisDb。

看完上述內容,你們掌握如何理解Redis數據庫、鍵過期的實現的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!

當前名稱:如何理解Redis數據庫、鍵過期的實現
本文路徑:http://www.2m8n56k.cn/article2/gpoeoc.html

成都網站建設公司_創新互聯,為您提供企業建站標簽優化、域名注冊、虛擬主機、ChatGPT、網頁設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
主站蜘蛛池模板: 91久久精品国产免费一区 | 国产精品亚洲二线在线播放 | 九九在线精品视频播放 | 国产精品日本一区二区在线播放 | 欧美精品三级在线 | 末成年娇小性色xxxxx | 小泽玛利亚的一级毛片的 | 成人首页 | 久久久久欧美精品观看 | 99精彩视频在线观看 | 亚洲自偷自偷图片在线高清 | 日本韩国三级在线观看 | 在线免费观看日本视频 | 中文字幕日韩国产 | 成人精品免费视频 | 日本免费不卡在线一区二区三区 | 狠狠色丁香久久综合网 | 一区二区三区久久精品 | 欧美一级毛片一免费 | 日韩城人视频 | 美女被躁免费视频软件 | 白嫩美女一级毛片免费看 | 午夜性爽视频男人的天堂在线 | 亚洲精品高清久久 | 最新国产精品亚洲二区 | 精品国产午夜久久久久九九 | 成人亚洲精品7777 | 亚洲一区视频 | 国产日韩精品视频一区二区三区 | 成人精品一区二区不卡视频 | 亚洲一区二区三区香蕉 | 九草网| 亚洲一区视频在线 | 一区二区网站在线观看 | aaaaaa精品视频在线观看 | 午夜一区二区福利视频在线 | 成人毛片免费观看视频在线 | 欧美日韩一区二区综合在线视频 | 欧美兽皇video | 亚洲精品久久久久综合91 | 国产精品99久久久久久小说 |