如何實現(xiàn)redis緩存

第一:Redis 是什么?

Redis是基于內(nèi)存椅亚、可持久化的日志型限番、Key-Value數(shù)據(jù)庫 高性能存儲系統(tǒng),并提供多種語言的API.

第二:出現(xiàn)背景

數(shù)據(jù)結(jié)構(gòu)(Data Structure)需求越來越多, 但memcache中沒有, 影響開發(fā)效率

性能需求, 隨著讀操作的量的上升需要解決什往,經(jīng)歷的過程有:

數(shù)據(jù)庫讀寫分離(M/S)–>數(shù)據(jù)庫使用多個Slave–>增加Cache (memcache)–>轉(zhuǎn)到Redis

解決寫的問題:

水平拆分扳缕,對表的拆分,將有的用戶放在這個表别威,有的用戶放在另外一個表躯舔;

可靠性需求

Cache的"雪崩"問題讓人糾結(jié)

Cache面臨著快速恢復(fù)的挑戰(zhàn)

開發(fā)成本需求

Cache和DB的一致性維護成本越來越高(先清理DB, 再清理緩存, 不行啊, 太慢了!)

開發(fā)需要跟上不斷涌入的產(chǎn)品需求

硬件成本最貴的就是數(shù)據(jù)庫層面的機器,基本上比前端的機器要貴幾倍省古,主要是IO密集型粥庄,很耗硬件;

維護性復(fù)雜

一致性維護成本越來越高豺妓;

BerkeleyDB使用B樹惜互,會一直寫新的,內(nèi)部不會有文件重新組織琳拭;這樣會導(dǎo)致文件越來越大训堆;大的時候需要進行文件歸檔,歸檔的操作要定期做白嘁;

這樣坑鱼,就需要有一定的down time;

基于以上考慮絮缅, 選擇了Redis

第三:Redis 在新浪微博中的應(yīng)用

Redis簡介

1. 支持5種數(shù)據(jù)結(jié)構(gòu)

支持strings, hashes, lists, sets, sorted sets

string是很好的存儲方式鲁沥,用來做計數(shù)存儲呼股。sets用于建立索引庫非常棒;

2. K-V 存儲 vs K-V 緩存

新浪微博目前使用的98%都是持久化的應(yīng)用画恰,2%的是緩存彭谁,用到了600+服務(wù)器

Redis中持久化的應(yīng)用和非持久化的方式不會差別很大:

非持久化的為8-9萬tps,那么持久化在7-8萬tps左右允扇;

當(dāng)使用持久化時缠局,需要考慮到持久化和寫性能的配比,也就是要考慮redis使用的內(nèi)存大小和硬盤寫的速率的比例計算蔼两;

3. 社區(qū)活躍

Redis目前有3萬多行代碼, 代碼寫的精簡甩鳄,有很多巧妙的實現(xiàn),作者有技術(shù)潔癖

Redis的社區(qū)活躍度很高额划,這是衡量開源軟件質(zhì)量的重要指標妙啃,開源軟件的初期一般都沒有商業(yè)技術(shù)服務(wù)支持,如果沒有活躍社區(qū)做支撐俊戳,一旦發(fā)生問題都無處求救揖赴;

Redis基本原理

redis持久化(aof) append online file:

寫log(aof), 到一定程度再和內(nèi)存合并. 追加再追加, 順序?qū)懘疟P, 對性能影響非常小

1. 單實例單進程

Redis使用的是單進程,所以在配置時抑胎,一個實例只會用到一個CPU燥滑;

在配置時,如果需要讓CPU使用率最大化阿逃,可以配置Redis實例數(shù)對應(yīng)CPU數(shù), Redis實例數(shù)對應(yīng)端口數(shù)(8核Cpu, 8個實例, 8個端口), 以提高并發(fā):

單機測試時, 單條數(shù)據(jù)在200字節(jié), 測試的結(jié)果為8~9萬tps铭拧;

2. Replication

過程: 數(shù)據(jù)寫到master–>master存儲到slave的rdb中–>slave加載rdb到內(nèi)存。

存儲點(save point): 當(dāng)網(wǎng)絡(luò)中斷了, 連上之后, 繼續(xù)傳.

Master-slave下第一次同步是全傳恃锉,后面是增量同步搀菩;、

3. 數(shù)據(jù)一致性

長期運行后多個結(jié)點之間存在不一致的可能性破托;

開發(fā)兩個工具程序:

1.對于數(shù)據(jù)量大的數(shù)據(jù)肪跋,會周期性的全量檢查;

2.實時的檢查增量數(shù)據(jù)土砂,是否具有一致性州既;

對于主庫未及時同步從庫導(dǎo)致的不一致,稱之為延時問題萝映;

對于一致性要求不是那么嚴格的場景吴叶,我們只需要要保證最終一致性即可;

對于延時問題序臂,需要根據(jù)業(yè)務(wù)場景特點分析蚌卤,從應(yīng)用層面增加策略來解決這個問題;

例如:

1.新注冊的用戶,必須先查詢主庫造寝;

2.注冊成功之后,需要等待3s之后跳轉(zhuǎn)吭练,后臺此時就是在做數(shù)據(jù)同步诫龙。

第四:分布式緩存的架構(gòu)設(shè)計

1.架構(gòu)設(shè)計

由于redis是單點,項目中需要使用鲫咽,必須自己實現(xiàn)分布式签赃。基本架構(gòu)圖如下所示:

2.分布式實現(xiàn)

通過key做一致性哈希分尸,實現(xiàn)key對應(yīng)redis結(jié)點的分布锦聊。

一致性哈希的實現(xiàn):

l????????hash值計算:通過支持MD5與MurmurHash兩種計算方式,默認是采用MurmurHash箩绍,高效的hash計算孔庭。

l????????一致性的實現(xiàn):通過java的TreeMap來模擬環(huán)狀結(jié)構(gòu),實現(xiàn)均勻分布

3.client的選擇

對于jedis修改的主要是分區(qū)模塊的修改材蛛,使其支持了跟據(jù)BufferKey進行分區(qū)圆到,跟據(jù)不同的redis結(jié)點信息,可以初始化不同的 ShardInfo卑吭,同時也修改了JedisPool的底層實現(xiàn)芽淡,使其連接pool池支持跟據(jù)key,value的構(gòu)造方法,跟據(jù)不同 ShardInfos豆赏,創(chuàng)建不同的jedis連接客戶端挣菲,達到分區(qū)的效果,供應(yīng)用層調(diào)用

4.模塊的說明

l????????臟數(shù)據(jù)處理模塊掷邦,處理失敗執(zhí)行的緩存操作白胀。

l????????屏蔽監(jiān)控模塊,對于jedis操作的異常監(jiān)控耙饰,當(dāng)某結(jié)點出現(xiàn)異澄屏可控制redis結(jié)點的切除等操作。

整個分布式模塊通過hornetq苟跪,來切除異常redis結(jié)點廷痘。對于新結(jié)點的增加,也可以通過reload方法實現(xiàn)增加件已。(此模塊對于新增結(jié)點也可以很方便實現(xiàn))

對于以上分布式架構(gòu)的實現(xiàn)滿足了項目的需求笋额。另外使用中對于一些比較重要用途的緩存數(shù)據(jù)可以單獨設(shè)置一些redis結(jié)點,設(shè)定特定的優(yōu)先級篷扩。另外對 于緩存接口的設(shè)計兄猩,也可以跟據(jù)需求,實現(xiàn)基本接口與一些特殊邏輯接口。對于cas相關(guān)操作枢冤,以及一些事物操作可以通過其watch機制來實現(xiàn)鸠姨。

聲明:所有博客服務(wù)于分布式框架,作為框架的技術(shù)支持及說明淹真,框架面向企業(yè)讶迁,是大型互聯(lián)網(wǎng)分布式企業(yè)架構(gòu),后期會介紹linux上部署高可用集群項目核蘸。

愿意了解框架技術(shù)或者源碼的朋友直接加求求(企鵝):2042849237歡迎大家一起學(xué)習(xí)研究相關(guān)技術(shù)

更多詳細源碼參考來源:http://minglisoft.cn/technology

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍糯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子客扎,更是在濱河造成了極大的恐慌祟峦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徙鱼,死亡現(xiàn)場離奇詭異宅楞,居然都是意外死亡,警方通過查閱死者的電腦和手機疆偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門咱筛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杆故,你說我怎么就攤上這事迅箩。” “怎么了处铛?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵饲趋,是天一觀的道長。 經(jīng)常有香客問我撤蟆,道長奕塑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任家肯,我火速辦了婚禮龄砰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讨衣。我一直安慰自己换棚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布反镇。 她就那樣靜靜地躺著固蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歹茶。 梳的紋絲不亂的頭發(fā)上夕玩,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天你弦,我揣著相機與錄音,去河邊找鬼燎孟。 笑死禽作,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揩页。 我是一名探鬼主播领迈,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碍沐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衷蜓,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤累提,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磁浇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋陪,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年置吓,在試婚紗的時候發(fā)現(xiàn)自己被綠了无虚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡衍锚,死狀恐怖友题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戴质,我是刑警寧澤度宦,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站告匠,受9級特大地震影響戈抄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜后专,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一划鸽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戚哎,春花似錦裸诽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啰脚,卻和暖如春殷蛇,著一層夾襖步出監(jiān)牢的瞬間实夹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工粒梦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亮航,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓匀们,卻偏偏與公主長得像缴淋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泄朴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,442評論 0 82
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)祖灰、高可擴展钟沛、高可用、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,268評論 0 36
  • 第一:Redis 是什么局扶? Redis是基于內(nèi)存恨统、可持久化的日志型、Key-Value數(shù)據(jù)庫 高性能存儲系統(tǒng)三妈,并提...
    ITsupuerlady閱讀 2,913評論 0 4
  • 已經(jīng)記不清這是第多少個失眠的夜晚畜埋,夜晚睜著眼睡不著的那種感覺誰知道啊畴蒲!
    我是誰得誰閱讀 179評論 0 0
  • 遠芳侵古道悠鞍,晴翠接荒城。 又送王孫去模燥,萋萋滿別情狞玛。 相信你看到這首詩時,一定感覺陌生涧窒,沒學(xué)過靶姆尽!(熟背唐詩三百首的...
    忘念閱讀 837評論 0 0