Redis數(shù)據(jù)結(jié)構及應用場景總結(jié)

redis與memcached區(qū)別?

長弓張(memcached):

1伍派、我的系統(tǒng)業(yè)務以純kv的緩存為主,數(shù)據(jù)量剩胁、并發(fā)業(yè)務量大诉植,memcache較為合適。

2昵观、memcache將所有數(shù)據(jù)存儲在物理內(nèi)存中晾腔。redis則有自己的VM機制,當數(shù)據(jù)超量時啊犬,會引發(fā)swap(交換分區(qū))灼擂,影響我的性能。

3觉至、memcache使用多線程的模式(主線程監(jiān)聽剔应,work子線程工作),而redis使用單線程,難以充分利用目前的多核cpu峻贮。

子木李(redis):

1席怪、redis在數(shù)據(jù)持久化提供了兩種方式RDB、AOF月洛,雖然不是那么完美何恶,但是系統(tǒng)發(fā)生崩潰時有這一層聊勝于無孽锥,對不對嚼黔。

2、redis天然高可用惜辑,官方提供了sentinel集群管理工具唬涧,釋放了大量的工作內(nèi)容。

3盛撑、redis能存儲的內(nèi)容較memcached的1M要大多了碎节。

4、redis青出于藍而勝于藍抵卫,代碼質(zhì)量比memcached好多了狮荔。

5、我的系統(tǒng)不僅僅只用了KV介粘,我需要用到redis豐富的數(shù)據(jù)結(jié)構及相關功能函數(shù)殖氏,memcached不適合我的系統(tǒng)。

redis常用的數(shù)據(jù)結(jié)構

字符串鍵

1姻采、結(jié)構類型如下圖:

? ? ?Bits:二進制資源雅采,可以存放文件、圖片類型等

2慨亲、常見操作SET婚瓜、SETNX區(qū)別:SET設置鍵值,SETNX設置一個不存在的鍵值才會生效

3刑棵、使用場景

? ? ? 3.1 字符串鍵-分布式鎖

? ? ? ? ? ?//設置鎖字符串鍵巴刻,若存在則設置失敗

? ? ? ? ? ?SETNX("order",'lock')==1 //成功獲取鎖

? ? ? ? ? ?SETNX(orderKey,'lock')==0 //有人占用資源獲取鎖失敗

? ? ? ? ? ? //業(yè)務處理完畢釋放分布式鎖

? ? ? ? ? ?DEL(orderKey);

? ? ? ? ? ?//設置鎖字符串鍵的失效時間,防止宕機蛉签,系統(tǒng)運行意外冈涧,導致無法釋放鎖

? ? ? ? ? ?PEXPIRE(orderKey,lockMilliSeconds)

? ? ?3.2 字符串鍵-計數(shù)器(帖子閱讀量)

? ? ? ? ? ?// INCR? readcount::{帖子ID}? 每閱讀一次 + 1

? ? ? ? ? ?INCR key? ? ?

? ? ? ? ? ?// GET readcount::{帖子ID}?獲取閱讀量

? ? ? ? ? ?GET key

? ? ? ? ? ?說明:該操作是原子性操作,且redis是單線程操作不存在多線程時安全性問題正蛙,該設計適用于分布式系統(tǒng)

? ? ?3.3 字符串鍵-分布式全局系列

Hash鍵

?1督弓、結(jié)構類型如下圖


?2、Hash鍵意義

? ? ? ? ? ? ?1乒验、Hash鍵可以將信息凝聚在一起愚隧,而不是直接分散的儲存在整個Redis中,這不僅方便了數(shù)據(jù)管理,還可以盡量避免一定的誤操作狂塘;

?????????????2录煤、避免鍵名沖突;

? ? ? ? ? ? ?3荞胡、最主要的意義:減少內(nèi)存占用妈踊;

3、不適合Hash鍵的情況

? ? ? ? ? ? ?1泪漂、過期功能的使用廊营,過期功能只能用在key上;

? ? ? ? ? ? ?2萝勤、二進制操作命令如:SETBIT露筒、GETBIT、BITOP敌卓;

? ? ? ? ? ? ?3慎式、需要考慮數(shù)據(jù)量分布的問題(redis的分布用預Hash巢/虛擬節(jié)點 方式實現(xiàn)如下圖);


列表(List)鍵

?1趟径、結(jié)構類型如下圖


2瘪吏、常見操作

? ? ? lpush key string 在 key 對應 list 頭部添加字符串元素

? ? ? rpush key string 在 key 對應 list 尾部添加字符串元素

? ? ? rpop key 從 list 尾部刪除元素 并返回刪除的元素

? ? ? lpop key 從 list 頭部刪除元素 并返回刪除的元素

? ? ? llen key 返回 key 對應 list 的長度 key 不存在 返回 0 如果key對應的類型不是 list 返回錯誤

? ? ? lrange key start end 返回指定區(qū)間內(nèi)的元素 從下標 0 開始

? ? ? ltrin key start end 截取list 保留指定區(qū)間的元素

3、應用場景

????3.1 基于列表(list)鍵蜗巧,實現(xiàn)阻塞消息隊列


3.2 基于列表(list)鍵掌眠,實現(xiàn)新浪\推特用戶消息列表

集合(SET)鍵

1、結(jié)構類型如下圖

? ? ?結(jié)合鍵結(jié)構具有如下特點:1惧蛹、無序扇救,2、不可重復

2香嗓、常見操作

sadd:將指定的元素添加到集合迅腔。如果集合中存在該元素,則忽略靠娱。 如果集合不存在沧烈,會先創(chuàng)建一個集合然后在添加元素。

srem:移除一個或者多個元素像云,并返回移除的數(shù)量锌雀。

sismember:檢查某個元素是否存在某個集合里面。

scard:返回集合里面元素的數(shù)量迅诬。

smembers:返回集合里面所有的元素腋逆。

srandmember:從集合里面隨機返回一個或者多個元素。

spop:隨機移除一個元素侈贷,返回隨機移除的元素惩歉。

smove:smove source-key dest-key item 如果集合source-key包含元素item,那么從集合source-key里面移除元素item,并添加到集合dest-key里面撑蚌,如果移除成功移除上遥,那么命令返回1,否則返回0争涌。

sdiff:sdiff key-name [key-name …] 返回那些存在于第一個集合粉楚,但不存在其他集合當中的元素(相當于差集運算)。

sdiffstore:sdiffstore store-key key1 [key… ] 將存在于第一個集合亮垫,但不存在其他集合當中的元素(相當于差集運算)找出來模软,并且存到dest-key里面,區(qū)別于上一步就是多了一個保存包警。

sinter:交集運算撵摆。

sinterstore:交集運算并存儲底靠。

sunion:并集運算害晦。

sunionstore:并集運算并存儲。

3暑中、應用場景

? ? ?3.1 集合鍵-直播刷禮物壹瘟、轉(zhuǎn)發(fā)微博等抽獎活動

? ? ? //刷禮物、轉(zhuǎn)發(fā)微博加入到集合中

? ? ? SADD key{userID}

? ? ? //獲取所有用戶鳄逾,大輪盤轉(zhuǎn)起來

? ? ? SMEMBERS key

? ? ? //抽取count名中獎者

? ? ? SPOP key[count] / SRANDMEMBER key[count]

? ? ? 3.2?集合鍵-點贊稻轨、簽到、like等功能

點贊--> SADD like::8001 1001

取消點贊--> SREM? like::8001 1001

檢查用戶是否點過贊-->? SISMEMBER like::8001?1001

獲取點贊的用戶列表-->??SISMEMBER like::8001

獲取點贊用戶數(shù)--> SCARD like::8001

3.3 集合鍵-集合運算

? ?SDIFF:計算差集時以第一個為主

查看共同關注的人模型

seven關注的人: sevenSubKey -->{'qing','mic','james'}

qing關注的人:qingSubKey-->{'seven','jack','mic','james'}

mic關注的人:micSubKey-->{'seven','james','qing','jack','tom'}

我和qing共同關注的人:SINTER?sevenSubKey??qingSubKey -->{'mic','james'}

我關注的人也關注他:SISMEMBER?micSubKey?qing 雕凹、SISMEMBER?micSubKey qing

我可能認識的人:SDIFFSTORE sevenMayKnow qingSubKey?sevenSubKey -->{'seven','jack'}

3.4?集合鍵-集合運算-電商商品刪選

每個商品入庫時建立他的靜態(tài)標簽列表如:品牌殴俱、尺寸、處理器枚抵、內(nèi)存...

錄入:

SADD brand::lenovo 拯救者y7000P-001 ThinkPad-T480

SADD screenSize::15.6 ?拯救者y7000P-001 機械革命Z2AIR

SADD processor::i7??拯救者y7000P-001?機械革命X8TIPlus

SADD memory::8G?拯救者y7000P-001?ThinkPad-T480?機械革命Z2AIR?機械革命X8TIPlus

查找:

SINTER?brand::lenovo?screenSize::15.6??processor::i7??memory::8G -->?拯救者y7000P-001

3.5??集合鍵-集合運算-支付系統(tǒng)對賬

通過兩個交集計算出有問題的訂單

有序集合(Zset)鍵

1线欲、結(jié)構類型如下圖

2、常見操作

2.1 設定/修改命令

zadd key score member [[score member] [score member] ...]

? ? 將一個或多個member元素及其score值加入到key當中

? ? score值可以是整數(shù)值或雙精度浮點數(shù)

? ? 如果某個member已經(jīng)是有序集合的成員汽摹,那么更新這個member的score值

? ? 如果key不存在李丰,創(chuàng)建一個空的有序集并執(zhí)行zadd操作

? ? 返回被成功添加的新成員的數(shù)量,不包括那些被更新的逼泣、已經(jīng)存在的成員

zincrby key increment member

? ? 為key的成員member的score值加上增量increment(可以為負數(shù))

? ? key不存在時創(chuàng)建一個空的有序集并執(zhí)行zincrby操作

? ? member成員不存在時趴泌,創(chuàng)建該成員并設置其score值為0并執(zhí)行zincrby操作

? ? 返回member成員的新score值(字符串形式)

2.2 移除命令

zrem key member [member ...]:移除key中一個或多個成員,不存在的成員將被忽略拉庶。返回被成功移除的成員數(shù)量(不包括被忽略的成員)

zremrangebyrank key start stop:移除key中指定下標區(qū)間內(nèi)(包含start和stop)的所有成員嗜憔。返回移除成員的數(shù)量

zremrangebyscore key min max:

? ? 移除key中score值在min和max之間(包括mi和max)的成員

? ? 可以給參數(shù)min和max前增加"("括號來使結(jié)果不包含

? ? 返回移除成員的數(shù)量

2.3 獲取命令

zrange key start stop [withscores]

? ? 返回key中指定下標(可以為負數(shù))區(qū)間內(nèi)的成員并按score值遞增(從小到大)來排序的列表

? ? 具有相同score值的成員按字典序(lexicographical order)來排列

? ? start大于最大下標或者start>stop,返回空列表

? ? stop大于最大下標將stop當作最大下標來處理

? ? withscores選項讓成員和它的score值一并返回氏仗,返回列表以value1,score1, ..., valueN,scoreN的格式表示

zrevrange key start stop [withscores]:返回key中逆序排序(按score值從大到小)后指定下標(可以為負數(shù))區(qū)間內(nèi)的成員列表

zrangebyscore key min max [withscores] [limit offset count]

? ? 返回key中score值介于min和max之間(包括min和max)的成員

? ? min和max可以是-inf(無限大)和+inf(無限小)吉捶,這樣可以在不知道最低和最高score的情況下使用zrangebyscore這類命令

? ? 可選的limit參數(shù)指定返回結(jié)果的數(shù)量及區(qū)間

? ? withscores選項讓成員和它的score值一并返回

? ? 默認情況下,包括score值等于min和max的成員,可以給參數(shù)min和max前增加"("括號來使結(jié)果不包含帚稠,如:

? ? zrangebyscore zset (1 5:返回所有1<score<=5的成員

? ? zrangebyscore zset (5 (10:返回所有5<score<10的成員

? ? 返回指定區(qū)間內(nèi)的有序集成員的列表

zrevrangebyscore key min max [withscores] [limit offset count]:返回key中score值介于min和max之間(包括min和max)的成員并把這些成員逆序排序(按score值從大到小)

zscore key member:返回key成員member的score值(字符串形式)谣旁,如果member元素不是key的成員或key不存在返回null

2.4 交集并集

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

? ? 計算給定的一個或多個有序集的和集(并集)并將該并集(結(jié)果集)儲存到destination

? ? numkeys為給定key的數(shù)量

? ? weights選項為每個對應的key分別指定一個乘法因子,對應的key所有成員的score值在傳遞給聚合函數(shù)(aggregate)之前都要先乘以該因子滋早,默認為1

? ? aggregat選項指定和集(并集)的結(jié)果集中score值的聚合方式

? ? ? ? 默認為sum榄审,將所有集合中某個相同成員的score值之和作為結(jié)果集中該成員的score值;

? ? ? ? min將所有集合中某個相同成員中最小的score值作為結(jié)果集中該成員的score值杆麸;

? ? ? ? max將所有集合中某個相同成員最大的score值作為結(jié)果集中該成員的score值

? ? 返回保存到 destination 的結(jié)果集的基數(shù)搁进。

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

? ? 計算給定的一個或多個有序集的交集并將該交集(結(jié)果集)儲存到destination

? ? 參數(shù)的用法和zunionstore相同

3、ZSet運算模型(可用于報表統(tǒng)計)

4昔头、應用場景

4.1 ZSet集-自動補齊功能

用戶首次進入搜索abc進行查詢

?//對abc進行分詞 a:key饼问,1:sorce(說明當用戶2也進行abc搜索時對應的key+1,實現(xiàn)熱度排序)揭斧,abc:member

ZINCRBY a 1 abc? ?

ZINCRBY ab 1 abc? ?

ZINCRBY abc 1 abc? ?

用戶在輸入abd進行查詢

ZINCRBY a 1 abd

ZINCRBY ab 1 abd

ZINCRBY abd 1 abd

用戶進行搜索時 輸入 a莱革,后臺執(zhí)行 ZREVRANGE a 0 -1 -->{abc,abd}?

4.1 ZSet集-單日排行榜

//點擊第一條“馬蓉怒斥王寶強?”,設置為熱詞

ZADD hotNews::{11-11} 1??

//給對應熱詞+1

ZINCRBY hotNews::{11-11} 1?

//倒敘取10條

ZREVRANGE?hotNews::{11-11}? 0 10 WITHSCORES

4.1?ZSet集-周讹开、月盅视、年排行榜

//并集計算 11.19號-11.25號

ZUNIONSTORE hotNews{11.19-11.25}?hotNews{11.19}??hotNews{11.19-11.20} ...hotNews{11.25}?

//取11.19-11.25倒敘的前十

ZREVRANGE?hotNews{11.19-11.25} 0 10?WITHSCORES

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旦万,隨后出現(xiàn)的幾起案子闹击,更是在濱河造成了極大的恐慌,老刑警劉巖成艘,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赏半,死亡現(xiàn)場離奇詭異,居然都是意外死亡淆两,警方通過查閱死者的電腦和手機断箫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼腔,“玉大人瑰枫,你說我怎么就攤上這事〉ち” “怎么了光坝?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甥材。 經(jīng)常有香客問我盯另,道長,這世上最難降的妖魔是什么洲赵? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任鸳惯,我火速辦了婚禮商蕴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芝发。我一直安慰自己绪商,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布辅鲸。 她就那樣靜靜地躺著格郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪独悴。 梳的紋絲不亂的頭發(fā)上例书,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音刻炒,去河邊找鬼决采。 笑死,一個胖子當著我的面吹牛坟奥,可吹牛的內(nèi)容都是我干的树瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼筏勒,長吁一口氣:“原來是場噩夢啊……” “哼移迫!你這毒婦竟也來了旺嬉?” 一聲冷哼從身側(cè)響起管行,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邪媳,沒想到半個月后捐顷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雨效,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年迅涮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽龟。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡叮姑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出据悔,到底是詐尸還是另有隱情传透,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布极颓,位于F島的核電站朱盐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菠隆。R本人自食惡果不足惜兵琳,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一狂秘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躯肌,春花似錦者春、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至校仑,卻和暖如春忠售,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迄沫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工稻扬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羊瘩。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓泰佳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尘吗。 傳聞我的和親對象是個殘疾皇子逝她,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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