Redis中的數據對象

来源:http://www.cnblogs.com/leriou/archive/2017/06/24/7072543.html
-Advertisement-
Play Games

redis對象 redis中有五種常用對象 我們所說的對象的類型大多是值的類型,鍵的類型大多是字元串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的 redisObject的結構如下 type的可選值有五種.分別是 REDIS_STRING, REDIS_LIST, R ...


redis對象

redis中有五種常用對象

我們所說的對象的類型大多是值的類型,鍵的類型大多是字元串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的

redisObject的結構如下

typedef struct redisObject {
    unsigned type:4; //類型 有五種,分別對應五種常見的值類型
    unsigned encoding:4; // 編碼,標明底層數據結構的類型
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits decreas time). */
    int refcount; //引用計數
    void *ptr;// 存儲結構指針
} robj;

type的可選值有五種.分別是

REDIS_STRING,
REDIS_LIST,
REDIS_SET,
REDIS_ZSET ,
REDIS_HASH

encoding的可選值有八種

REDIS_ENCODING_INT long型的整數
REDIS_ENCODING_EMBSTR embstr編碼的簡單動態字元串
REDIS_ENCODING_ROW 簡單動態字元串
REDIS_ENCODING_LINKEDLIST 雙端鏈表
REDIS_ENCODING_HH 字典
REDIS_ENCODING_ZIPLIST 壓縮列表
REDIS_ENCODING_INTSET 整數集合
REDIS_ENCODING_SKIPLIST 跳躍表

type和encoding共同決定了數值對象的底層結構和存儲

字元串對象

字元串對象的編碼可以是int,embstr和row

redis中的字元串對象是最常用的數據對象之一,redis中的許多鍵都是採用的字元串對象

字元串類型在redis中根據情況不同有3中情況

  1. 對於元素都是純數字類型的, 例如,'1','2'這種會使用int類型存儲,redis預設初始化了10000個數字對象
  2. 對於長度小於32的字元串類型,例如'hello',redis會使用embstr類型存儲數據
  3. 對於長度超過32的使用row存儲原字元

ps: embstr類型的字元串在修改後總會變成row編碼類型

列表

列表的編碼可以是linkedlist或者ziplist

  1. 當列表對象保存的所有字元串長度小於64位元組
  2. 當列表對象保存的元素數量小於512個的時候

這個時候會使用,ziplist來作為列表對象的編碼, 當不滿足這兩個條件的時候使用linkedlist

ps:這兩個值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries

哈希對象

哈希對象的編碼可以是ziplist或者hashtable

字典的每一個鍵和值都是一個字元串對象

  1. 哈希對象保存的所有鍵和值的長度都小於64位元組
  2. 哈希對象保存的鍵值對數量小於512個的時候

滿足以上兩個條件,使用ziplist存儲,否則採用hashtable存儲

ps:這兩個值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries

集合

集合對象的編碼可以是intset或者hashtable

當集合對象滿足以下兩個條件的時候採用intset

  1. 集合對象保存的元素都是整數
  2. 集合對象保存的元素數量不超過512個

不滿足以上兩個條件都是用hashtable存儲

ps: 該數值可以使用set-max-intset-entries設置

有序集合

有序集合對象的編碼可以是ziplist或者skiplist

有序集合對象跟前面的幾個對象不大一樣

typedef struct zset{
    zskiplist *zsl;
    dict *dict;
} zset;

zsl中保存一個跳躍表,表節點的對象即使鍵,score即是分值,該結構主要為 zrange,zrank等函數服務

同時還保存一個dict,dict中也保存有鍵和對應的分值,獲取某鍵的函數zscore使用這個結構,

同時持有字典和跳躍表是為了性能考慮

當有序集合滿足一下兩個條件時候,使用ziplist編碼

  1. 有序集合元素數量小於128
  2. 有序集合元素長度小於64

不能滿足以上兩個條件的使用skiplist

回收

redis的對象資源垃圾回收是基於引用計數

當一個對象被使用一次,引用計數增加1

當一個引用被銷毀,對象的引用計數會減1

當一個對象的引用計數為0,會被銷毀

對象共用

redis預設創建了0到9999的數字對象供1萬個

其他用到這些對象的時候可以不用創建新對象,直接使用已有的對象


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android提供NDK開發包來提供Android平臺的C++開發,用來擴展Android SDK的功能。主要包括Android NDK構建系統和JNI實現與原生代碼通信兩部分。 一、Android NDK構建系統 1.1 構建庫 Android NDK的構建系統是基於GNU Make的。Andro ...
  • 本文轉自:[FFmpeg 入門(1):截取視頻幀 | www.samirchen.com][2] 背景 在 Mac OS 上如果要運行教程中的相關代碼需要先安裝 FFmpeg,建議使用 brew 來安裝: 或者你可以參考[在 Mac OS 上編譯 FFmpeg][5]使用源碼編譯和安裝 FFmpeg ...
  • 本文轉自:[AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com][2] 本文內容主要來源於 [Responding to Interruptions][3]。 當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放 ...
  • 本文轉自:[AVAudioSession(3):定製 Audio Session 的 Category | www.samirchen.com][2] 本文內容主要來源於 [Working with Categories][3]。 對於 Audio Session 來說,與之對應的 Category ...
  • 平時開發系統時偶爾會遇到數據超長導致往資料庫中保存時出錯。 使用下邊的腳本可以方便的找出超長的欄位。 1.通過正式表創建臨時表,修改臨時表中varchar、nvarchar的長度為max 2.數據手動寫入臨時表後,查找超長欄位 3.新建測試表 表截圖如下: 修改表名,運行 1.通過正式表創建臨時表, ...
  • 最近開發中遇到的一個MySQL主從延遲的坑,記錄並總結,避免再次犯同樣的錯誤。 ...
  • 大多數用戶在對於磁碟進行分區的時候都是習慣性的不給系統盤預留很大空間,其實這並不是一個好習慣。因為系統分區並不像我們想象的那樣會僅僅安裝一個操作系統,系統分區多數還是會承載操作系統主要應用軟體安裝任務。那麼當磁碟空間爆滿後,MySQL會發生什麼事呢?又應該怎麼應對? 會發生什麼事 當磁碟空間寫滿了之 ...
  • 連接資料庫的八大步驟 Step1:鏈接資料庫 mysqli_connect() 參數: ①主機地址 ②mysql用戶名 ③mysql密碼 ④選擇連接的資料庫 ⑤埠號 返回:如果連接成功,返回資源類型的標誌符號;如果連接失敗,返回false。 如果我們與mysql建立的連接不只一條,那麼以後操作數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...