1. 程式人生 > >Redis內部原理簡介

Redis內部原理簡介

知道了Redis的各種資料結構,物件結構,那麼Redis是如何儲存資料的,又是如何操作資料的呢,Redis裡面的命令是怎麼實現的呢?這一系列問題值得我們思考

一.Redis維護多個數據庫

Redis內部維護一個db陣列,每個db都是一個數據庫,預設情況下Redis會建立16個數據庫。我們可以通過select命令來切換資料庫,如select1切換到資料庫號為1的資料庫。select實現是通過修改客戶端的db指標,通過指標指向不同的資料庫來實現資料庫的切換操作的。

需要注意的是,為了不造成操作資料庫號錯誤,最好執行命令之前,手動select一下資料庫。

二.資料庫鍵空間

Redis是一個鍵值對資料庫伺服器,Redis通過字典儲存了資料庫中的所有鍵值對,我們將這個字典稱為鍵空間。鍵空間的每個鍵都是一個字串物件,鍵空間的值也就是資料庫的值,可以是字串物件,列表物件,雜湊表物件,集合物件,有序集合物件中的任何一種。

1.新增新鍵

每次新增一個新鍵就是將一個新鍵值對新增到鍵空間裡面,其中鍵為字串物件,值為任意一種型別的Redis物件。

2.刪除鍵

刪除鍵就是在鍵空間裡刪除鍵所對應的鍵值對物件。

3.更新鍵

更新鍵就是對鍵空間裡面鍵所對應的值物件進行更新。

4.查詢鍵

查詢鍵就是在鍵空間中取出鍵所對應的值物件。

每次在鍵空間讀取一個鍵之後,伺服器會更新鍵的LRU時間,用於計算鍵的閒置時間。如果伺服器在讀取一個鍵時發現該鍵已經過期,那麼伺服器會先刪除這個過期鍵,然後才執行後續操作。如果有客戶端使用watch命令監視了某個鍵,那麼伺服器在對被監視的鍵進行修改之後,會將這個鍵標記為dirty,從而讓事務注意到這個鍵被修改過。伺服器每次修改一個鍵之後,都會對鍵計數器的值+1,這個計數器用來觸發伺服器的持久化操作。如果伺服器開啟了資料庫通知功能,那麼在對鍵進行修改之後,伺服器將按配置傳送相應的資料庫通知。

三.設定鍵的生存時間和過期時間

我們知道expire命令或者pexpire命令可以對一個鍵設定生存時間,經過指定的時間之後,伺服器會自動刪除生存時間為0的鍵。那麼Redis是如何實現刪除過期鍵的操作的呢?

Redis有四個命令可以設定鍵的過期時間,包括expire,pexpire,expireat,pexpireat,不過這四個命令最後都會轉化成pexpireat命令來實現。

Redis使用一個過期字典記錄所有帶過期時間的鍵,字典的鍵指向鍵空間中的某個鍵物件,字典的值是一個longlong型別的整數,這個證書儲存了鍵空間所指向的資料庫鍵的過期時間。通過過期字典,程式可以檢查一個給定鍵是否過期,檢查給定鍵是否存在於過期字典,如果存在,取得鍵的過期時間,檢查當前時間戳是否大於鍵的過期時間,如果是的話,鍵已經過期,否則鍵未過期。

四.過期鍵的刪除策略

如果一個鍵過期了,那麼它什麼時候被刪除呢?通常我們可以用三種刪除策略刪除過期鍵

1.定時刪除:在設定鍵過期時間的同時,建立一個定時器,讓定時器在鍵的過期時間來臨時,刪除鍵

2.惰性刪除:放任鍵過期不管,但是每次動鍵空間獲取鍵時,都會檢查鍵是否過期,如果過期,則刪除。

3.定期刪除:每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。

這幾種方式各有利有弊,首先定時刪除對記憶體最友好,當一個鍵過期時,一定會刪除這個鍵,釋放記憶體。不過定時刪除對CPU最不友好,在過期鍵比較多的情況下,刪除過期鍵這一行為可能會佔用相當一部分CPU時間。此外,建立定時器需要用到Redis伺服器中的時間時間,而當前時間時間的實現方式-無序連結串列查詢一個事件的時間複雜度為O(N),不能高效地處理大量時間事件。

惰性刪除策略對CPU是最友好的,但是對記憶體最不友好。如果一個鍵已經過期,這個鍵又保留在資料庫中,那麼記憶體就會一直佔用不釋放。

定期刪除算是前兩種策略的一種整合和折中,定期策略每隔一段時間執行一次刪除過期鍵操作,並通過限制刪除操作執行的時長和頻率減少刪除操作對CPU時間的影響。定期刪除過期鍵可以有效地減少因為過期鍵帶來的記憶體浪費。

Redis過期鍵的刪除使用惰性刪除和定期刪除兩種策略配合使用。惰性策略比較好理解,所有讀寫資料庫的命令執行之前都會對輸入鍵進行檢查,如果鍵過期,那麼從資料庫中刪除鍵。定期刪除策略的實現由Redis的serverCron函式來執行,這個函式每100ms執行一次,它在規定的時間內,分多次遍歷伺服器中的各個資料庫,從資料庫的expires字典中隨機檢查一部分鍵的過期時間,刪除其中的過期鍵。

五.複製功能對過期鍵的處理

Redis複製主要包括RDB複製和AOF複製,在RDB複製中,每次執行SAVE或BGSAVE命令建立一個新的RDB檔案時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被儲存到新建立的RDB檔案中。載入RDB檔案時,伺服器也會對儲存的鍵進行檢查,如果鍵已過期,則不會載入。當使用AOF持久化模式執行時,當過期鍵被惰性刪除或者定期刪除之後,程式會向AOF檔案追加一條刪除命令,記錄鍵已被刪除。

相關推薦

Redis內部原理簡介

知道了Redis的各種資料結構,物件結構,那麼Redis是如何儲存資料的,又是如何操作資料的呢,Redis裡面的命令是怎麼實現的呢?這一系列問題值得我們思考一.Redis維護多個數據庫Redis內部維護一個db陣列,每個db都是一個數據庫,預設情況下Redis會建立16個數據

Redis內部原理

redis預設建立16個數據庫,通過select語句可以切換資料庫,如 select 2 可用通過expire命令或者pexpire命令,以秒或毫秒精度為資料庫中的某個鍵設定生存時間,到期後伺服器自動刪除鍵 set key value

Hbase(五) hbase內部原理

當前 times filter 提高 恢復 數據 是否 最後一行 地址 一、系統架構 客戶端連接hbase依賴於zookeeper,hbase存儲依賴於hadoop client: 1、包含訪問 hbase 的接口, client 維護著一些 cache(

redis使用場景 簡介

-s edi select time 關註 寫入 部分 更新 header 1. 使用場景說明1.2. 排行榜1.4. 記錄用戶判定信息1.6. 緩存1.8. 會話緩存

2-2 搜索引擎工作原理簡介

搜索引擎 搜索結果 工作原理 數據庫 搜索引擎的工作過程大體上可以分成三個階段:1、爬行和抓取:搜索引擎蜘蛛通過跟蹤鏈接訪問網頁,獲得頁面HTML代碼存入數據庫。(1)蜘蛛(2)跟蹤鏈接(3)吸引蜘蛛(4)地址庫(5)文件存儲(6)爬行時的復制內容檢測2、預處理:索引程序對抓取來的頁面數據進行

JVM 內部原理

sig 計算 jvm tar java lan 操作 本地 follow 1、JVM的組成: JVM 由類加載器子系統、運行時數據區、執行引擎以及本地方法接口組成。 2、JVM的運行原理: JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種

第十三章 redis-cluster原理

執行命令 shm 擴容 一段時間 本地 集群 端口號 保存 ron 一、基本定義 虛擬槽slot分區算法,優點是擴容縮容簡單:直接把slot及每個slot上的數據進行縮放即可 redis定義了0-16383(總共為16384個slot,即214個slot) slot會均勻

Storm集群上的開發 ,Storm的內部原理,storm提交任務的過程 (八)

啟動 監控 task 技術 自己 storm集群 src images nbsp storm提交任務的過程: 1.客戶端通過storm提交topology 2.nimbus主節點創建本地topology任務目錄。tmp 3.nimbus監控zookeeper心跳,計算工作量

Kerberos認證原理簡介

保存 得到 code rim 網絡上傳 驗證 rust cache 透明 1.1 What is Kerberos 1.1.1 簡單介紹  Kerberos是一個用於鑒定身份(authentication)的協議, 它采取對稱密鑰加密(symmetric-key crypt

Redis Sentinel 模式簡介

toolbar tables 新的 dir tab 官方 timeout entos 疑問 Redis-Sentinel是官方推薦的高可用解決方案,當redis在做master-slave的高可用方案時,假如master宕機 了,redis本身(以及其很多客戶端)都沒有實現

TransactionScope 的基本原理簡介

eve this 其中 但是 created alt cap link inf C# 的事務編程 1 Db事務 DbConnection 中創建基於當前連接的 DbTransaction 2 使用TransactionScope ,創建環境事務 一

java泛型 泛型的內部原理:類型擦除以及類型擦除帶來的問題

st2 往裏面 避免 我們 lar 屬於 util get 驚奇 一、Java泛型的實現方法:類型擦除 前面已經說了,Java的泛型是偽泛型。為什麽說Java的泛型是偽泛型呢?因為,在編譯期間,所有的泛型信息都會被擦除掉。正確理解泛型概念的首要前提是理解類型擦出(type

(HA)DRBD原理簡介到實戰配置

分布式 mfs 系統 前言:先把DRBD高可用大概的寫一下,後面再引入分布式系統與DRBDR相結合更加明顯凸顯他們各自實現的功能,從而整體體現出相對比較可靠(穩定)的狀態。一、DRBD簡介 1、DRBD是啥、能幹啥? DRBD全稱::Distributed ReplicatedBl

MyBatis原理簡介和小試牛刀

batis dao 讀取 區別 ons 目的 ktr als config 在我看來mybatis的原理與hibernate在某些方面是一致的,先回顧一下Hibernate原理(原理主要上是要掌握並理解下列六個對象: Hibernate中重要的六個對象: Configura

Printk原理簡介

sylixosC語言函數可變參數的原理可變參數函數原型Printk函數原型如程序清單 1.1所示:程序清單 1.1int printk(const char *fmt, ...);從printk函數原型可知,printk除了接收一個固定參數fmt外,後面的參數用...表示。在C/C++語言中,...表示可以接

Android內核三大核心功能之一AMS內部原理

tasks tro com one 分析 itl dac chmod 重要 上面類是AmS的全稱,另外兩大核心功能是WindowManagerService.java和View.java AmS提供的主要功能: 統一調度各應用程序 內存管理 進程管理 AmS中定

分布式文檔系統_document查詢內部原理

沒有 OS coord 負載均衡 請求 其他 pri 過程 nod 1、客戶端發送請求到任意一個node,成為coordinate node2、coordinate node對document進行路由,將請求轉發到對應的node,此時會使用round-robin隨機輪詢算法

html原理簡介、第一個網頁服務器與客戶端

直接 ack 字符 time() true nec utf-8 RM 成了 #coding=utf-8 """ HTML: 20個標簽 一套瀏覽器認識的規則 學習規則。開發後臺程序:寫html文件 本地測試:找到文件直接雙擊打

數字簽名原理簡介(附數字證書)

的人 提高效率 接收消息 沒有 一個 mage tro 這就是 div http://www.cnblogs.com/kingsleylam/p/4985571.html 首先要了解什麽叫對稱加密和非對稱加密,消息摘要這些知識。 1. 非對稱加密 在通信雙方,

Base64原理簡介

圖片 colspan 字節 結果 AR byte[] cin sco strong Base64是一種編碼方式,通常用於將二進制數據轉換成可見字符的形式,該過程可逆。 過程大致如下: 1. 對64個可見字符,進行一個索引編碼。索引是二進制的值,對應找到一個可見字符。