Redis 基本数据类型 :String、Hash、List、Set、ZSet
文章目錄
- 字符串類型
- 基本用法
- 使用場(chǎng)景
- 哈希類型
- 基本用法
- 使用場(chǎng)景
- 列表類型
- 基本用法
- 使用場(chǎng)景
- 集合類型
- 基本用法
- 使用場(chǎng)景
- 有序集合類型
- 基本用法
- 使用場(chǎng)景
字符串類型
字符串類型(SDS)即簡(jiǎn)單動(dòng)態(tài)字符串,它是以鍵值對(duì)key-value的形式進(jìn)行存儲(chǔ)的,根據(jù) key 來(lái)存儲(chǔ)和獲取value值
依據(jù)不同情況,字符串在底層會(huì)使用 int 、 raw 或者 embstr 三種不同的編碼格式
- 如果數(shù)據(jù)為可以使用long類型來(lái)保存的整數(shù),則使用int
- 如果數(shù)據(jù)為可以使用long double類型來(lái)保存的浮點(diǎn)數(shù),則使用embstr或者raw
- 如果數(shù)據(jù)為字符串,或者長(zhǎng)度過(guò)大沒(méi)辦法用long來(lái)表示的整數(shù),以及長(zhǎng)度過(guò)大無(wú)法用long double表示的浮點(diǎn)數(shù),則使用embstr或者raw。當(dāng)數(shù)據(jù)小于39字節(jié)時(shí),使用embstr,當(dāng)大于39字節(jié)時(shí)使用raw
基本用法
127.0.0.1:6379> set hello world //設(shè)置key-value OK 127.0.0.1:6379> get hello //根據(jù)key獲取value "world" 127.0.0.1:6379> strlen hello //計(jì)算value長(zhǎng)度 (integer) 5使用場(chǎng)景
- 存放用戶(登錄)信息;
- 存放文章詳情和列表信息;
- 存放和累計(jì)網(wǎng)頁(yè)的統(tǒng)計(jì)信息。
哈希類型
字典類型 (Hash) 又被成為散列類型或者是哈希表類型,它是將?個(gè)鍵值 (key) 和?個(gè)特殊的“哈希表”關(guān)聯(lián)起來(lái)。
哈希類型的底層數(shù)據(jù)結(jié)構(gòu)可以是壓縮列表(ZipList)或者字典(Dict)
- 當(dāng)哈希對(duì)象的所有鍵值對(duì)的鍵和值的字符串長(zhǎng)度都小于64字節(jié),并且保存的鍵值對(duì)數(shù)量小于512個(gè)時(shí),使用壓縮列表
- 如果不滿足上述條件中的任意一個(gè),都會(huì)使用字典
基本用法
127.0.0.1:6379> hset hash1 name lee age 20 //設(shè)置key-value的映射 (integer) 2 127.0.0.1:6379> hget hash1 name //獲取key為name的value "lee" 127.0.0.1:6379> hget hash1 age //獲取key為age的value "20"使用場(chǎng)景
- 存儲(chǔ)用戶信息或者某個(gè)物品的信息,無(wú)需序列化,直接建立映射
列表類型
列表類型 (List) 是?個(gè)使用線性結(jié)構(gòu)存儲(chǔ)的結(jié)構(gòu),它的元素插入會(huì)按照先后順序存儲(chǔ)到鏈表結(jié)構(gòu)中。
列表類型的底層數(shù)據(jù)結(jié)構(gòu)可以是壓縮列表(ZipList)或者鏈表(LinkedList)
- 當(dāng)列表對(duì)象的所有字符串元素長(zhǎng)度都小于64字節(jié),并且保存的元素?cái)?shù)量小于512個(gè)時(shí),使用壓縮列表
- 如果不滿足上述條件中的任意一個(gè),都會(huì)使用鏈表
基本用法
127.0.0.1:6379> lpush list1 1 2 3 4 5 //依次頭插1 2 3 4 5,此時(shí)數(shù)據(jù)為5 4 3 2 1 (integer) 5 127.0.0.1:6379> rpop list1 //尾刪 "1" 127.0.0.1:6379> lpop list1 //頭刪 "5"使用場(chǎng)景
- 消息隊(duì)列:列表類型可以使用 rpush 實(shí)現(xiàn)先進(jìn)先出的功能,同時(shí)又可以使用 lpop 輕松的彈出(查詢并刪除)第?個(gè)元素,所以列表類型可以用來(lái)實(shí)現(xiàn)消息隊(duì)列;
- 文章列表:對(duì)于博客站點(diǎn)來(lái)說(shuō),當(dāng)用戶和文章都越來(lái)越多時(shí),為了加快程序的響應(yīng)速度,我們可以把用戶自己的文章存入到 List 中,因?yàn)?List 是有序的結(jié)構(gòu),所以這樣不僅可以完美的實(shí)現(xiàn)分頁(yè)功能,而且加速了程序的響應(yīng)速度。
集合類型
集合類型 (Set) 是?個(gè)無(wú)序并唯?的鍵值集合。
集合類型的底層數(shù)據(jù)結(jié)構(gòu)可以是整數(shù)集合(IntSet)或者字典(Dict)
- 當(dāng)集合對(duì)象的所有元素都是整數(shù)值,并且保存的元素?cái)?shù)量小于512個(gè)時(shí),使用整數(shù)集合
- 如果不滿足上述條件中的任意一個(gè),都會(huì)使用字典
基本用法
127.0.0.1:6379> sadd testSet v1 v2 v3 v4 v2 v4 v1 (integer) 4 127.0.0.1:6379> smembers testSet //去重且無(wú)序 1) "v2" 2) "v1" 3) "v4" 4) "v3"使用場(chǎng)景
- 微博關(guān)注我的人和我關(guān)注的人都適合用集合存儲(chǔ),可以保證人員不會(huì)重復(fù);
- 中獎(jiǎng)人信息也適合用集合類型存儲(chǔ),這樣可以保證?個(gè)人不會(huì)重復(fù)中獎(jiǎng)。
有序集合類型
有序集合類型 (SortedSet) 相比于集合類型多了?個(gè)排序?qū)傩?score(分值),所以對(duì)于有序集合ZSet 來(lái)說(shuō),每個(gè)存儲(chǔ)元素相當(dāng)于有兩個(gè)值組成的,?個(gè)是有序結(jié)合的元素值,?個(gè)是分值。有序集合的存儲(chǔ)元素值也是不能重復(fù)的,但分值是可以重復(fù)的。
有序集合類型的底層數(shù)據(jù)結(jié)構(gòu)可以是壓縮列表(ZipList)或者跳表(SkipList )
- 當(dāng)有序集合對(duì)象的所有元素成員的長(zhǎng)度都小于64字節(jié),并且保存的元素?cái)?shù)量小于128個(gè)時(shí),使用壓縮列表
- 如果不滿足上述條件中的任意一個(gè),都會(huì)使用跳表(這里的跳表是結(jié)合字典的)
這里不是直接使用跳表,而是搭配字典一起使用
之所以這樣設(shè)置是因?yàn)榭紤]到如果直接使用跳躍表,如果需要查找成員的分值時(shí)只能通過(guò)遍歷來(lái)進(jìn)行查找,而這樣的效率是O(logN)
而字典雖然建立映射后可以O(shè)(1)的查找到分值,但是哈希只能通過(guò)key值進(jìn)行查找,并不支持范圍查詢。
所以將兩者進(jìn)行結(jié)合,使用字典建立起元素與分值的映射,使用字典來(lái)進(jìn)行成員分?jǐn)?shù)的查找,而使用跳躍表來(lái)進(jìn)行范圍型操作,這樣就很好的解決了這個(gè)問(wèn)題。
基本用法
127.0.0.1:6379> zadd zset1 3 v1 8 v2 2 v3 6 v4 #插入時(shí)以分值-值的形式插入 (integer) 4 127.0.0.1:6379> zrange zset1 0 -1 #查找結(jié)果按照升序排序 1) "v3" 2) "v1" 3) "v4" 4) "v2"使用場(chǎng)景
- 學(xué)生成績(jī)排名;
- 粉絲列表,根據(jù)關(guān)注的先后時(shí)間排序。
總結(jié)
以上是生活随笔為你收集整理的Redis 基本数据类型 :String、Hash、List、Set、ZSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是缓存?为什么要使用Redis?
- 下一篇: linux cmake编译源码,linu