婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > redis數據庫查找key在內存中的位置的方法

redis數據庫查找key在內存中的位置的方法

熱門標簽:硅基電話機器人官網 美國地圖標注軟件下載 電話機器人怎么看余額 城市地圖標志怎么標注 漯河電銷回撥外呼系統 長沙外呼系統平臺 怎么修改高德地圖標注 西安電話自動外呼系統 合肥crm外呼系統加盟

一、預先需要了解的知識
1、redis 中的每一個數據庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 數據庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。
2、當redis 服務器初始化時,會預先分配 16 個數據庫(該數量可以通過配置文件配置),所有數據庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇數據庫 select number  時,程序直接通過 redisServer.db[number] 來切換數據庫。有時候當程序需要知道自己是在哪個數據庫時,直接讀取 redisDb.id 即可。
3、既然我們知道一個數據庫的所有鍵值都存儲在redisDb.dict中,那么我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:

復制代碼 代碼如下:
typedef struct dict {

// 特定于類型的處理函數
dictType *type;

// 類型處理函數的私有數據
void *privdata;

// 哈希表(2個)
dictht ht[2];

// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;

// 當前正在運作的安全迭代器數量
int iterators;
} dict;


由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用于存儲數據庫的所有鍵值,而1號哈希表主要用于程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。
4、既然是哈希,那么我們知道就會有哈希碰撞,那么當多個鍵哈希之后為同一個值怎么辦呢?redis采取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表后,如果列表的長度大于1,那么我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。
二、當redis 拿到一個key 時,如果找到該key的位置。
了解了上述知識之后,我們就可以來分析redis如果在內存找到一個key了。
1、當拿到一個key后, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。
2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那么兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用于對數據庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。
3、計算哈希表,根據當前字典與key進行哈希值的計算。
4、根據哈希值與當前字典計算哈希表的索引值。
5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。
6、當 ht[0] 查找完了之后,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。
到此我們就找到了key在內存的中位置了。

您可能感興趣的文章:
  • 淺談redis內存數據的持久化方式
  • 內存型數據庫Redis持久化小結
  • spring結合redis如何實現數據的緩存
  • Redis為什么要存兩次數據

標簽:吉林 商洛 廣西 玉溪 撫順 文山 瀘州 濟源

巨人網絡通訊聲明:本文標題《redis數據庫查找key在內存中的位置的方法》,本文關鍵詞  redis,數據庫,查找,key,在,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《redis數據庫查找key在內存中的位置的方法》相關的同類信息!
  • 本頁收集關于redis數據庫查找key在內存中的位置的方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 乐东| 年辖:市辖区| 安阳市| 望都县| 盐亭县| 平罗县| 博乐市| 郓城县| 资兴市| 米易县| 平谷区| 衡阳市| 阳城县| 德化县| 荥阳市| 旌德县| 南部县| 横山县| 沙坪坝区| 西林县| 乌苏市| 黑龙江省| 高陵县| 青田县| 莱州市| 吴堡县| 应城市| 镇沅| 大渡口区| 聊城市| 专栏| 浮山县| 德保县| 临潭县| 贵德县| 兴国县| 罗田县| 吐鲁番市| 老河口市| 静安区| 衡南县|