日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis:07---Redis数据结构

發(fā)布時(shí)間:2023/12/13 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis:07---Redis数据结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、五大數(shù)據(jù)結(jié)構(gòu)

  • Redis可以存儲(chǔ)鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這5種數(shù)據(jù)結(jié)構(gòu)類型分別為:

    • STRING:字符串

    • LIST:列表

    • SET:集合

    • HASH:散列

    • ZSET:有序集合

TYPE命令

  • 用來獲得鍵的數(shù)據(jù)類型,而不是鍵值的數(shù)據(jù)類型

  • 返回值:

    • string:字符串類型

    • hash:散列類型

    • list:列表類型

    • set:集合類型

    • zet:有序集合類型

二、內(nèi)部編碼

  • 實(shí)際上每種數(shù)據(jù)結(jié)構(gòu)都有自己底層的內(nèi)部編碼實(shí)現(xiàn),而且是多種實(shí)現(xiàn), 這樣Redis會(huì)在合適的場(chǎng)景選擇合適的內(nèi)部編碼,如下圖所示

  • 關(guān)于這些數(shù)據(jù)結(jié)構(gòu)的詳細(xì)介紹可以參閱后續(xù)的文章

  • Redis這樣設(shè)計(jì)有兩個(gè)好處:

    • 第一,可以改進(jìn)內(nèi)部編碼,而對(duì)外的數(shù)據(jù)結(jié)構(gòu)和命令沒有影響,這樣一旦開發(fā)出更優(yōu)秀的內(nèi)部編碼,無需改動(dòng)外部數(shù) 據(jù)結(jié)構(gòu)和命令,例如Redis3.2提供了quicklist,結(jié)合了ziplist和linkedlist兩者的優(yōu)勢(shì),為列表類型提供了一種更為優(yōu)秀的內(nèi)部編碼實(shí)現(xiàn),而對(duì)外部用戶來 說基本感知不到

    • 第二,多種內(nèi)部編碼實(shí)現(xiàn)可以在不同場(chǎng)景下發(fā)揮各自的優(yōu)勢(shì),例如ziplist比較節(jié)省內(nèi)存,但是在列表元素比較多的情況下,性能會(huì)有 所下降,這時(shí)候Redis會(huì)根據(jù)配置選項(xiàng)將列表類型的內(nèi)部實(shí)現(xiàn)轉(zhuǎn)換為 linkedlist

OBJECT ENCODING命令

  • 該命令用來返回?cái)?shù)據(jù)結(jié)構(gòu)的內(nèi)部編碼

、再說五種結(jié)構(gòu)

這里我不會(huì)講的太深入,深入的內(nèi)容會(huì)在后續(xù)章節(jié),每個(gè)數(shù)據(jù)結(jié)構(gòu)作為一個(gè)專題來具體講。

1.String 字符串類型

是redis中最基本的數(shù)據(jù)類型,一個(gè)key對(duì)應(yīng)一個(gè)value。

String類型是二進(jìn)制安全的,意思是 redis 的 string 可以包含任何數(shù)據(jù)。如數(shù)字,字符串,jpg圖片或者序列化的對(duì)象。

使用:get 、 set 、 del 、 incr、 decr 等

127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world" 127.0.0.1:6379> del hello (integer) 1 127.0.0.1:6379> get hello (nil) 127.0.0.1:6379> get counter "2" 127.0.0.1:6379> incr counter (integer) 3 127.0.0.1:6379> get counter "3" 127.0.0.1:6379> incrby counter 100 (integer) 103 127.0.0.1:6379> get counter "103" 127.0.0.1:6379> decr counter (integer) 102 127.0.0.1:6379> get counter "102"

實(shí)戰(zhàn)場(chǎng)景:

1.緩存:經(jīng)典使用場(chǎng)景,把常用信息,字符串,圖片或者視頻等信息放到redis中,redis作為緩存層,mysql做持久化層,降低mysql的讀寫壓力。

2.計(jì)數(shù)器:redis是單線程模型,一個(gè)命令執(zhí)行完才會(huì)執(zhí)行下一個(gè),同時(shí)數(shù)據(jù)可以一步落地到其他的數(shù)據(jù)源。

3.session:常見方案spring session + redis實(shí)現(xiàn)session共享,

?

2.Hash (哈希)

是一個(gè)Mapmap,指值本身又是一種鍵值對(duì)結(jié)構(gòu),如 value={{field1,value1},......fieldN,valueN}}

?

使用:所有hash的命令都是? h ??開頭的? ? ?hget ?、hset 、? hdel 等

127.0.0.1:6379> hset user name1 hao (integer) 1 127.0.0.1:6379> hset user email1 hao@163.com (integer) 1 127.0.0.1:6379> hgetall user 1) "name1" 2) "hao" 3) "email1" 4) "hao@163.com" 127.0.0.1:6379> hget user user (nil) 127.0.0.1:6379> hget user name1 "hao" 127.0.0.1:6379> hset user name2 xiaohao (integer) 1 127.0.0.1:6379> hset user email2 xiaohao@163.com (integer) 1 127.0.0.1:6379> hgetall user 1) "name1" 2) "hao" 3) "email1" 4) "hao@163.com" 5) "name2" 6) "xiaohao" 7) "email2" 8) "xiaohao@163.com"

實(shí)戰(zhàn)場(chǎng)景:

1.緩存:能直觀,相比string更節(jié)省空間,的維護(hù)緩存信息,如用戶信息,視頻信息等。

?

?3.鏈表?

List 說白了就是鏈表(redis 使用雙端鏈表實(shí)現(xiàn)的 List),是有序的,value可以重復(fù),可以通過下標(biāo)取出對(duì)應(yīng)的value值,左右兩邊都能進(jìn)行插入和刪除數(shù)據(jù)。

使用列表的技巧

  • lpush+lpop=Stack(棧)

  • lpush+rpop=Queue(隊(duì)列)

  • lpush+ltrim=Capped Collection(有限集合)

  • lpush+brpop=Message Queue(消息隊(duì)列)

?

使用:

?

127.0.0.1:6379> lpush mylist 1 2 ll ls mem (integer) 5 127.0.0.1:6379> lrange mylist 0 -1 1) "mem" 2) "ls" 3) "ll" 4) "2" 5) "1" 127.0.0.1:6379>

實(shí)戰(zhàn)場(chǎng)景:

1.timeline:例如微博的時(shí)間軸,有人發(fā)布微博,用lpush加入時(shí)間軸,展示新的列表信息。

?

4.Set? ?集合

集合類型也是用來保存多個(gè)字符串的元素,但和列表不同的是集合中? 1. 不允許有重復(fù)的元素,2.集合中的元素是無序的,不能通過索引下標(biāo)獲取元素,3.支持集合間的操作,可以取多個(gè)集合取交集、并集、差集。

?

?

使用:命令都是以s開頭的? sset 、srem、scard、smembers、sismember

?

127.0.0.1:6379> sadd myset hao hao1 xiaohao hao (integer) 3 127.0.0.1:6379> SMEMBERS myset 1) "xiaohao" 2) "hao1" 3) "hao" 127.0.0.1:6379> SISMEMBER myset hao (integer) 1

實(shí)戰(zhàn)場(chǎng)景;

1.標(biāo)簽(tag),給用戶添加標(biāo)簽,或者用戶給消息添加標(biāo)簽,這樣有同一標(biāo)簽或者類似標(biāo)簽的可以給推薦關(guān)注的事或者關(guān)注的人。

2.點(diǎn)贊,或點(diǎn)踩,收藏等,可以放到set中實(shí)現(xiàn)

?

5.zset? 有序集合

有序集合和集合有著必然的聯(lián)系,保留了集合不能有重復(fù)成員的特性,區(qū)別是,有序集合中的元素是可以排序的,它給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù),作為排序的依據(jù)。

(有序集合中的元素不可以重復(fù),但是score 分?jǐn)?shù) 可以重復(fù),就和一個(gè)班里的同學(xué)學(xué)號(hào)不能重復(fù),但考試成績可以相同)。

?

使用:有序集合的命令都是 以? z ?開頭? ? zadd 、 zrange、 zscore

?

127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao (integer) 2 127.0.0.1:6379> ZRANGE myscoreset 0 -1 1) "xiaohao" 2) "hao" 127.0.0.1:6379> ZSCORE myscoreset hao "100"

實(shí)戰(zhàn)場(chǎng)景:

1.排行榜:有序集合經(jīng)典使用場(chǎng)景。例如游戲的每日排行,周排行榜,以及一個(gè)系統(tǒng)模塊,玩法的排行榜,榜單可以按照用戶的分?jǐn)?shù),更新時(shí)間等做權(quán)重,做排行。

總結(jié)

以上是生活随笔為你收集整理的Redis:07---Redis数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。