Redis的數(shù)據(jù)類型和內(nèi)部編碼詳解
前言
為了后續(xù)能更好的講解Redis的各種數(shù)據(jù)類型,我們需要學(xué)習(xí)一點(diǎn)前置知識(shí)。
數(shù)據(jù)類型
Redis是通過Key-Value的形式來組織數(shù)據(jù)的,而Key的類型都是String,而Value的類型可以有很多。
在Redis中最通用的數(shù)據(jù)類型大致有這幾種:String、List、Set、Hash、Sorted Set。
不過,Redis底層在實(shí)現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)(類型)的時(shí)候,會(huì)在源碼層面進(jìn)行優(yōu)化,以達(dá)到節(jié)省時(shí)間/節(jié)省空間的效果,而對(duì)于內(nèi)部數(shù)據(jù)結(jié)構(gòu)也稱之為內(nèi)部編碼。
Ps:有點(diǎn)指鹿為馬的感覺。Redis告訴你,我的類型就是一個(gè)字符串,但自己背后卻給優(yōu)化成了整形,指著整形說是字符串,然后咱也只能老老實(shí)實(shí)用~
String
在String類型中有三種內(nèi)部編碼方式:raw、int、embstr。
raw:最基本的字符串,底層就類似是Java中的byte數(shù)組。
int:在特定場景下,會(huì)優(yōu)化成整數(shù),方便進(jìn)行數(shù)值計(jì)算。
embstr:針對(duì)短字符串進(jìn)行的優(yōu)化。
Hash
在Hash類型中有兩種內(nèi)部編碼方式:hashtable、ziplist。
hashtable:最基本的哈希表(不同于Java標(biāo)準(zhǔn)庫中的HashTable)。
ziplist:壓縮列表,當(dāng)哈希表中的元素比較少的時(shí)候,就進(jìn)行了優(yōu)化,節(jié)省空間。
List
在List類型中有兩種內(nèi)部編碼方式:linkedlist、ziplist。
linkedlist:鏈表的形式
ziplist:壓縮列表
不過從redis3.2開始,就引入了新的實(shí)現(xiàn)方式:quicklist。
quicklist:集成了鏈表和壓縮列表的優(yōu)勢(shì)。本質(zhì)上就是一個(gè)鏈表,而每個(gè)元素又是一個(gè)壓縮列表。當(dāng)元素很多的時(shí)候,如果全是鏈表,就會(huì)出現(xiàn)很多節(jié)點(diǎn),而每個(gè)節(jié)點(diǎn)都需要使用指針域,這也會(huì)大大增加開銷。
Set
在Set類型中有兩種內(nèi)部編碼方式:hashtable、intset。
intset:存儲(chǔ)的都是整數(shù)的集合。
Zset
在Set類型中有兩種內(nèi)部編碼方式:skiplist、ziplist。
skiplist:跳表,跳表也是鏈表,不同于普通鏈表的是,跳表的每個(gè)節(jié)點(diǎn)上有很多指針域,巧妙利用這個(gè)特性,查詢速度能調(diào)高到O(logn).
查詢內(nèi)部編碼方式指令
#基本語法 object encoding key #查詢key的內(nèi)部編碼
Redis會(huì)自動(dòng)根據(jù)當(dāng)前的實(shí)際情況選擇內(nèi)部的編碼方式~~真香!
Redis的單線程模型
此處的單線程模型并非是真的說在Redis內(nèi)部只有一個(gè)線程在工作,說的是Redis只用一個(gè)線程來處理命令請(qǐng)求,在Redis內(nèi)部還有其他一些線程是用來處理網(wǎng)絡(luò)IO的,畢竟是作為一個(gè)服務(wù)器來使用的~~
正是由于Redis的單線程模型,以至于當(dāng)多個(gè)客戶端并發(fā)的對(duì)Redis服務(wù)器進(jìn)行操作的時(shí)候,不會(huì)有線程安全的問題,多個(gè)請(qǐng)求來的時(shí)候就使用放到一個(gè)隊(duì)列里,串行的去處理里面的命令。而且Redis的主要核心業(yè)務(wù)邏輯也都是一些“短頻快”的操作,不太消耗CPU,所以單線程模型才能很好的工作,但也有弊端:當(dāng)一個(gè)指令執(zhí)行的時(shí)間太長,就會(huì)阻塞其他指令!?。?/p>
面試題:
Redis雖然是單線程模型,為啥效率這么高呢?
1.Redis訪問的是內(nèi)存中的數(shù)據(jù),相較于數(shù)據(jù)庫訪問的是硬盤數(shù)據(jù),會(huì)快很多。
2.Redis的核心功能,比數(shù)據(jù)庫簡單(數(shù)據(jù)庫支持各種各樣的約束,功能很強(qiáng)大,勢(shì)必會(huì)帶來更多開銷)。
3.單線程模型避免了一些不必要的線程競爭開銷。
4.處理網(wǎng)絡(luò)IO的時(shí)候,使用了epoll這樣的IO多路復(fù)用機(jī)制。
到此這篇關(guān)于Redis的數(shù)據(jù)類型和內(nèi)部編碼的文章就介紹到這了,更多相關(guān)Redis數(shù)據(jù)類型和內(nèi)部編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis 操作多個(gè)數(shù)據(jù)庫的配置的方法實(shí)現(xiàn)
本文主要介紹了Redis 操作多個(gè)數(shù)據(jù)庫的配置的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03使用Jedis線程池returnResource異常注意事項(xiàng)
這篇文章主要介紹了使用Jedis線程池returnResource異常注意事項(xiàng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Redis的五種基本類型和業(yè)務(wù)場景和使用方式
Redis是一種高性能的鍵值存儲(chǔ)數(shù)據(jù)庫,支持多種數(shù)據(jù)結(jié)構(gòu)如字符串、列表、集合、哈希表和有序集合等,它提供豐富的API和持久化功能,適用于緩存、消息隊(duì)列、排行榜等多種場景,Redis能夠?qū)崿F(xiàn)高速讀寫操作,尤其適合需要快速響應(yīng)的應(yīng)用2024-10-10如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作
這篇文章主要介紹了如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09Redis分布式鎖方案設(shè)計(jì)之防止訂單重復(fù)提交或支付
這篇文章主要為大家介紹了Redis分布式鎖之防止訂單重復(fù)提交或支付方案設(shè)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09