中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

免費(fèi)空間asp網(wǎng)站知名品牌營(yíng)銷(xiāo)策略

免費(fèi)空間asp網(wǎng)站,知名品牌營(yíng)銷(xiāo)策略,網(wǎng)上商城網(wǎng)站建設(shè)設(shè)計(jì)方案,安防網(wǎng)站建設(shè)優(yōu)點(diǎn)一、簡(jiǎn)單動(dòng)態(tài)字符串SDS 無(wú)論是Redis中的key還是value,其基礎(chǔ)數(shù)據(jù)類型都是字符串。如,Hash型value的field與value的類型,List型,Set型,ZSet型value的元素的類型等都是字符串。redis沒(méi)有使用傳統(tǒng)C中的字符串而是自定義了…

一、簡(jiǎn)單動(dòng)態(tài)字符串SDS

無(wú)論是Redis中的key還是value,其基礎(chǔ)數(shù)據(jù)類型都是字符串。如,Hash型value的field與value的類型,List型,Set型,ZSet型value的元素的類型等都是字符串。redis沒(méi)有使用傳統(tǒng)C中的字符串而是自定義了一種字符串結(jié)構(gòu)類型,這種字符串本身的結(jié)構(gòu)比較簡(jiǎn)單,但是功能強(qiáng)大,稱為簡(jiǎn)單動(dòng)態(tài)字符串 Simple Dynamic String ,簡(jiǎn)稱為SDS。

SDS結(jié)構(gòu)

SDS不同于C中的字符串,C中的字符串是以一個(gè)雙引號(hào)括起來(lái),以空字符'\0'結(jié)尾的字符序列。而SDS是重新定義的一個(gè)結(jié)構(gòu)體,在redis的安裝目錄src/sds.h

這個(gè)結(jié)構(gòu)體有三個(gè)部分組成:

struct sdshdr{// 字節(jié)數(shù)組,用來(lái)保存字符串char buf[];// SDS的長(zhǎng)度,在buf[]中使用的字節(jié)數(shù)量int len;// buf[]中沒(méi)有使用的字節(jié)數(shù)量int free;
}

注意:雖然redis當(dāng)中定義了結(jié)構(gòu)體sds,但是并不是所有的字符串都使用這種方式存儲(chǔ),比如我們執(zhí)行一個(gè)set命令,返回了一個(gè)OK,這個(gè)OK就是C語(yǔ)言中的字符串。get命令獲取的值返回的也是C語(yǔ)言的字符串。C 字符串只會(huì)出現(xiàn)在字符串“字面常量”中,并且該字符串不可能發(fā)生變更!!

?我們看下面的命令我們來(lái)了解一下類型與實(shí)際內(nèi)存中的存儲(chǔ)結(jié)構(gòu)的區(qū)別:

set name zhangsan # 寫(xiě)入key為name的值為zhangsan,這里寫(xiě)入的是zhangsan應(yīng)該是SDS結(jié)構(gòu)類型的
type name # 這里返回的會(huì)是string 表示是字符串
object encoding name # 這里會(huì)返回embstr,它就表示是SDS,是內(nèi)存中的存儲(chǔ)類型set age 23 # 寫(xiě)入key為age的值為23
type age # 這里返回的是string,表示是字符串
object encoding age # 這里返回的是int,表示在內(nèi)存中是以整型存儲(chǔ)的

SDS優(yōu)勢(shì)

C字符串底層是一個(gè)數(shù)組,字符串最后以’\0‘來(lái)結(jié)束。

優(yōu)勢(shì)一:防止字符串長(zhǎng)度獲取性能瓶頸

C字符串的長(zhǎng)度獲取必須要通過(guò)遍歷整個(gè)字符串(直到\0結(jié)束)才可以獲得,這樣的話對(duì)于超長(zhǎng)的字符串遍歷,還是會(huì)產(chǎn)生性能瓶頸的。

SDS結(jié)構(gòu)體中我們可以看到直接存放著字符串長(zhǎng)度的數(shù)據(jù),所以不管字符串有多長(zhǎng),獲取字符串的長(zhǎng)度所要消耗的系統(tǒng)性能都是一樣的,不會(huì)成為redis的性能瓶頸。

優(yōu)勢(shì)二:保障二進(jìn)制安全

C字符串對(duì)于字符串中的字符是有要求的,遇到\0就表示字符串結(jié)束了,但是我們?cè)趓edis中會(huì)用字符串存儲(chǔ)二進(jìn)制數(shù)據(jù)(圖片,視頻,壓縮文件...),在這些文件中使用\0在中間作為分隔符的情況是很常見(jiàn)的。所以redis中的SDS不以\0作為字符串結(jié)束標(biāo)志,而是通過(guò)len屬性來(lái)判斷字符串是否結(jié)束,所以對(duì)于程序處理SDS中的字符串?dāng)?shù)據(jù),不需要對(duì)數(shù)據(jù)做任何的限制、過(guò)濾等處理,直接讀取即可。寫(xiě)入的是什么讀出來(lái)的就是什么。

優(yōu)勢(shì)三:減少內(nèi)存再分配

SDS中采用了空間預(yù)分配策略惰性空間釋放策略來(lái)避免內(nèi)存再分配的問(wèn)題。

這兩個(gè)策略就是以空間換時(shí)間的做法!

如果我們要釋放SDS的未使用空間,可以通過(guò)sdsRemoveFreeSpace()函數(shù)來(lái)釋放。

優(yōu)勢(shì)四:兼容C函數(shù)

redis中提供了很多的SDS的api,方便用戶對(duì)redis進(jìn)行二次開(kāi)發(fā),為了兼容C函數(shù),SDS的底層數(shù)組buf[]中的字符串仍以空字符'\0'結(jié)尾。

SDS常用操作函數(shù)

  • 空間預(yù)分配策略,每次SDS進(jìn)行空間擴(kuò)展的時(shí)候,程序不但為其分配所需的空間,還會(huì)為其分配額外的未使用空間,從而減少內(nèi)存再分配次數(shù),客戶分配的未使用空間大小取決于空間擴(kuò)展后SDS的len屬性值。
    • 如果len屬性值小于1M,那么會(huì)分配未使用空間保持與len屬性相當(dāng)
    • 如果len屬性值大于等于1M,那么會(huì)固定分配未使用空間1M
  • 惰性空間釋放策略,如果SDS字符串長(zhǎng)度如果縮短,那么多出的未使用空間會(huì)暫時(shí)不釋放,而是增加到free當(dāng)中去,從而保證后期擴(kuò)展SDS時(shí)減少再分配的次數(shù)

函數(shù)功能
sdsnew()使用指定的C字符串創(chuàng)建一個(gè)SDS
sdsempty()創(chuàng)建一個(gè)不包含任何字符串?dāng)?shù)據(jù)的SDS
sdsdup()創(chuàng)建一個(gè)指定SDS的副本
sdsfree()釋放是定的SDS
sdsclear()清空指定SDS的字符串內(nèi)容
sdslen()獲取指定SDS的已使用空間len值
sdsavail()獲取指定SDS的未使用空間free值
sdsMakeRoomFor()使指定的SDS的free空間增加指定的大小
sdsRemoveFreeSpace()釋放指定SDS的free空間
sdscat()把指定的C字符串拼接到指定SDS的字符串末尾
sdscatsds()把指定的SDS字符串拼接到另一個(gè)指定的SDS字符串末尾
sdscpy()把指定C字符串復(fù)制到指定的SDS中,覆蓋原SDS字符串內(nèi)容
sdsgrouzero()擴(kuò)展SDS字符串到指定長(zhǎng)度,這個(gè)擴(kuò)展使用空字符'\0'填充
sdsrange()截取指定SDS中指定范圍內(nèi)的字符串
sdstrim()在指定SDS中刪除報(bào)有指定C字符串中出現(xiàn)的所有字符
sdsemp()對(duì)比給定的兩個(gè)SDS字符串是否相同
sdstolow()把指定SDS字符串中的所有字母變?yōu)樾?xiě)
sdstoupper()把指定SDS字符串中所有字母變?yōu)榇髮?xiě)

?這些函數(shù)在需要對(duì)redis二次開(kāi)發(fā)時(shí)可能會(huì)用到,正常使用redis時(shí)用不到!

集合底層實(shí)現(xiàn)原理

Set集合

對(duì)于set,我們看它底層的實(shí)現(xiàn)可以如下:

sadd cities bj sh gz sz # 添加一個(gè)set集合
type cities # 返回的類型是set
object encoding cities # 返回的是hashtable

從上面可以看到set底層是使用hashtable存儲(chǔ)的!

Hash與ZSet

這兩種它們的底層實(shí)際上有兩種:壓縮列表zipList;跳躍列表skipList

至于Redis什么時(shí)候用zipList,什么時(shí)候用skipList對(duì)于我們用戶來(lái)說(shuō)是透明的,用戶寫(xiě)入不同的數(shù)據(jù),系統(tǒng)會(huì)自動(dòng)判斷使用不同的實(shí)現(xiàn)。

只要我們的數(shù)據(jù)量不超過(guò)我們?cè)O(shè)定的閾值則會(huì)使用zipList,一旦超過(guò)這個(gè)閾值則什么變?yōu)閟kipList。

關(guān)于這個(gè)閾值的查看,可以使用命令進(jìn)行查看:

config get zset-*-ziplist-*
# 運(yùn)行后得到的結(jié)果類似如下:
1) "zset-max-ziplist-entries"
2) "128"
3) "zset-max-ziplist-value"
4) "64"

上面的信息表示,zset中包含的元素不超過(guò)128,并且每一個(gè)元素的大小不超過(guò)64字節(jié)就會(huì)使用ziplist。這兩個(gè)任意一個(gè)不滿足就會(huì)變?yōu)閟kipList。

同樣hash的查詢方式也類似,其查詢命令如下:

config get hash-*-ziplist-*
# 運(yùn)行這個(gè)命令后的結(jié)果如下:
1) "hash-max-ziplist-value"
2) "64"
3) "hash-max-ziplist-entries"
4) "512"

關(guān)于zipList的底層結(jié)構(gòu)

首先,什么是zipList?

通常稱為壓縮列表,是一個(gè)經(jīng)過(guò)特殊編碼(體現(xiàn)了zip壓縮的)的用于存儲(chǔ)字符串或整數(shù)的雙向鏈表。其底層數(shù)據(jù)結(jié)構(gòu)由三部分構(gòu)成:head(基礎(chǔ)信息)、entries(元素)、end(結(jié)束標(biāo)記),這三部分在內(nèi)存上是連續(xù)存放的。

zipList的三部分在底層如何存儲(chǔ)?

說(shuō)明
head

它包含總括性信息,由三部分組成:

zlbytes:4個(gè)字節(jié),用來(lái)存放zipList列表整體數(shù)據(jù)結(jié)構(gòu)所占的字節(jié)數(shù),包括zlbytes本身的長(zhǎng)度

zltail:4個(gè)字節(jié),用于存放zipList中最后一個(gè)entry在整個(gè)數(shù)據(jù)結(jié)構(gòu)中的偏移量(字節(jié))這個(gè)數(shù)據(jù)可以快速定位列表的尾entry位置,便于操作。

zllen:兩個(gè)字節(jié),用于存放列表包含的entry的個(gè)數(shù),兩個(gè)字節(jié)是16位,所以zipList最多可以包含有2^{16} -1 = 65535個(gè),一旦元素個(gè)數(shù)超過(guò)了它,這里就沒(méi)有辦法表示元素個(gè)數(shù)了這部分的值也就沒(méi)有意義了,此時(shí)要看有多少個(gè)元素就只能通過(guò)遍歷來(lái)確定了!

entries

entries是真正的列表,由很多的列表元素entry構(gòu)成,由于不同的元素類型、數(shù)值是不同的,從而導(dǎo)致每個(gè)entry的長(zhǎng)度不同。每個(gè)entry由三部分構(gòu)成:

prevlength:用來(lái)記錄上一個(gè)entry的長(zhǎng)度,用以實(shí)現(xiàn)逆序遍歷,默認(rèn)長(zhǎng)度是1字節(jié),只要上一個(gè)entry的長(zhǎng)度<254字節(jié),prevlength就會(huì)占1字節(jié),否則會(huì)擴(kuò)展為3字節(jié)長(zhǎng)度。

注意:這里分節(jié)點(diǎn)為什么是小于254?不是255?因?yàn)閦ipList中有一個(gè)部分是1字節(jié)的全為1表示結(jié)束,所以不能用255,而254也是一個(gè)保留的值用來(lái)做為prevlength的自動(dòng)擴(kuò)展標(biāo)志的

encoding:用來(lái)標(biāo)記后面的data具體類型。如果data為整數(shù)類型,encoding固定長(zhǎng)度是1字節(jié),如果data為字符串類型,則encoding長(zhǎng)度可能會(huì)是1字節(jié)、2字節(jié)或5字節(jié)。data字符串不同的長(zhǎng)度,對(duì)應(yīng)著不同的encoding長(zhǎng)度

data:真正存儲(chǔ)的數(shù)據(jù)。數(shù)據(jù)類型只能是整數(shù)類型或字符串類型,不同的數(shù)據(jù)占用的字節(jié)長(zhǎng)度不同

endend只包含一部分,稱為zlend。其占一個(gè)字節(jié),值固定為255,也就是二進(jìn)制全為1,表示一個(gè)zipList列表的結(jié)束。

zipList的結(jié)構(gòu)圖大致如下:

?關(guān)于listPack底層結(jié)構(gòu)

zipList是在Redis7之前版本中使用的,到了7版本不再使用zipList,而是使用listPack進(jìn)行了替換。

為什么要把zipList替換為listPack?

在zipList中每一個(gè)entry中的prevlength當(dāng)中會(huì)記錄前一個(gè)entry的長(zhǎng)度,如果在中間某個(gè)元素前插入了一個(gè)元素或修改了元素,那這個(gè)元素entry中的prevlength還要跟著去調(diào)整(級(jí)聯(lián)更新)。在高并發(fā)的寫(xiě)操作場(chǎng)景下會(huì)極度地降低Redis的性能,所以為了實(shí)現(xiàn)更緊湊、更快的解析,更簡(jiǎn)單的寫(xiě)操作所以重寫(xiě)了zipList,并把它命名為listPack。

那listPack有是什么呢?

它也是一種經(jīng)過(guò)特殊編碼的用于存儲(chǔ)字符串或整數(shù)的雙向鏈表。其底層數(shù)據(jù)結(jié)構(gòu)也是由三部分構(gòu)成的:head、entries、end并且這三部分在內(nèi)存上也是連續(xù)進(jìn)行存放的。

listPack與zipList的最大區(qū)別在于head和每個(gè)entry的結(jié)構(gòu)上,表示列表結(jié)束的end兩者是相同的占一個(gè)字節(jié)且全為1。

說(shuō)明
head

由兩部分組成:

totalBytes:占4個(gè)字節(jié),用來(lái)存放listPack列表整體數(shù)據(jù)結(jié)構(gòu)所占的字節(jié)數(shù),也包含totalBytes本身的長(zhǎng)度

elemNum:占2個(gè)字節(jié),用于存放列表包含的entry個(gè)數(shù)其意義與zipList中的zllen是相同的

注意:在listPack中沒(méi)有記錄最后一個(gè)entry偏移量的zltail

entries

entries也是listPack中真正的列表,由很多的列表元素entry構(gòu)成。由于不同的元素類型、數(shù)值的不同,從而導(dǎo)致每個(gè)entry的長(zhǎng)度不同。但是與zipList的entry結(jié)構(gòu)相比,listPack的entry結(jié)構(gòu)發(fā)生了較大的變化。其中變化最大的就是沒(méi)有了記錄前一個(gè)entry長(zhǎng)度的prevlength,而增加了記錄當(dāng)前entry長(zhǎng)度的element-total-len。而這一變化仍然可以實(shí)現(xiàn)逆序遍歷(由新的算法來(lái)支撐),但去避免了由于在列表中間修改或插入entry引發(fā)的級(jí)聯(lián)更新。

每個(gè)entry由三個(gè)部分組成:

encoding:標(biāo)記后面data的具體類型,如果是整數(shù)類型,其長(zhǎng)度可能是1,2,3,4,5,9字節(jié)。不同的字節(jié)長(zhǎng)度,標(biāo)識(shí)位不同。如果是字符串則長(zhǎng)度可能是1,2,5字節(jié)。data字符串不同的長(zhǎng)度,對(duì)應(yīng)著不同的encoding長(zhǎng)度

data:真正存儲(chǔ)的數(shù)據(jù)。數(shù)據(jù)類型只能是整數(shù)類型或字符串類型,不同的數(shù)據(jù)占用的字節(jié)長(zhǎng)度不同

element-total-len:記錄當(dāng)前entry的長(zhǎng)度,用來(lái)支持逆序遍歷,由于其特殊的記錄方式,其本身占用的字節(jié)數(shù)據(jù)中能會(huì)是1,2,3,4,5字節(jié)

endend只包含一部分其占一個(gè)字節(jié),值固定為255,也就是二進(jìn)制全為1,表示一個(gè)zipList列表的結(jié)束。

listPack的底層結(jié)構(gòu)圖大致如下:

?注意:encoding是比較復(fù)雜的,有些數(shù)據(jù)中可能在encoding中就包含了數(shù)據(jù)本身了沒(méi)有data這部分了

關(guān)于skipList底層結(jié)構(gòu)

什么是skipList呢?

skipList指的是跳躍列表,簡(jiǎn)稱跳表,是一種隨機(jī)化的數(shù)據(jù)結(jié)構(gòu),基于并聯(lián)的鏈表,實(shí)現(xiàn)簡(jiǎn)單,查找效率較高。簡(jiǎn)單理解這里的跳表也是鏈表的一種,只是在鏈表的基礎(chǔ)上添加了跳躍的功能。因?yàn)橛辛诉@個(gè)跳躍的功能,所以在查找元素時(shí),能夠提供較高的效率。

skipList是如何跳躍后提高查找元素效率的呢?原理是什么?

我們先看下面這個(gè)有序列表

?此時(shí)如果我們要查找某個(gè)數(shù)據(jù)比如23,則需要從頭開(kāi)始一個(gè)一個(gè)進(jìn)行比較,直接找到包含要找數(shù)據(jù)的節(jié)點(diǎn)或者找到第一個(gè)比要找數(shù)據(jù)還大的節(jié)點(diǎn)或者找到末尾節(jié)點(diǎn)(這后面的兩種都表示沒(méi)有找到),這種方式的查找沒(méi)有效率是不高的,為了提升效率可以在偶數(shù)結(jié)點(diǎn)上加上一個(gè)指針,讓這個(gè)指針指向下一個(gè)偶數(shù)節(jié)點(diǎn),如下圖所示:

?此時(shí)所有的偶數(shù)節(jié)點(diǎn)連成了一個(gè)新的鏈表(稱為高層鏈表),高層鏈表的節(jié)點(diǎn)數(shù)只有原鏈表的一半。如果這個(gè)時(shí)候要查找某個(gè)數(shù)據(jù)時(shí),會(huì)先沿著高層鏈表進(jìn)行查找,當(dāng)遇到第一個(gè)比待查數(shù)據(jù)大的節(jié)點(diǎn)時(shí),立即從這個(gè)大節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)回到原鏈表進(jìn)行查找。比如我們想找23,先在高層節(jié)點(diǎn)進(jìn)行遍歷,遍歷到31時(shí)發(fā)現(xiàn)比23大了,此時(shí)會(huì)從它的前一個(gè)節(jié)點(diǎn)開(kāi)始也就是19按原鏈表順序進(jìn)行遍歷,這時(shí)遍歷到23,找到元素。

使用跳表這種方式明顯可以減少比較的次數(shù),提高查詢的效率,如果鏈表的元素比較多還想進(jìn)一步提升效率可以再加一層高層鏈表。此時(shí)就變成了先遍歷最高層的鏈表,再遍歷第二高層的鏈表,依次類推。

上面這種跳表的基礎(chǔ)結(jié)構(gòu)可能存在的問(wèn)題:

這種對(duì)鏈表的分層級(jí)的方式看上去確實(shí)提升了查找效率,但是實(shí)際操作時(shí)情況比較多,會(huì)產(chǎn)生問(wèn)題,比如固定序號(hào)的元素有固定的層級(jí),那么列表中的元素如果出現(xiàn)增加或刪除,這會(huì)導(dǎo)致列表整體的層級(jí)都需要調(diào)整,這會(huì)大大降低系統(tǒng)性能。

解決這種序號(hào)變化帶來(lái)的層級(jí)變化影響性能的算法優(yōu)化辦法:

為了避免前面的問(wèn)題,skipList采用了隨機(jī)分配層級(jí)方式。在確認(rèn)了總層級(jí)后,每添加一個(gè)新的元素時(shí)會(huì)自己動(dòng)為其隨機(jī)分配一個(gè)層級(jí)。這種隨機(jī)性就解決了節(jié)點(diǎn)序號(hào)與層級(jí)之前的固定關(guān)系問(wèn)題。

數(shù)據(jù)新插入進(jìn)來(lái)不影響其它節(jié)點(diǎn)的層級(jí)數(shù)。只需要修改插入節(jié)點(diǎn)的前后的指針,而不需要對(duì)很多節(jié)點(diǎn)進(jìn)行調(diào)整,這也降低了插入操作的復(fù)雜度。

skipList指的就是除了最下面第1層鏈表外,它會(huì)產(chǎn)生若干層稀疏的鏈表,這些鏈表里面的指針跳過(guò)了一些節(jié)點(diǎn),并且越高層級(jí)的鏈表跳過(guò)的節(jié)點(diǎn)越多。在查找數(shù)據(jù)的時(shí)先在高層級(jí)鏈表中進(jìn)行查找,然后逐層降低,最終可能會(huì)降到第 1 層鏈表來(lái)精確地確定數(shù)據(jù)位置。在這個(gè)過(guò)程中由于跳過(guò)了一些節(jié)點(diǎn)所以提升了效率。

關(guān)于quickList底層結(jié)構(gòu)

什么是quickList呢?

它是一個(gè)快速列表,它本身是一個(gè)雙向無(wú)循環(huán)鏈表,它的每一個(gè)節(jié)點(diǎn)都是一個(gè)zipList。從Redis3.2版本開(kāi)始對(duì)于List底層實(shí)現(xiàn),使用quickList代替了zipList和linkedList。

quickList本質(zhì)上來(lái)講是zipList和linkedList的混合體,它把linkedList按段切分,每一段使用zipList來(lái)緊湊存儲(chǔ)若干個(gè)真正的數(shù)據(jù)元素,多個(gè)zipList之間使用雙向指針串接起來(lái)。對(duì)于每個(gè)zipList中最多可存放多大容量的數(shù)據(jù)元素,在配置文件中可以通過(guò)list-max-ziplist-size屬性來(lái)指定。

如何對(duì)它其中的元素進(jìn)行檢索?

?首先我們要清楚的是:對(duì)于List元素的檢索操作,都是使用索引來(lái)操作的。

quickList由一個(gè)一個(gè)的zipList構(gòu)成,每個(gè)zipList的zllen中記錄了當(dāng)前zipList中包含的entry的個(gè)數(shù),根據(jù)要檢索的index,從quickList的頭節(jié)點(diǎn)開(kāi)始,逐個(gè)對(duì)zipList的zllen做求和操作,直到找到第一個(gè)求和后的值大于要檢索的index時(shí),那么要檢索的元素就在這個(gè)zipList當(dāng)中。

如何對(duì)它進(jìn)行元素的插入呢?

由于zipList是有大小限制的,所以在quickList中插入一個(gè)元素則相對(duì)就比較復(fù)雜了。它需要分幾種情況來(lái)處理。

假設(shè)要插入的元素大小為insertBytes,而查找到的插入位置所在zipList當(dāng)前的大小為zlBytes,處理情況則如下:

  • 情況1:當(dāng)insertBytes + zlBytes <= list-max-ziplist-size時(shí),直接插入到zipList中的相應(yīng)位置即可
  • 情況2:當(dāng)insertBytes + zlBytes > list-max-ziplist-size,且插入的位置位于這個(gè)zipList的首部位置時(shí),此時(shí)需要看當(dāng)前zipList的前一個(gè)zipList的大小prev_zlBytes
    • 如果insertBytes + prev_zlBytes <= list-max-ziplist-size時(shí),直接把元素插入到前一個(gè)zipList的尾部位置
    • 如果insertBytes + prev_zlBytes > list-max-ziplist-size時(shí),就會(huì)直接創(chuàng)建一個(gè)新的zipList并連接入quickList中
  • 情況3:當(dāng)insertBytes + zlBytes > list-max-ziplist-size,且插入的位置位于這個(gè)zipList的尾部位置時(shí),此時(shí)需要看當(dāng)前zipList的后一個(gè)zipList的大小next_zlBytes
    • 如果insertBytes + next_zlBytes <= list-max-ziplist-size時(shí),直接把元素插入到后一個(gè)zipList的首部位置
    • 如果insertBytes + next_zlBytes > list-max-ziplist-size時(shí),就會(huì)直接創(chuàng)建一個(gè)新的zipList并連接入quickList中
  • 情況4:當(dāng)insertBytes + zlBytes > list-max-ziplist-size,且插入的位置位于這個(gè)zipList的中間位置時(shí),則會(huì)把zipList分割為兩個(gè)zipList連接入quickList當(dāng)中然后把元素插入到分隔后的前面zipList的尾部

刪除操作如何操作?

對(duì)于刪除操作,只需要注意一點(diǎn),在相應(yīng)的 zipList 中刪除元素后,該 zipList 中是否還有元素。如果沒(méi)有其它元素了,則將該 zipList 刪除,將其前后兩個(gè) zipList 相連接。

關(guān)于Redis中key與value支持的數(shù)量

  • Redis中最多可以處理2^{32}?個(gè)key,大約42億。每個(gè) Redis 實(shí)例至少可以處理 2.5 億個(gè) key
  • 每個(gè)Hash,List,Set,ZSet集合都可以包含2^{32}個(gè)元素

二、BitMap操作

BitMap是什么?

BitMap是Redis2.2.0版本中引入的一種新的數(shù)據(jù)類型。這個(gè)數(shù)據(jù)類型本質(zhì)上就是一個(gè)僅包含0和1二進(jìn)制字符串。而它相關(guān)的命令都是對(duì)這個(gè)字符串二進(jìn)制位的操作。用于描述這個(gè)字符串的屬性有三個(gè):key,offset,bitValue

  • key:BitMap是Redis的key-value中的一種Value的數(shù)據(jù)類型,所以這個(gè)value一定是會(huì)有對(duì)應(yīng)key的
  • offset:每個(gè)BitMap數(shù)據(jù)都是一個(gè)字符串,字符串中的每個(gè)字符都有其對(duì)應(yīng)的索引,這個(gè)索引是從0開(kāi)始計(jì)數(shù)的。該索引則稱為每個(gè)字符在BitMap中的偏移量offset, 它的范圍是[0, 2^{32}-1],所以最大值是42億多。
  • bitValue:每個(gè)BitMap數(shù)據(jù)中都是一個(gè)僅包含0和1的二進(jìn)制字符串,每個(gè)offset位上的字符就稱這個(gè)位的值bitValue,它的值只能是0或者1

相關(guān)操作命令

命令說(shuō)明示例
setbit

為指定key的BitMap數(shù)據(jù)的offset位置上設(shè)置值為value,它的返回值是offset位置的bitValue

對(duì)于原BitMap字符串中不存在的offset進(jìn)行賦值,字符串會(huì)自動(dòng)伸展以確保它可以把value保存到指定的offset上,當(dāng)字符串值進(jìn)行伸展時(shí),空白位置上會(huì)以0來(lái)填充,對(duì)于value值只能是0或者1。

注意:對(duì)于較大的offset的setbit操作來(lái)說(shuō),內(nèi)存分配過(guò)程可以造成Redis服務(wù)器被阻塞

setbit sing 3 1
getbit

對(duì)key所存儲(chǔ)的BitMap字符串值,獲取指定offset偏移量上的位值bitValue

當(dāng)offset比字符串值的長(zhǎng)度大,或者key不存在時(shí),返回0

getbit sing 3
bitcount

統(tǒng)計(jì)給定字符串中被設(shè)置為1的bit位的數(shù)量。一般情況下統(tǒng)計(jì)范圍是給定的整個(gè)BitMap字符串。也可以通過(guò)指定額外的start或end參數(shù),實(shí)現(xiàn)僅對(duì)指定字節(jié)范圍內(nèi)字符串進(jìn)行統(tǒng)計(jì)。

注意:是包含start和end的,且start與end的單位是字節(jié),不是bit,并且從0開(kāi)始計(jì)數(shù),也可以在后帶上BIT選項(xiàng)指定是按bit單位指定統(tǒng)計(jì)

bitcount sing 0 1:這個(gè)命令用來(lái)統(tǒng)計(jì)前兩個(gè)字節(jié),因?yàn)?表示第一個(gè)字節(jié),1表示第二個(gè)字節(jié)

bitcount sing 0 8 BIT:這里指統(tǒng)計(jì)的是0到8位,我們給定了單位選項(xiàng)是BIT

bitpos返回key指定的BitMap中第一個(gè)值為指定值的bit的二進(jìn)制位的位置,默認(rèn)情況下,命令會(huì)檢測(cè)整個(gè)BitMap,也可以指定start參數(shù)與end參數(shù)來(lái)指定檢測(cè)的范圍。start 和end默認(rèn)是字節(jié)為單位,也可以帶上個(gè)單位選項(xiàng)bitpos sing 1 0 0:這里0 0表示就找第一個(gè)字節(jié)中值為1的位是哪位
bitop

對(duì)一個(gè)或多個(gè)BitMap字符串key進(jìn)行二進(jìn)制位操作,并把結(jié)果保存到目標(biāo)key上,對(duì)于操作類型可以是AND,OR,NOT,XOR中的任意一種

AND:表示按位與操作

OR:表示按位或操作

NOT:表示非操作

XOR:表示異或操作

bitop AND result rel sing:AND表示操作,result表示結(jié)果保存的BitMap,rel和sing是兩個(gè)進(jìn)行操作的BitMap

bitop or result rel sing:按位或

bitop not result result:NOT操作只接收一個(gè)進(jìn)行按位操作BitMap,這個(gè)操作表示把result這個(gè)BitMap中各位進(jìn)行取反再寫(xiě)回去

bitop xor result rel sing:按位異或

應(yīng)用場(chǎng)景

由于 offset 的取值范圍很大,所以其一般應(yīng)用于大數(shù)據(jù)量的二值性統(tǒng)計(jì)。

例如平臺(tái)活躍用戶統(tǒng)計(jì)(二值:訪問(wèn)或未訪問(wèn))、支持率統(tǒng)計(jì)(二值:支持或不支持)、員工考勤統(tǒng)計(jì)(二值:上班或未上班)...

注意:對(duì)于數(shù)據(jù)量較小的二值性統(tǒng)計(jì)并不適合 BitMap,可能使用 Set 更為合適。當(dāng)然,具體多少數(shù)據(jù)量適合使用 Set,超過(guò)多少數(shù)據(jù)量適合使用 BitMap,這需要根據(jù)具體場(chǎng)景進(jìn)行具體分析

關(guān)于一個(gè)平臺(tái)統(tǒng)計(jì)日活躍用戶數(shù)量的方案:

方案一:使用set統(tǒng)計(jì)

如果使用 Set 來(lái)統(tǒng)計(jì),只需上線一個(gè)用戶,就將其用戶 ID 寫(xiě)入 Set 集合即可,最后只需統(tǒng)計(jì)出 Set 集合中的元素個(gè)數(shù)即可完成統(tǒng)計(jì)(scard取集合長(zhǎng)度即可)。

方案二:使用BitMap統(tǒng)計(jì)

先定義一個(gè)BitMap,其占有的bit位至少為注冊(cè)用戶數(shù)量,當(dāng)上線一個(gè)用戶,則立即使用其中一個(gè)bit位置為1,最后只需要使用bitcout來(lái)統(tǒng)計(jì)整個(gè)BitCount中為1的個(gè)數(shù)即可。

這兩個(gè)方案使用哪個(gè)合適呢?

這個(gè)要看數(shù)據(jù)量,如果用戶量大活躍用戶比較大則使用BitMap更合適更能節(jié)省內(nèi)存空間。

三、HyperLogLog操用

它是Redis2.8.9版本中引入的一種新的數(shù)據(jù)類型,其意義是hyperlog log,超級(jí)日志記錄。這個(gè)數(shù)據(jù)類型可以簡(jiǎn)單理解為一個(gè)set集合,集合的元素為字符串。

實(shí)際上HyperLogLog是一種基數(shù)計(jì)數(shù)概率算法,通過(guò)這個(gè)算法可以利用極小的內(nèi)存完成獨(dú)立總數(shù)的統(tǒng)計(jì),其所有相關(guān)命令都是對(duì)這個(gè)set集合的操作。

它的命令都是pf開(kāi)頭的,目的是紀(jì)念念 Philippe Flajolet 博士(法國(guó)人)對(duì)組合數(shù)學(xué)和基數(shù)計(jì)算算法分析的研究。

相關(guān)命令

命令說(shuō)明示例
pfadd把任意數(shù)量的元素添加到指定的HyperLogLog集合里,如果內(nèi)部存儲(chǔ)被修改了返回1,否則返回0pfadd p1 sz ls ww?
pfcount這個(gè)命令對(duì)于單個(gè)key時(shí),給定key的HyperLogLog集合的近似基數(shù),對(duì)于多個(gè)key時(shí),返回所有key的HyperLogLog集合的并集的近似基數(shù),如果key不存在則返回0pfcount p1 p2 p3
pfmerge把多個(gè)HyperLogLog集合合并為一個(gè)HyperLogLog集合,并存儲(chǔ)到指定的key中,合并后的HyperLogLog的基數(shù)接近于所有被合并集合的并集pfmerge destpf p1 p3:把p1與p3合并后的集合存在destpf

應(yīng)用場(chǎng)景

HyperLogLog 可對(duì)數(shù)據(jù)量超級(jí)龐大的日志數(shù)據(jù)做不精確的去重計(jì)數(shù)統(tǒng)計(jì)。

注意:這個(gè)統(tǒng)計(jì)不是是精確的!!Redis官方給的誤差在0.81%

四、Geospatial操作

Geospatial,地理空間

Redis在3.2版本中引入的數(shù)據(jù)類型。這個(gè)類型本質(zhì)上仍是一個(gè)集合,只不過(guò)這個(gè)集合元素比較特殊,它是由三個(gè)部分構(gòu)成的數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)稱為空間元素。

  • 經(jīng)度:longitude。有效值是:[-180,180]。正數(shù)表示東經(jīng),負(fù)數(shù)表示西經(jīng)
  • 緯度:latitude。有效緯度是:[-85.05112878,85.05112878]。正的表示北緯,負(fù)的表示南緯
  • 位置名稱:為經(jīng)緯度所標(biāo)注的位置命名和名稱,也稱為Geospatial集合的空間元素名稱

可以通過(guò)這個(gè)類型設(shè)置、查詢某地理位置的經(jīng)緯度,查詢某范圍內(nèi)的空間元素,計(jì)算兩個(gè)空間元素之間的距離等,它的命令都是以geo開(kāi)頭的。

相關(guān)命令

命令說(shuō)明示例
geoadd把一個(gè)或多個(gè)空間元素添加到指定的空間集合中,如果輸入一個(gè)超出范圍的經(jīng)緯度時(shí)會(huì)返回一個(gè)錯(cuò)誤geoadd location 120.58 31.30 sz
geopos從指定的地址空間中返回指定元素(可以指定返回多個(gè)元素)的位置(經(jīng)緯度),返回的值是一個(gè)數(shù)組geopos location sz cd
geodist

返回兩個(gè)給定位置之間的距離,其中unit單位必須是以下單位中的一種(默認(rèn)是米)

m:米

km:千米

mi:英里

ft:英尺

如果兩個(gè)位置之間其中一個(gè)不存在,那么返回空值,計(jì)算距離在極端情況下可能會(huì)產(chǎn)生最大0.5%的差距

geodist location cd sz KM
geohash返回一個(gè)或多個(gè)位置元素的geohash值,這個(gè)geohash是一種地址編碼方法,它可以把二維空間經(jīng)緯度數(shù)據(jù)編碼為一個(gè)字符串,主要用于底層應(yīng)用或者調(diào)試,實(shí)際作用并不大geohash location cd
georadius

以給定的緯度為中心,返回指定地址空間中包含的所有位置元素中,與中心距離不超過(guò)給定半徑。返回的時(shí)候還可以攜帶上額外的信息

  • withdist 返回位置元素的同時(shí),把位置元素與中心距離也一并返回。距離單位與給定的半徑單位一致
  • withcoord?把位置元素的經(jīng)緯度也一并返回
  • withhash?把位置元素的Geohash也一并返回

命令中可以排序位置,可以通過(guò)以下兩個(gè)參數(shù),用戶可以指定被返回位置元素的排序方式

  • ASC?根據(jù)中心的位置,按從近到遠(yuǎn)的方式返回位置元素
  • DESC?根據(jù)中心的位置,按從遠(yuǎn)到近的方式返回位置元素

注意:默認(rèn)情況下,這個(gè)命令會(huì)返回所有匹配的位置元素,雖然可以使用count來(lái)指定獲取前n個(gè)元素,但是命令內(nèi)部可能會(huì)需要對(duì)所有匹配的元素進(jìn)行處理,對(duì)一個(gè)非常大的區(qū)域進(jìn)行搜索時(shí),使用count取少量的元素也可能非常慢。

georadius location 111.6 29.046 100 KM
georadiusbymember這個(gè)命令與georadius是相同的,都是可以找出位于指定范圍內(nèi)的元素,但是這個(gè)命令的中心點(diǎn)是由位置元素給定的而不是單獨(dú)再輸入一個(gè)中心點(diǎn)georadiusbymember location cd 1000 KM
其它因?yàn)镚EO 數(shù)據(jù)實(shí)際上被存儲(chǔ)在有序集合(sorted set)中,所以我們一樣可以使用Sorted set中的一些命令

zrem location p1 p2:刪除其中指定的元素

zrange location 0 -1:遍歷元素
...

應(yīng)用場(chǎng)景

Geospatial 的意義是地理位置,所以其主要應(yīng)用地理位置相關(guān)的計(jì)算。如,微信中的“附近”功能,釘釘中的“距離打卡”...

五、發(fā)布/訂閱操作

發(fā)布/訂閱,也就是pub/sub,是一種消息通信模式。發(fā)布者也就是消息的生產(chǎn)者,生產(chǎn)和發(fā)布消息到存儲(chǔ)系統(tǒng)當(dāng)中,訂閱者也就是消息的消費(fèi)者,從存儲(chǔ)系統(tǒng)中接收和消費(fèi)消息。這個(gè)存儲(chǔ)系統(tǒng)可以是文件系統(tǒng)FS,消息中間件MQ,數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS,也可以是Redis。整個(gè)消息發(fā)布者、訂閱者與存儲(chǔ)系統(tǒng)稱為消息系統(tǒng)。

消息系統(tǒng)中的訂閱者訂閱了某類消息后,只要存儲(chǔ)系統(tǒng)中存在這類消息,就可以不斷地接收并消費(fèi)這些信息。當(dāng)沒(méi)有這類消息后,訂閱者的接收、消費(fèi)會(huì)阻塞,當(dāng)發(fā)布者把消息寫(xiě)入到存儲(chǔ)系統(tǒng)后,立即會(huì)喚醒訂閱者。當(dāng)存儲(chǔ)系統(tǒng)放滿時(shí),不同的發(fā)布者會(huì)有不同的處理方式,比如:阻塞發(fā)布者的發(fā)布,等待可用的存儲(chǔ)空間或者是把多余的消息丟失。

不同的消息系統(tǒng)消息的發(fā)布/訂閱方式也是不同的,如RocketMQ、Kafka等中間件構(gòu)成的消息系統(tǒng)中,發(fā)布/訂閱的消息都是以主題Topic分類的,而Redis當(dāng)中則是以頻道Channel分類的。

?相關(guān)命令

命令說(shuō)明示例
subscribe

redis客戶端通過(guò)一個(gè)subscribe命令可以同時(shí)訂閱任意數(shù)量的頻道,在輸出了訂閱主題后,命令處理阻塞的狀態(tài)等待相關(guān)頻道的消息。

返回訂閱的結(jié)果報(bào)告

subscribe news sports:訂閱news和sports
publishredis客戶端通過(guò)一條publish命令可以發(fā)布一個(gè)頻道的消息,返回值是接收到這個(gè)消息的訂閱者數(shù)量。publish news "this is a fun news"
psubscribe訂閱一個(gè)或多個(gè)符合給定模式的頻道,這里可以指定模式,這個(gè)模式中只能使用*號(hào),如:it* 表示的是可以匹配所有以it開(kāi)頭的頻道,如:it.news,it.blog|,it.tech等都可以匹配到psubscribe it.* news.*
unsubscriberedis客戶端退訂指定的頻道,如果沒(méi)有指定具體的頻道,那么客戶端使用subscribe命令都會(huì)被退訂,這個(gè)命令會(huì)返回一個(gè)信息,告知客戶端所有被退訂的頻道。
punsubscribe這個(gè)與unsubcribe類似只是說(shuō)它退訂的是帶模式的頻道。
pubsub

它是一個(gè)查看訂閱與發(fā)布系統(tǒng)狀態(tài)的內(nèi)省命令集,它由數(shù)個(gè)不同格式的子命令組成

  • pubsub numpat??查詢當(dāng)前redis所有客戶端訂閱的所有頻道模式的數(shù)量總和,注意:它只接收psubscribe訂閱的
  • pusub numsub??返回給定頻道訂閱者數(shù)量。不給定任何頻道則返回一個(gè)空列表。
  • pubsub channels?列出當(dāng)前所有活躍頻道,活躍頻道指的是那些至少有一個(gè)訂閱者的頻道,它有一個(gè)可選的參數(shù)pattern,如果不指定則列出所有活躍頻道,如果指定了則只列出相匹配的活躍頻道,pattern中只能使通配符*

六、Redis事務(wù)

Redis的事務(wù)本質(zhì)上是一組命令的批處理,這組命令在執(zhí)行過(guò)程中會(huì)被順序地,一次性全部執(zhí)行完畢,只要沒(méi)有出現(xiàn)語(yǔ)法錯(cuò)誤,這組命令在執(zhí)行期間是不會(huì)被中斷的。

Redis事務(wù)特性

Redis的事務(wù)只保證數(shù)據(jù)的一致性。

  • 不具備原子性,這組命令中的某些命令執(zhí)行失敗不會(huì)影響到其它命令的執(zhí)行
  • 沒(méi)有復(fù)雜的隔離級(jí)別,這組命令使用樂(lè)觀鎖機(jī)制實(shí)現(xiàn)簡(jiǎn)單的隔離性
  • 這組命令的執(zhí)行結(jié)果是被寫(xiě)入到內(nèi)存的,是否持久化取決于Redis的持久化策略,與事務(wù)無(wú)關(guān)

Redis事務(wù)實(shí)現(xiàn)

三個(gè)命令

Redis事務(wù)通過(guò)三個(gè)命令進(jìn)行控制

muti:開(kāi)始事務(wù)

exec:執(zhí)行事務(wù)

discard:取消事務(wù)

基本使用

在multi執(zhí)行后就會(huì)開(kāi)啟事務(wù),在其后每寫(xiě)的一個(gè)命令都會(huì)放到隊(duì)列當(dāng)中,當(dāng)執(zhí)行exec的時(shí)候才會(huì)一個(gè)一個(gè)執(zhí)行隊(duì)列中的命令。

如果我們事務(wù)開(kāi)啟了并且命令也放到隊(duì)列中了,但是我們此時(shí)執(zhí)行了discard則會(huì)取消所有命令

exec與discard兩者是互斥的。最后要么執(zhí)行exec要么執(zhí)行discard

以上的兩個(gè)命令set age 20 與 incr age是一組,在執(zhí)行過(guò)程中不會(huì)被中斷

如果我們不執(zhí)行exec,而是執(zhí)行discard則會(huì)取消隊(duì)列中的命令執(zhí)行

Redis事務(wù)異常處理

語(yǔ)法錯(cuò)誤

當(dāng)事務(wù)中的命令出現(xiàn)語(yǔ)法錯(cuò)誤時(shí),整個(gè)事務(wù)在exec執(zhí)行時(shí)會(huì)被取消。

因?yàn)樵陉?duì)列中的命令存在錯(cuò)誤的語(yǔ)法,這個(gè)時(shí)候exec會(huì)取消執(zhí)行會(huì)事務(wù)中的命令

執(zhí)行過(guò)程中異常?

如果事務(wù)中的命令沒(méi)有語(yǔ)法錯(cuò)誤,但是在執(zhí)行過(guò)程中出現(xiàn)異常,這個(gè)異常不會(huì)影響到其它命令的執(zhí)行

這里可以看到事務(wù)中的命令都是沒(méi)有語(yǔ)法錯(cuò)誤的,但是在執(zhí)行的時(shí)候第二個(gè)命令出現(xiàn)的執(zhí)行異常,這個(gè)時(shí)候第一個(gè)命令已經(jīng)執(zhí)行成功了,第二個(gè)不會(huì)執(zhí)行。此時(shí)執(zhí)行命令get score會(huì)返回A是因?yàn)檫@個(gè)命令執(zhí)行成功了!

Redis事務(wù)隔離機(jī)制

為什么要隔離呢?

在并發(fā)的場(chǎng)景下可能會(huì)出現(xiàn)多個(gè)客戶端對(duì)同一數(shù)據(jù)進(jìn)行修改的情況。

示例如下:

假設(shè)我們有一個(gè)賬戶,里面有金額100元,A客戶端要扣減80元,B客戶端要扣減50元。首先他們會(huì)去看是否夠扣減,兩個(gè)并發(fā)執(zhí)行查看到的金額是100,這對(duì)于兩者來(lái)說(shuō)都是夠減的,于似乎兩者都進(jìn)行扣減金額的動(dòng)作,這時(shí)候時(shí)候會(huì)出現(xiàn)賬戶“超扣”的情況。

? ? ?

?為了解決這種情況,Redis事務(wù)通過(guò)樂(lè)觀鎖機(jī)制實(shí)現(xiàn)了多線程下的執(zhí)行隔離。

隔離實(shí)現(xiàn)

Redis通過(guò)watch命令再配合事務(wù)實(shí)現(xiàn)了多線程下的執(zhí)行隔離

我們先watch 一個(gè)key,再使用multi開(kāi)事務(wù)

? ?

實(shí)際上我們watch account的時(shí)候,我們不僅看到account的值是100,而且可以看到有一個(gè)版本是1,當(dāng)另一個(gè)客戶端對(duì)這個(gè)值進(jìn)行修改后,account中的版本號(hào)已經(jīng)變?yōu)榱?,此時(shí)在執(zhí)行命令時(shí)會(huì)發(fā)現(xiàn)watch中的account的版本是1小于實(shí)際數(shù)據(jù)的版本2表示現(xiàn)在的版本已經(jīng)過(guò)時(shí)了。執(zhí)行時(shí)就會(huì)取消掉。

版本號(hào)要大于等于原數(shù)據(jù)的版本號(hào)時(shí)才能執(zhí)行,否則不能執(zhí)行。

七、benchmark測(cè)試工具

在Redis安裝安成后會(huì)自動(dòng)安裝一個(gè)redis-benchmark測(cè)試工具,它是一個(gè)壓力測(cè)試工具,用于測(cè)試Redis的性能。

Redis安裝完成后這個(gè)具體在:/usr/local/bin/

通過(guò)redis-benchmark --help命令可以查看到其用法。

常用的一些命令選項(xiàng):

  • -c ?表示并行連接的數(shù)量,默認(rèn)是50
  • -n 表示請(qǐng)求的總數(shù)量,默認(rèn)值是100000
  • -h 表示連接的Redis的ip,如查是本機(jī)可以省略
  • -p 表示Redis的端口號(hào),如果是6379則可以省略
  • -d 表示數(shù)據(jù)的大小,get/set命令時(shí)其操作的value的數(shù)據(jù)長(zhǎng)度,單位字節(jié),默認(rèn)值是3,這個(gè)測(cè)試其它命令的時(shí)候沒(méi)有用
  • -k 表示這些并發(fā)連接的狀態(tài),如果是1表示一直處于連接狀態(tài)(keep alive);0表示中間會(huì)出現(xiàn)斷連然后重連接的情況(reconnect),默認(rèn)值是1

基本測(cè)試

命令:redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 200000

這個(gè)測(cè)試的命令表示使用100個(gè)客戶端并發(fā)連接,總共發(fā)起200000個(gè)請(qǐng)求

測(cè)試的報(bào)告如下(每一個(gè)命令都是一樣的報(bào)告結(jié)構(gòu),下面是set命令測(cè)試報(bào)告結(jié)果):

上在這個(gè)測(cè)試會(huì)把所有命令都測(cè)試一遍

指定命令測(cè)試

命令:?redis-benchmark -t set,lpush,sadd -c 100 -n 100000 -q

上面這個(gè)命令中-n如果是100000表示是默認(rèn)的請(qǐng)求可以省略不寫(xiě);

其它的選項(xiàng)說(shuō)明:

  • -q 表示測(cè)試結(jié)果只給出總述性報(bào)告
  • -t 指定要測(cè)試的命令,多個(gè)命令之間使用逗號(hào)進(jìn)行分隔,不能有空格

通過(guò)benchmark的測(cè)試我們看到,redis的性能非常高,其中還是得益于它對(duì)五種值類型全部進(jìn)行了設(shè)計(jì),經(jīng)過(guò)設(shè)計(jì)后變成了適合于它自己的結(jié)構(gòu)。

http://www.risenshineclean.com/news/33087.html

相關(guān)文章:

  • 怎么用手機(jī)自己做網(wǎng)站巨量引擎廣告投放平臺(tái)登錄入口
  • 一個(gè)做搞笑類視頻的網(wǎng)站取名seo工具下載
  • 做競(jìng)價(jià)網(wǎng)站訪問(wèn)突然變少淮北seo
  • 中山網(wǎng)站設(shè)計(jì)制作免費(fèi)發(fā)廣告的網(wǎng)站大全
  • 備案網(wǎng)站內(nèi)容怎么寫(xiě)信息流推廣渠道
  • 推廣網(wǎng)站排行榜網(wǎng)站推廣和網(wǎng)站優(yōu)化
  • 網(wǎng)絡(luò)營(yíng)銷(xiāo)具體推廣方案seo查詢網(wǎng)站
  • 電子商務(wù)網(wǎng)站建設(shè)個(gè)人總結(jié)推廣學(xué)院seo教程
  • 網(wǎng)站工商備案查詢2020年關(guān)鍵詞排名
  • 如何做一個(gè)網(wǎng)頁(yè)布局如何快速優(yōu)化網(wǎng)站排名
  • 做熟食的網(wǎng)站美食網(wǎng)站東莞最新消息今天
  • 有哪些學(xué)做衣服的網(wǎng)站網(wǎng)站推廣如何引流
  • 淘寶網(wǎng)站建設(shè)協(xié)議谷歌瀏覽器下載手機(jī)版安卓官網(wǎng)
  • 昭陽(yáng)區(qū)住房和城鄉(xiāng)建設(shè)管理局網(wǎng)站重慶關(guān)鍵詞seo排名
  • 京東網(wǎng)上商城投訴電話天津seo托管
  • 網(wǎng)站開(kāi)發(fā)地圖板塊浮動(dòng)青島谷歌優(yōu)化
  • 旅游網(wǎng)站制作百度云網(wǎng)站搜索排名優(yōu)化軟件
  • 定制網(wǎng)站建設(shè)報(bào)價(jià)單網(wǎng)址導(dǎo)航下載到桌面
  • 原創(chuàng)網(wǎng)站模版營(yíng)銷(xiāo)策劃方案模板范文
  • 溫州專業(yè)網(wǎng)站建設(shè)推廣seo信息是什么
  • 南通企業(yè)網(wǎng)頁(yè)制作江西省seo
  • 大連日文網(wǎng)站設(shè)計(jì)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)策劃書(shū)
  • 做網(wǎng)站工具免費(fèi)的seo優(yōu)化工具
  • 哪個(gè)網(wǎng)站可以免費(fèi)做H51+x網(wǎng)店運(yùn)營(yíng)推廣
  • 邢臺(tái)做網(wǎng)站建設(shè)優(yōu)化制作公司企業(yè)建站 平臺(tái)
  • 網(wǎng)站推廣什么意思百度搜圖匹配相似圖片
  • 常州網(wǎng)站優(yōu)化營(yíng)銷(xiāo)軟文小短文
  • 怎么注冊(cè)公司教程鄭州seo排名扣費(fèi)
  • 付費(fèi)的網(wǎng)站是指seo網(wǎng)站排名助手
  • 40萬(wàn)用戶自助建站seo根據(jù)什么具體優(yōu)化