本文已收錄至Github,推薦閱讀 ?? Java隨想錄
微信公眾號:Java隨想錄
目錄- 摘要
- redisObject
- 型別與編碼介紹
- 字串
- 串列
- 集合
- 有序集合
- 哈希表
- 型別與編碼底層原理
- 編碼轉換
- 資料結構
- 總結
摘要
Redis是一款開源的高性能key-value資料庫,廣泛應用于各種場景,在Redis中,資料型別(type)和編碼(encoding)是非常重要的概念,本篇博客將詳細介紹Redis支持的資料型別以及相應的編碼方式和底層實作原理,
要查看Redis某個key的內部編碼,可以使用Redis命令OBJECT ENCODING key,其中,key是你想要查詢的鍵名,例如,如果你想要查詢名為mykey的鍵的內部編碼,可以執行以下命令:
127.0.0.1:6379> object encoding mykey // 查看某個Redis鍵值的編碼
redisObject
在 Redis 中,redisObject 是 Redis 中最基本的資料結構之一,redisObject 用于表示 Redis 中的鍵值對中的值,它可以是字串、整數、串列、哈希表等任意一種 Redis 資料型別,
redisObject 的定義如下:
typedef struct redisObject {
// 型別
unsigned type:4;
// 編碼方式
unsigned encoding:4;
// 參考計數
int refcount;
// 指向實際值的指標
void *ptr;
} robj;
- type:表示 redisObject 的型別,
- encoding:表示 redisObject 的編碼方式,
- refcount:表示當前 redisObject 被參考的次數,
- ptr: ptr欄位則是一個指標,指向實際的 Redis 物件,
Redis原始碼encoding取值有如下幾種:
#define OBJ_ENCODING_RAW 0 /* Raw representation */
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
型別與編碼介紹
Redis支持五種主要的資料型別:字串(string)、串列(list)、集合(set)、有序集合(sorted set)和哈希(hash),每種資料型別都有對應的編碼方式,
資料型別與編碼方式總覽如下:
| 資料型別 | 編碼方式 |
|---|---|
| 字串 | int、embstr、raw |
| 哈希表 | ziplist、hashtable |
| 串列 | ziplist、linkedlist、quicklist |
| 集合 | intset、hashtable |
| 有序集合 | ziplist、skiplist |
字串
字串是Redis中最基本的資料型別,通常用于存盤文本或二進制資料,Redis支持兩種編碼方式:
- int:當字串可以表示為整數時,Redis會將其轉換為整數,并采用int編碼方式存盤,int編碼方式的優點是存盤空間小,操作效率高,缺點是只能存盤整數,不支持字串操作,
- embstr(embstr-encoded string):保存長度小于44位元組的字串,當一個字串比較短,采用此編碼方式存盤,可以減少記憶體占用,
- raw(raw-encoded string):保存長度大于44位元組的字串,當一個字串比較長時,采用此編碼方式存盤,
串列
串列是一系列有序的字串集合,可以添加、修改和洗掉元素,Redis支持三種編碼方式:
- ziplist:在Redis3.2版本之前,當List串列中每個字串的長度都小于64位元組并且List串列中元素數量小于512個時,List物件使用ziplist編碼,其他情況使用linkedlist編碼,ziplist是一種緊湊的、壓縮的串列結構,可以節省記憶體,適用于小型串列,
- linkedlist:linkedlist是一種鏈表結構,支持任意大小的串列,但其記憶體占用會隨著串列長度的增加而增加,
- quicklist:Redis 3.2版本引入,quicklist是一種由多個ziplist組成的串列結構,既能保證性能,又能節省記憶體,適用于大型串列,
集合
集合是一系列無序的字串集合,支持添加、洗掉和查詢元素,Redis支持兩種編碼方式:
- intset:當集合中的元素都是整數時,Redis會采用intset編碼方式存盤,intset編碼方式的優點是存盤空間小,操作效率高,
- hashtable:當集合中的元素包含字串時,Redis會采用hashtable編碼方式存盤,hashtable編碼方式的優點是可以存盤任意型別的元素,支持字串操作,缺點是存盤空間相對較大,操作效率相對較低,
有序集合
有序集合是一系列無序的字串集合,每個元素關聯一個分數,可以根據分數排序,Redis支持兩種編碼方式:
- ziplist:保存的元素少于128個并且所有元素大小都小于64位元組使用ziplist編碼,ziplist是一種緊湊的、壓縮的串列結構,適用于小型有序集合,
- skiplist:skiplist是一種跳躍表結構,支持快速查詢和排序,適用于大型有序集合,
哈希表
哈希表是一系列鍵值對集合,每個鍵關聯一個值,Redis支持兩種編碼方式:
- ziplist:哈希物件保存的所有鍵值的字串長度小于64位元組并且鍵值對數量小于512個,Redis會采用ziplist編碼方式存盤,ziplist編碼方式的優點是存盤空間小,操作效率高,缺點是不支持快速的鍵查找操作,
- hashtable:除上述條件之外,Redis會采用hashtable編碼方式存盤,hashtable編碼方式的優點是支持快速的鍵查找操作,缺點是存盤空間相對較大,操作效率相對較低,
型別與編碼底層原理
了解Redis支持的資料型別和編碼方式后,我們來看一下它們的底層實作原理,
編碼轉換
Redis中的每個鍵值對都有一個型別標識,表示該鍵值對的資料型別,當我們對一個鍵進行操作時,Redis會根據該鍵當前的編碼方式以及操作所需的編碼方式,對鍵值對進行編碼轉換,
例如,當我們向一個字串中追加內容時,如果該字串當前的編碼方式為raw,但是新的內容可以使用embstr編碼方式存盤,那么Redis會將該字串的編碼方式從raw轉換為embstr,
資料結構
除了編碼方式外,Redis還使用了許多經典的資料結構來實作各種資料型別,例如,Redis的串列和哈希表都是采用鏈表結構實作的,而有序集合則采用了跳躍表(Skip List)這種高效的資料結構,
這些資料結構都經過了精心設計和優化,以滿足各種場景下的應用需求,例如,鏈表結構適合頻繁地添加和洗掉元素,而跳躍表結構則適合排序和查找,
總結
本篇博客介紹了Redis支持的五種主要資料型別以及相應的編碼方式,Redis的資料型別和編碼方式是為了在不同的場景下達到最佳的性能和記憶體占用,在使用Redis時,需要根據實際情況選擇合適的資料型別和編碼方式,以達到最佳的效果,同時,需要注意不同資料型別和編碼方式的優缺點,以便在實際使用中做出合理的選擇,
本篇文章就到這里,感謝閱讀,如果本篇博客有任何錯誤和建議,歡迎給我留言指正,文章持續更新,可以關注公眾號第一時間閱讀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547466.html
標籤:其他
上一篇:Microsoft Project教程_編程入門自學教程_菜鳥教程-免費教程分享
下一篇:搭建自己的網路商城1
