Redis在大數(shù)據(jù)中的應(yīng)用

?導(dǎo)讀

redis是一個基于內(nèi)存的key-value數(shù)據(jù)庫,相對關(guān)系型數(shù)據(jù)庫支持的數(shù)據(jù)結(jié)構(gòu)更豐富拇泛,而且操作封裝的非常簡單易用。redis也支持主從熄守、分布式、數(shù)據(jù)持久化等特性牍氛。

? ?redis在業(yè)務(wù)系統(tǒng)中經(jīng)常用作緩存系統(tǒng),即把熱點數(shù)據(jù)或高頻數(shù)據(jù)存到Redis唉擂,降低底層數(shù)據(jù)庫負(fù)載、提高應(yīng)用吞吐率空扎;redis靈活的數(shù)據(jù)結(jié)構(gòu)也能解決特定大數(shù)據(jù)統(tǒng)計中的痛點,這里結(jié)合實際項目撮慨,舉些典型應(yīng)用場景影涉,以及個人的理解,當(dāng)然也是蜻蜓點水,泛泛而談萧朝,希望大方向上能對大家有所幫助竖配,當(dāng)然有不正之處也請不吝賜教用爪。

Sets

集合的最主要特征是成員唯一性,最常用場景是一些涉及到去重的計算颇玷,比如UV計算(去重用戶數(shù)):每次當(dāng)用戶活躍時簡單的調(diào)用SADD命令向集合添加UID竭宰,然后實時的用SCARD獲取元素個數(shù)渣淳。還支持多個集合之間的交集(SINTER)、差集(SDIFF)和并集( SUNION)運算怔蚌,交集操作可以很便捷的計算留存率:(今日集合∩昨日集合)/昨日集合。集合是通過哈希表實現(xiàn)的,所以添加杖狼、刪除、查找的復(fù)雜度都是O(1),即復(fù)雜度和元素個數(shù)無關(guān)熄攘。

Sorted sets

????有序集合相比集合每個成員多了分?jǐn)?shù)屬性国拇,成員會按照分?jǐn)?shù)自動從小到大排序,當(dāng)然和集合類似忆嗜,成員也是唯一不重復(fù)的冲甘。常用查詢方法:排名在指定范圍的成員濒憋、分?jǐn)?shù)在指定范圍內(nèi)的成員裆站。應(yīng)用場景:

1本姥、TOPN排名颜屠,商品瀏覽量作為排名指標(biāo),實時查詢TOPN的商品列表,其實現(xiàn)過程是:商品每次被訪問時,用ZINCRBY增加商品瀏覽量,實時用ZREVRANGE?key 0 N-1返回集合中TOPN的商品秩霍。

2螺捐、30分鐘在線用戶數(shù)颠悬,APP矮燎、WEB都有統(tǒng)計最近在線用戶數(shù)的需求,是衡量產(chǎn)品當(dāng)前活躍度的重要指標(biāo)椿疗,有序集合也可以很容易實現(xiàn):以登錄時間戳作為用戶分?jǐn)?shù)漏峰,每次登錄時更新用戶分?jǐn)?shù),“ZADD?key 登錄時間戳 UID”铝条,然后用“ZCOUNT?key 30分鐘前時間戳 now時間戳”命令查詢最近登錄用戶數(shù)

? ? ?有序集合是通過跳表和散列表兩個數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的脾拆,添加名船、刪除元素都會執(zhí)行O(log(N))的操作(N是集合的元素個數(shù))。有序集合的關(guān)鍵是在對分?jǐn)?shù)這個屬性的理解上,從合適的角度看問題产镐,會達到事半功倍的效果丑掺。

Bitmaps

Redis允許使用二進制的數(shù)據(jù)作為Key(binary keys) 和二進制的數(shù)據(jù)作為Value(binary values)唆缴,bitmap就是用二進制的數(shù)據(jù)作為value。bitmap不是一個新的數(shù)據(jù)類型霎匈,而是在String類型上進行的擴展蚓让,相關(guān)的命令有setbit衷佃、getbit趟卸、bitcount等。

SETBIT?key offset value:設(shè)置key在第offset處的bit值(只能是0或1)

GETBIT?key offset:對key所存儲的值氏义,獲取指定offset位置的bit位(結(jié)果是0或1)

BITCOUNT?key:計算key所存儲的值锄列,被設(shè)置為1的bit位數(shù)量

上面提到集合統(tǒng)計UV的例子,如果是大數(shù)據(jù)量的統(tǒng)計惯悠,會占用很大內(nèi)存空間邻邮,如一個上億用戶量的網(wǎng)站,消耗的內(nèi)存也很恐怖克婶。bitmap也同樣可以實現(xiàn)UV統(tǒng)計:當(dāng)有用戶活躍時筒严,只需設(shè)置該用戶所在bit位為1丹泉,而計算UV數(shù)就是統(tǒng)計所有bit位為1的數(shù)量。比如用戶10086的用戶活躍:SETBIT key 10086 1鸭蛙,獲取某天的DAU:GETBIT key摹恨。

bitmap處理大數(shù)據(jù)的排序、查詢效率非常高而且能節(jié)省極大內(nèi)存空間娶视,最大1億的偏移量大約占用12M內(nèi)存晒哄,但也有幾個顯而易見缺點:1、元素是否能簡單的映射為偏移量肪获,就是待統(tǒng)計的元素是否能映射為Long類型? 2揩晴、消耗的空間取決于最大偏移量,和基數(shù)無關(guān)贪磺。

HyperLogLog

不像SET和Bitmaps是精確統(tǒng)計的硫兰,HyperLogLog(HLL)是一個概率數(shù)據(jù)結(jié)構(gòu),用于估計一個集合內(nèi)的基數(shù)(元素個數(shù))寒锚,又叫基數(shù)統(tǒng)計劫映。其統(tǒng)計是有誤差的,可能會比實際稍微多一些或者稍微少一些刹前,但會控制在合理的范圍內(nèi)泳赋,如果對誤差是可接受的,HyperLogLog是一個最佳選擇喇喉。假設(shè)是UV計算祖今,每次用戶活躍時,用PFADD添加元素到HLL拣技,隨時用PFCOUNT查看集合的基數(shù)千诬,就可以實時統(tǒng)計UV。因為不會將元素真正添加到HLL膏斤,所以不能判斷一個元素是否在HLL里存在徐绑。

Hashes

? ? 一個Hash類型有多個字段(屬性),很像一個對象莫辨,但Hashes字段數(shù)量是沒有限制的傲茄。一般是把一類數(shù)據(jù)放到一個key里,然后通過字段表示不同含義沮榜。

常用命令:HMGET:一次獲取多個hash字段的值

HINCYBY:增加hash字段的值盘榨,用于計數(shù)

原子操作

redis單個命令都是原子操作,比如INCY蟆融,多客戶端對同一個key進行INCY操作的情況下草巡,不會發(fā)生客戶端1讀取key值1,客戶端2同時讀取key值1振愿,然后客戶端1和客戶端2都對key進行加一操作捷犹,設(shè)置key的值為2弛饭;比如MSET,給多個key賦值萍歉,要么都設(shè)置成功侣颂,要么都設(shè)置失敗,不會存在一部分key設(shè)置成功枪孩,一部分可以設(shè)置失敗的情況

總結(jié)

在大數(shù)據(jù)分析架構(gòu)里憔晒,一般是spark、storm作為計算框架蔑舞,計算后的結(jié)果存到redis拒担。要對redis的數(shù)據(jù)結(jié)構(gòu)有清晰認(rèn)識,理解各自優(yōu)缺點攻询、實用場景从撼,redis價值才能最大化。

本文首發(fā)于公眾號:data之道

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钧栖,一起剝皮案震驚了整個濱河市低零,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拯杠,老刑警劉巖掏婶,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潭陪,居然都是意外死亡雄妥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門依溯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老厌,“玉大人,你說我怎么就攤上這事誓沸∶纷” “怎么了壹粟?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵拜隧,是天一觀的道長。 經(jīng)常有香客問我趁仙,道長洪添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任雀费,我火速辦了婚禮干奢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盏袄。我一直安慰自己忿峻,他們只是感情好薄啥,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逛尚,像睡著了一般垄惧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绰寞,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天到逊,我揣著相機與錄音,去河邊找鬼滤钱。 笑死觉壶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的件缸。 我是一名探鬼主播铜靶,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼他炊!你這毒婦竟也來了旷坦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佑稠,失蹤者是張志新(化名)和其女友劉穎秒梅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舌胶,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡捆蜀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幔嫂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆它。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖履恩,靈堂內(nèi)的尸體忽然破棺而出锰茉,到底是詐尸還是另有隱情,我是刑警寧澤切心,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布飒筑,位于F島的核電站,受9級特大地震影響绽昏,放射性物質(zhì)發(fā)生泄漏协屡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一全谤、第九天 我趴在偏房一處隱蔽的房頂上張望肤晓。 院中可真熱鬧,春花似錦、人聲如沸补憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盈匾。三九已至卷胯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間威酒,已是汗流浹背窑睁。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葵孤,地道東北人担钮。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像尤仍,于是被迫代替她去往敵國和親箫津。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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