redis的五種數(shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景【如微博微信點(diǎn)贊/共同關(guān)注/加購物車】

Redis五種數(shù)據(jù)結(jié)構(gòu)如下:

file

1.String 字符串類型

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

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

2.Hash (哈希)

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

3.鏈表 (List)

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

4.Set 集合

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

5.zset 有序集合

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

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

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

file
file

1. 單值緩存

Set Key Value

Get Key

2. 對(duì)象緩存

1.Set user:1 value (json格式數(shù)據(jù))

2.MSet user:1:name guajia use:1:balance 1888

MGet user1:name user:1:balance

3. 分布式鎖:

3.1 分布式運(yùn)用場(chǎng)景一【下單減庫存】

file

如圖標(biāo)紅的部分摊欠,如果是單體架構(gòu) 我們一般是這樣來實(shí)現(xiàn)減庫存操作的 但是在高并發(fā)的互聯(lián)網(wǎng)公司這樣做丢烘,就會(huì)造成“超賣”的現(xiàn)象。所以就需要redis來實(shí)現(xiàn)分布式鎖

如上圖標(biāo)記SETNX命令 它只會(huì)存入一個(gè)不存在的鍵值對(duì)些椒,如果不會(huì)改變?cè)瓉淼膋ey所存入的值播瞳,返回結(jié)果為0

SETNX product:10001 true //返回1代表獲取鎖成功 返回0代表獲取鎖失敗

---》 執(zhí)行業(yè)務(wù)操作


file

【這樣如果setnx 命令返回0 直接扔給前端后端服務(wù)正忙 請(qǐng)稍后重試】
DEL product:10001 //執(zhí)行完業(yè)務(wù)用它來釋放鎖

SET product:10001 true ex 10 nx //防止程序意外終止而導(dǎo)致死鎖

3.2 分布式運(yùn)用場(chǎng)景二【公眾號(hào)閱讀量】


file

INCR 命令 每次執(zhí)行 所存儲(chǔ)的key的值 數(shù)量加1 (如果用數(shù)據(jù)庫的話 需要考慮并發(fā)和加鎖)
【注:redis是個(gè)單線程應(yīng)用程序 這樣不會(huì)導(dǎo)致高并發(fā)的臟讀,主從的redis 在后面會(huì)使用分布式鎖,一般單體的redis并發(fā)量在9-10萬左右 】

file

3.3 分布式運(yùn)用場(chǎng)景三 【 Web集群的session 共享 】

原理是把原有的tomcat存儲(chǔ)用戶信息轉(zhuǎn)為redis 把用戶的信息 序列化后 存入redis免糕。

3.4 分布式運(yùn)用場(chǎng)景四【 分布式系統(tǒng)全局序列號(hào) 】

INCRBY orderId 1000 // redis 批量生成序列號(hào)提升性能

如項(xiàng)目使用 分庫分表 赢乓,就可以使用這個(gè) ,目的是讓主鍵ID 在都是唯一的 石窑,這個(gè)在實(shí)際場(chǎng)景非常重要牌芋。

使用INCRBY orderId 1000 (這個(gè)命令是一次生成1000個(gè)訂單id 供下次生成訂單使用)

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

file

大家仔細(xì)看 Hset key field value 比string多出來了一個(gè)field

file
file

Hash應(yīng)用場(chǎng)景一 【電商購物車】

file
file

如圖先是剛加入購物車的商品使用 hset cart:1001 10088 1,啥意思 cart代表的購物車 當(dāng)然這個(gè)key 你可以隨意定 但是意義要讓所有人清楚,:1001 這里代表的是用戶id松逊,后面的10088 代表的是商品id躺屁。

第二步 點(diǎn)擊 購物車的增加商品按鈕 可以使用hincrby 命令 對(duì)已有值進(jìn)行增量操作

有人可能會(huì)問,如果減少加購數(shù)量经宏?騷年 你太年輕了 可以把增量的值調(diào)為-1 那每次就是減1

獲取購物車商品總數(shù) hlen cart:1001 [這邊把商品id去掉就行了 前提是你所有的加購設(shè)置key 和field的格式是一樣的 不然查出來的數(shù)量肯定不對(duì)]
//它返回的是key下的所有field數(shù)量

涉及刪除商品犀暑,使用刪除的命令 hdel cart:1001 10088

獲取加購商品的總數(shù)量 使用hgetall cart:1001 //它返回的key下的所有鍵值,可以把所有的值加起來就是加購商品總數(shù)量


file

hash的優(yōu)點(diǎn) 缺點(diǎn)

file

hash的會(huì)分配槽位烛恤,集群中 會(huì)導(dǎo)致數(shù)據(jù)過于集中母怜,沒辦法做分片。

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

file

仔細(xì)看命令前綴 有L 和R 分別代表左和右缚柏。

常用的數(shù)據(jù)結(jié)構(gòu)

file

: LPUSH +LPOP = > 放進(jìn)去的數(shù)據(jù)放在左邊 導(dǎo)致最后放進(jìn)去的元素處于棧頂 最先的元素是處于棧底 使用LPOP 取值【或稱移除值】是先從最左側(cè)【棧頂】取值的 符合 先進(jìn)后出的規(guī)則 【FILO】

隊(duì)列: 與上面相反 取值時(shí)是使用RPOP 是 移除值是從最右側(cè)開始的 所有最后進(jìn)入的會(huì)被取出 符合 隊(duì)列的先進(jìn)先出的規(guī)則【FIFO】

**BLOCKIng MQ(阻塞隊(duì)列) **: = LPUSH +BRPOP
[這個(gè)就是一個(gè)消息隊(duì)列 碟贾,消息隊(duì)列中有個(gè)發(fā)送者 和 接受者 ]

BRPOP 就是從key列表尾彈出一個(gè)元素币喧,如果列表中沒有元素,就會(huì)一直處于阻塞等待多少秒袱耽,后面又會(huì)循環(huán)的執(zhí)行 直到取到元素為止

運(yùn)用的場(chǎng)景一 【微博和公眾號(hào)的消息流】

file

如微博你關(guān)注了1000個(gè)大V 每個(gè)大V 一天放兩條數(shù)據(jù) 杀餐,有1億用戶 。那么數(shù)據(jù)量有多大朱巨∈非蹋可能有幾百M(fèi)的數(shù)據(jù)。 如果使用數(shù)據(jù)庫 查詢效率那就不是很高了

比如 你關(guān)注了小明和小紅冀续。

小明發(fā)了一條消息: 使用 LPUSH msg:小明Id 消息Id
小紅發(fā)了一條消息: 使用 LPUSH msg:小紅Id 消息Id

查看最新的微博消息: 使用LRANGE msg:小紅Id 0 4 這個(gè)就是從左側(cè)取下標(biāo)是0到4的消息 意味著是取小紅發(fā)的最新的5條消息的消息ID 進(jìn)而從緩存里面取出對(duì)應(yīng)的消息內(nèi)容

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

file

常見命令

file

運(yùn)用的場(chǎng)景一 【微信抽獎(jiǎng)】

file

1.參與抽獎(jiǎng): SADD key 用戶id : 參與了用戶的id

2.查看參與抽獎(jiǎng)的又會(huì): SMEMBERS key

  1. 抽取n名中中獎(jiǎng)?wù)?/li>

方式一:DMEMBER key [count]

方式二: SPOP key [count]

方式一和方式二的運(yùn)用常見是 方式一 只有中獎(jiǎng)單一 沒有多次抽和設(shè)置獎(jiǎng)品等級(jí)琼讽。因?yàn)榉绞揭?每次執(zhí)行不會(huì)把抽取的數(shù)據(jù)刪掉,后面執(zhí)行還可能會(huì)抽取到原來的用戶

[ SRANDMEMBER key [count] 返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)]

file

運(yùn)用的場(chǎng)景二 【微信微博點(diǎn)贊洪唐、收藏钻蹬、標(biāo)簽】

file

ps: like:{消息ID} 就是 key {用戶ID} 是 member

運(yùn)用的場(chǎng)景三【微信微博關(guān)注模型】

file

SDIFF set1 set2 set3 是以 set1為基準(zhǔn) 求 與set2和set3的并集 的差集

[得到a是set2和set3的并集中所沒有的】

關(guān)注模型:

  1. 你關(guān)注的人

set guanzhu:我的id {張三、李四凭需、王五问欠、小明肝匆、程咬金}

2.小明關(guān)注的人

set guanzhu:小明的id {張三、趙六顺献、尼古拉斯}

3.程咬金關(guān)注的人

set guanzhu:程咬金的id {小明旗国、李四}

  1. 我和小明的共同關(guān)注:

SINTER guanzhu:我的id guanzhu:小明的id

得到就是 張三

5.我關(guān)注的人也在關(guān)注他 【我關(guān)注的某人 否也關(guān)注小明】

SISMEMBER guanzhu:程咬金的id 小明的ID

SISMEMBER guanzhu:張三的id 小明的ID

SISMEMBER //判斷 member 元素是否是集合 key 的成員

  1. 我可能認(rèn)識(shí)的人

SDIFF guanzhu:小明的id 我的ID

獲取小明關(guān)注的人和我關(guān)注人的差集 【就是我關(guān)注人我沒有關(guān)注他】

本文來源于:宋文超super,專屬平臺(tái)有csdn注整、思否(SegmentFault)粗仓、 簡(jiǎn)書、 開源中國(guó)(oschina)设捐、掘金借浊,轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝招,一起剝皮案震驚了整個(gè)濱河市蚂斤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌槐沼,老刑警劉巖曙蒸,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岗钩,居然都是意外死亡纽窟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門兼吓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臂港,“玉大人,你說我怎么就攤上這事视搏∩竽酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵浑娜,是天一觀的道長(zhǎng)佑力。 經(jīng)常有香客問我,道長(zhǎng)筋遭,這世上最難降的妖魔是什么打颤? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮漓滔,結(jié)果婚禮上编饺,老公的妹妹穿的比我還像新娘。我一直安慰自己次和,他們只是感情好反肋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踏施,像睡著了一般石蔗。 火紅的嫁衣襯著肌膚如雪罕邀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天养距,我揣著相機(jī)與錄音诉探,去河邊找鬼。 笑死棍厌,一個(gè)胖子當(dāng)著我的面吹牛肾胯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耘纱,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼敬肚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了束析?” 一聲冷哼從身側(cè)響起艳馒,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎员寇,沒想到半個(gè)月后弄慰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝶锋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年陆爽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扳缕。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慌闭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出第献,到底是詐尸還是另有隱情贡必,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布庸毫,位于F島的核電站,受9級(jí)特大地震影響衫樊,放射性物質(zhì)發(fā)生泄漏飒赃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一科侈、第九天 我趴在偏房一處隱蔽的房頂上張望载佳。 院中可真熱鬧,春花似錦臀栈、人聲如沸蔫慧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑躲。三九已至睡扬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黍析,已是汗流浹背卖怜。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阐枣,地道東北人马靠。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔼两,于是被迫代替她去往敵國(guó)和親甩鳄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容