欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Redis五大數(shù)據(jù)類型分別是什么

本篇內(nèi)容主要講解“redis五大數(shù)據(jù)類型分別是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Redis五大數(shù)據(jù)類型分別是什么”吧!

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、達(dá)州ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的達(dá)州網(wǎng)站制作公司

上一篇文章有提到,Redis中使用最頻繁的有5種數(shù)據(jù)類型:String、List、Hash、Set、SortSet。上一篇文章只是單純介紹了下這5種數(shù)據(jù)類型使用到的指令以及常用場(chǎng)景,本篇文章會(huì)談?wù)?種數(shù)據(jù)類型的底層數(shù)據(jù)結(jié)構(gòu)以及各自常用的操作命令來分別進(jìn)行解析。Redis作為目前最流行的Key-Value型內(nèi)存數(shù)據(jù)庫,不僅數(shù)據(jù)庫操作在內(nèi)存中進(jìn)行,并且可定期的將數(shù)據(jù)持久化到磁盤中,所以性能相對(duì)普通數(shù)據(jù)庫高很多,而在Redis中,每個(gè)Value實(shí)際上都是以一個(gè)redisObject結(jié)構(gòu)來表示: typedef struct redisObject{ unsigned type:4; unsigned encoding:4; void *ptr; int refCount; unsigned lru: } 我們可以看看這幾個(gè)參數(shù)分別的含義:

  • type:對(duì)象的數(shù)據(jù)類型,一般情況就是5大數(shù)據(jù)類型。

  • encode:redisObject對(duì)象底層編碼實(shí)現(xiàn),主要編碼類型有簡(jiǎn)單動(dòng)態(tài)字符串,鏈表,字典,跳躍表,整數(shù)集合及壓縮列表。

  • *ptr:指向底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的指針。

  • refCount:計(jì)數(shù)器,當(dāng)引用計(jì)數(shù)值為0將會(huì)釋放對(duì)象。

  • lru:最后一次訪問本對(duì)象的時(shí)間。

String數(shù)據(jù)類型

String 數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的 Key-Value 類型,是Redis中最常用的一種數(shù)據(jù)類型,Value 可以是string或者數(shù)字。String數(shù)據(jù)類型實(shí)際上可以存儲(chǔ)字符串、整數(shù)、浮點(diǎn)數(shù)三種不同類型的值,Redis是如何做到自動(dòng)識(shí)別字符串、整數(shù)、浮點(diǎn)數(shù)三種不同類型的值。Redis是使用C實(shí)現(xiàn)的,但是并未使用C中的字符串,實(shí)際上Redis自己實(shí)現(xiàn)了一個(gè)結(jié)構(gòu)體SDS來替代String類型: struct sdshdr{ //記錄buf數(shù)組中已使用字節(jié)的長(zhǎng)度 int len; //記錄buf數(shù)組中剩余空間的長(zhǎng)度 int free; //字節(jié)數(shù)組,用于存儲(chǔ)字符串 char buf[]; };

我們可以看到free參數(shù)是用來判斷剩余可使用空間的長(zhǎng)度,len表示字符串的長(zhǎng)度,buf存儲(chǔ)字符串的每一個(gè)字符以及結(jié)尾的'\0'。為什么Redis要自己實(shí)現(xiàn)SDS結(jié)構(gòu)體呢?因?yàn)镾DS結(jié)構(gòu)體有幾個(gè)優(yōu)點(diǎn):

  • 由于len保存了當(dāng)前字符串的實(shí)際長(zhǎng)度,所以獲取長(zhǎng)度時(shí)間復(fù)雜度為O(1)。

  • SDS在拼接之前會(huì)對(duì)當(dāng)前字符串的空間進(jìn)行自動(dòng)調(diào)整和擴(kuò)展,防止當(dāng)前字符串?dāng)?shù)據(jù)溢出。

  • 減少內(nèi)存分配次數(shù),SDS拼接字符串發(fā)生時(shí),如果此時(shí)的字符串長(zhǎng)度len小于1M,則SDS會(huì)分配和len大小相同的未使用空間給free,如果此時(shí)的字符串長(zhǎng)度len大于1M,則SDS會(huì)分配和1M的未使用空間給free,當(dāng)字符串縮短時(shí),縮短的空間會(huì)疊加到free中,用于后續(xù)的拼接使用。

String數(shù)據(jù)類型常用命令:

  • 常用命令:set、get、decr、incr、mget 等。

String數(shù)據(jù)類型適用場(chǎng)景:

  • 分布式鎖

  • 分布式session:將分布式應(yīng)用session存儲(chǔ)到Redis中

  • 商品秒殺

  • 常規(guī)計(jì)數(shù):博客數(shù),閱讀數(shù)

List數(shù)據(jù)類型List數(shù)據(jù)結(jié)構(gòu)是用來存儲(chǔ)多個(gè)有序的字符串,List中的每個(gè)字符串成為元素,List提供了節(jié)點(diǎn)重排和節(jié)點(diǎn)順序訪問的能力,在Redis中,List可以在兩端push和pop元素,還可以獲取指定范圍的元素列表,獲取指定索引下標(biāo)的元素等,List數(shù)據(jù)結(jié)構(gòu)主要有zipList(壓縮鏈表)和LinkedList(雙向鏈表)兩種實(shí)現(xiàn)方式。首先我們可以先看看LinkedList的結(jié)構(gòu): type struct list{ //表頭節(jié)點(diǎn) listNode *head; //表尾節(jié)點(diǎn) listNode *tail; //包含的節(jié)點(diǎn)總數(shù) unsigned long len; };

可以看到每個(gè)LinkedList中都會(huì)包含一個(gè)表頭節(jié)點(diǎn)head和一個(gè)表尾結(jié)點(diǎn)tail,在LinkedList中每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)prev指向前一個(gè)元素,同時(shí)還有一個(gè)next指向后一個(gè)元素,每個(gè)節(jié)點(diǎn)的value就是節(jié)點(diǎn)的值。從而實(shí)現(xiàn)雙向鏈表,理解起來實(shí)際上和C中的雙向鏈表有很大程度的相似性。而另一種實(shí)現(xiàn)方式zipList是基于連續(xù)內(nèi)存實(shí)現(xiàn),有點(diǎn)類似于數(shù)組方式,但是和數(shù)組有點(diǎn)不一致的是zipList的每一個(gè)entry的大小可能不一致,需要特殊方法去控制解決,但是在執(zhí)行push,pop操作時(shí)會(huì)有數(shù)據(jù)的遷移,時(shí)間復(fù)雜度為O(n), 所以一般只有在元素較少時(shí)才會(huì)使用zipList,我們可以看看zipList的結(jié)構(gòu):

type struct ziplist{ //整個(gè)壓縮列表的字節(jié)數(shù) uint32_t zlbytes; //記錄壓縮列表尾節(jié)點(diǎn)到頭結(jié)點(diǎn)的字節(jié)數(shù),直接可以求節(jié)點(diǎn)的地址 uint32_t zltail_offset; //記錄了節(jié)點(diǎn)數(shù),有多種類型,默認(rèn)如下 uint16_t zllength; //節(jié)點(diǎn) List entryX; }

zipList中每個(gè)節(jié)點(diǎn)都會(huì)有以下幾個(gè)參數(shù)信息:

  • previous_entry_length:記錄前一個(gè)節(jié)點(diǎn)的字節(jié)長(zhǎng)度

  • content:節(jié)點(diǎn)所存儲(chǔ)的內(nèi)容,可以是一個(gè)字節(jié)數(shù)組或者整數(shù)

  • encoding:記錄content屬性中所保存的數(shù)據(jù)類型以及長(zhǎng)度

*** List數(shù)據(jù)類型適用場(chǎng)景**

在渲染文章列表時(shí)可以使用List數(shù)據(jù)類型,一般情況下每個(gè)用戶都會(huì)有自己發(fā)布的文章列表,如果需要展示文章列表,就可以使用List數(shù)據(jù)類型,不但可以有序而且可以按照索引范圍去查詢文章列表。

Set數(shù)據(jù)類型

Set數(shù)據(jù)類型和List數(shù)據(jù)類型有點(diǎn)類似,也可以用來保存多個(gè)元素,但最大的一點(diǎn)區(qū)別在于Set數(shù)據(jù)類型不允許出現(xiàn)重復(fù)的元素,并且Set中的元素是無序的,所以沒辦法和List一樣通過索引下標(biāo)獲取元素,但是Set類型支持多個(gè)Set集合取交集、并集、差集,所以合理使用Set數(shù)據(jù)類型,可以在實(shí)際項(xiàng)目開發(fā)中解決很多問題。Set數(shù)據(jù)類型有兩種數(shù)據(jù)結(jié)構(gòu):IntSet和HashTable。首先我們來看看IntSet的結(jié)構(gòu):

typedef struct intset { // 編碼方式 uint32_t enconding; // 集合包含的元素?cái)?shù)量 uint32_t length; // 保存元素的數(shù)組 int8_t contents[]; } intset;

當(dāng)Set集合中所有元素都為整型時(shí),Redis才會(huì)使用IntSet數(shù)據(jù)結(jié)構(gòu)。有一點(diǎn)需要格外注意的是:IntSet數(shù)據(jù)結(jié)構(gòu)是有序的。因?yàn)闉榱藴p輕性能的消耗,Redis在Set集合元素都為整型時(shí),會(huì)使用一種基于動(dòng)態(tài)數(shù)組的結(jié)構(gòu)體,同時(shí)在push元素的時(shí)候控制元素的大小順序,這樣就可以使用二分查找算法來對(duì)元素進(jìn)行push及pop操作,這樣時(shí)間復(fù)雜度僅為O(logN)。在Set集合中元素存在非整型數(shù)據(jù)時(shí),Redis這時(shí)會(huì)自動(dòng)采用HashTable數(shù)據(jù)結(jié)構(gòu)來存放數(shù)據(jù),在HashTable中,存放的只有key值而沒有value值,所以說在HashTable中,鍵值永遠(yuǎn)為null。我們可以看下HashTable的結(jié)構(gòu):

typedef struct dict{ //類型特定函數(shù) dictType *type; //哈希表 兩個(gè),一個(gè)用于實(shí)時(shí)存儲(chǔ),一個(gè)用于rehash dictht ht[2]; //rehash索引 數(shù)據(jù)遷移時(shí)使用 unsigned rehashidx; }

Set數(shù)據(jù)類型使用場(chǎng)景:

  • 記錄唯一值:比如登錄ip,身份證號(hào)

  • 添加標(biāo)簽:可以通過標(biāo)簽的交并集計(jì)算用戶喜好程度等數(shù)據(jù)。

Hash數(shù)據(jù)類型在Redis中哈希類型是指鍵本身又是一種鍵值對(duì)結(jié)構(gòu),也就是我們所說的對(duì)象,所以Hash數(shù)據(jù)類型用來存儲(chǔ)對(duì)象是最合適的數(shù)據(jù)類型。Hash數(shù)據(jù)類型的編碼可以是zipList或HashTable。當(dāng)哈希對(duì)象保存的所有鍵值對(duì)長(zhǎng)度小于64字節(jié)并且元素?cái)?shù)量少于512時(shí)使用zipList,否則使用HashTable。zipList與剛才List數(shù)據(jù)類型中講到的zipList實(shí)際上基本一致,唯一區(qū)別在于Hash存儲(chǔ)entry數(shù)量成對(duì)增加,所以長(zhǎng)度一定為2的整數(shù)倍。當(dāng)然,使用zipList剛才已經(jīng)說過push和pop時(shí)間復(fù)雜度為O(n),所以只能在數(shù)據(jù)量少的情況下才允許使用。而HashTable其實(shí)有點(diǎn)類似于Java中的HashTable,HashTTable主要依賴于三個(gè)結(jié)構(gòu):dict、dictht、entry。三個(gè)結(jié)構(gòu)的關(guān)系可以表示為如下這幅圖: Redis五大數(shù)據(jù)類型分別是什么

Hash數(shù)據(jù)類型適用場(chǎng)景:

  • 存儲(chǔ)對(duì)象數(shù)據(jù)。

  • 結(jié)合Json描述對(duì)象集合。

SortSet數(shù)據(jù)類型

有序集合是在Set集合的基礎(chǔ)上,保留了Set集合中不能存在重復(fù)元素的特性,但是不同的是,SortSet集合中元素是可以排序的,SortSet排序和List排序都可以使用索引下標(biāo)作為排序依據(jù),所以說SortSet實(shí)現(xiàn)了數(shù)據(jù)有序且鍵值對(duì)唯一的集合,SortSet的數(shù)據(jù)結(jié)構(gòu)有兩種:zipList和skipList + HashTable,zipList都不用多少了,是用于數(shù)據(jù)量較少的情況,默認(rèn)排序?yàn)樵貜男〉酱蟆6捎胹kipList + HashTable的數(shù)據(jù)結(jié)構(gòu),skipList會(huì)在保證集合有序的情況下優(yōu)化范圍查找的時(shí)間復(fù)雜性,而HashTable剛才已經(jīng)提到過它可以優(yōu)化push和pop元素時(shí)的時(shí)間復(fù)雜性。skipList基于有序鏈表,可以創(chuàng)建多層索引,實(shí)現(xiàn)以空間復(fù)雜度來換取時(shí)間復(fù)雜度的做法,最終實(shí)現(xiàn)時(shí)間復(fù)雜度為O(logN)的元素查詢過程,當(dāng)需要push或者pop元素時(shí),則使用HashTable實(shí)現(xiàn)時(shí)間復(fù)雜度僅為O(1).

SortSet數(shù)據(jù)類型適用場(chǎng)景

  • 積分排行榜:根據(jù)積分排序從小到大

  • 獲取某個(gè)范圍的數(shù)據(jù):考試80-100分的數(shù)據(jù)

到此,相信大家對(duì)“Redis五大數(shù)據(jù)類型分別是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站名稱:Redis五大數(shù)據(jù)類型分別是什么
URL標(biāo)題:http://chinadenli.net/article42/gsjphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)服務(wù)器托管小程序開發(fā)網(wǎng)站設(shè)計(jì)網(wǎng)站設(shè)計(jì)公司網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)