Redis是什么欠啤?
- Redis使用C語言開發(fā)的一個(gè)開源的高性能鍵值對(key-vaiue)數(shù)據(jù)庫遣耍。
- 通常被認(rèn)為是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器,它通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲需求裹驰,到目前為止Redis支持的鍵值數(shù)據(jù)類型如下:string(字符串)井濒、list(鏈表)、set(集合)荠卷、zset(sorted set --有序集合)和hash(哈希類型)模庐。
Redis不是什么?
- 不是sql server僵朗、mySQL等關(guān)系型數(shù)據(jù)庫赖欣,主要原因是:
- redis目前還只能作為小數(shù)據(jù)量存儲(全部數(shù)據(jù)能夠加載在內(nèi)存中)屑彻,海量數(shù)據(jù)存儲方面并不是redis所擅長的領(lǐng)域。
- 設(shè)計(jì)顶吮、實(shí)現(xiàn)方法很不一樣.關(guān)系型數(shù)據(jù)庫通過表來存儲數(shù)據(jù)社牲,通過SQL來查詢數(shù)據(jù)。而Redis通上述五種數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)悴了,通過命令來查詢數(shù)據(jù)搏恤。
- 不是Memcached等緩存系統(tǒng),主要原因有以下幾點(diǎn):
- 網(wǎng)絡(luò)IO模型方面:Memcached是多線程湃交,分為監(jiān)聽線程熟空、worker線程,引入鎖搞莺,帶來了性能損耗息罗。Redis使用單線程的IO復(fù)用模型,將速度優(yōu)勢發(fā)揮到最大才沧,也提供了較簡單的計(jì)算功能
- 內(nèi)存管理方面:Memcached使用預(yù)分配的內(nèi)存池的方式迈喉,帶來一定程度的空間浪費(fèi) 并且在內(nèi)存仍然有很大空間時(shí),新的數(shù)據(jù)也可能會被剔除温圆,而Redis使用現(xiàn)場申請內(nèi)存的方式來存儲數(shù)據(jù)挨摸,不會剔除任何非臨時(shí)數(shù)據(jù) Redis更適合作為存儲而不是cache
- 數(shù)據(jù)的一致性方面:Memcached提供了cas命令來保證.而Redis提供了事務(wù)的功能,可以保證一串 命令的原子性岁歉,中間不會被任何操作打斷
- 存儲方式方面:Memcached只支持簡單的key-value存儲得运,不支持枚舉,不支持持久化和復(fù)制等功能
一句話小結(jié)一下:Redis是一個(gè)高性能的key-value數(shù)據(jù)庫锅移。 redis的出現(xiàn)熔掺,很大程度補(bǔ)償了memcached這類key/value存儲的不足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用帆啃。
Redis特點(diǎn)
- 速度快:使用標(biāo)準(zhǔn)C寫瞬女,所有數(shù)據(jù)都在內(nèi)存中完成,Redis能讀的速度是110000次/s,寫的速度是81000次/s努潘。
- 持久化:對數(shù)據(jù)的更新采用Copy-on-write技術(shù)诽偷,可以異步地保存到磁盤上,主要有兩種策略疯坤,一是根據(jù)時(shí)間报慕,更新次數(shù)的快照(save 300 10 )二是基于語句追加方式(Append-only file,aof) 压怠。
- 自動操作:對不同數(shù)據(jù)類型的操作都是自動的眠冈,很安全。
- 快速的主--從復(fù)制,官方提供了一個(gè)數(shù)據(jù)蜗顽,Slave在21秒即完成了對Amazon網(wǎng)站10G key set的復(fù)制布卡。
- Sharding技術(shù): 很容易將數(shù)據(jù)分布到多個(gè)Redis實(shí)例中,數(shù)據(jù)庫的擴(kuò)展是個(gè)永恒的話題雇盖,在關(guān)系型數(shù)據(jù)庫中忿等,主要是以添加硬件、以分區(qū)為主要技術(shù)形式的縱向擴(kuò)展解決了很多的應(yīng)用場景崔挖,但隨著web2.0贸街、移動互聯(lián)網(wǎng)、云計(jì)算等應(yīng)用的興起狸相,這種擴(kuò)展模式已經(jīng)不太適合了薛匪,所以近年來,像采用主從配置脓鹃、數(shù)據(jù)庫復(fù)制形式的逸尖,Sharding這種技術(shù)把負(fù)載分布到多個(gè)特理節(jié)點(diǎn)上去的橫向擴(kuò)展方式用處越來越多。
Redis的缺點(diǎn)
? ? ? ?是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上
Redis的應(yīng)用場景
? ? ? ?眾多語言都支持Redis瘸右,因?yàn)镽edis交換數(shù)據(jù)快冷溶,所以在服務(wù)器中常用來存儲一些需要頻繁調(diào)取的數(shù)據(jù),這樣可以大大節(jié)省系統(tǒng)直接讀取磁盤來獲得數(shù)據(jù)的I/O開銷尊浓,更重要的是可以極大提升速度。
? ? ? ?拿大型網(wǎng)站來舉個(gè)例子纯衍,比如a網(wǎng)站首頁一天有100萬人訪問栋齿,其中有一個(gè)板塊為推薦新聞。要是直接從數(shù)據(jù)庫查詢襟诸,那么一天就要多消耗100萬次數(shù)據(jù)庫請求瓦堵。上面已經(jīng)說過,Redis支持豐富的數(shù)據(jù)類型歌亲,所以這完全可以用Redis來完成菇用,將這種熱點(diǎn)數(shù)據(jù)存到Redis(內(nèi)存)中,要用的時(shí)候陷揪,直接從內(nèi)存取惋鸥,極大的提高了速度和節(jié)約了服務(wù)器的開銷。
? ? ? ?總之悍缠,Redis的應(yīng)用是非常廣泛的卦绣,而且極有價(jià)值,真是服務(wù)器中的一件利器飞蚓,所以從現(xiàn)在開始滤港,我們就來一步步學(xué)好它。
這里對Redis數(shù)據(jù)庫做下小結(jié):
- 提高了DB的可擴(kuò)展性趴拧,只需要將新加的數(shù)據(jù)放到新加的服務(wù)器上就可以了 溅漾。
- 提高了DB的可用性山叮,只影響到需要訪問的shard服務(wù)器上的數(shù)據(jù)的用戶 。
- 提高了DB的可維護(hù)性添履,對系統(tǒng)的升級和配置可以按shard一個(gè)個(gè)來搞屁倔,對服務(wù)產(chǎn)生的影響較小 。
- 小的數(shù)據(jù)庫存的查詢壓力小缝龄,查詢更快汰现,性能更好。
使用過程中的經(jīng)驗(yàn)和教訓(xùn):
- 要進(jìn)行Master-slave配置叔壤,出現(xiàn)服務(wù)故障時(shí)可以支持切換瞎饲。
- 在master側(cè)禁用數(shù)據(jù)持久化,只需在slave上配置數(shù)據(jù)持久化炼绘。
- 物理內(nèi)存+虛擬內(nèi)存不足嗅战,這個(gè)時(shí)候dump一直死著,時(shí)間久了機(jī)器掛掉俺亮。這個(gè)情況就是災(zāi)難驮捍!
- 當(dāng)Redis物理內(nèi)存使用超過內(nèi)存總?cè)萘康?/5時(shí)就會開始比較危險(xiǎn)了,就開始做swap,內(nèi)存碎片大
- 當(dāng)達(dá)到最大內(nèi)存時(shí)脚曾,會清空帶有過期時(shí)間的key东且,即使key未到過期時(shí)間.
- redis與DB同步寫的問題,先寫DB本讥,后寫redis珊泳,因?yàn)閷憙?nèi)存基本上沒有問題