原文地址
1.什么是redis?
Redis 是一個基于內(nèi)存的高性能key-value數(shù)據(jù)庫冗懦。
2.Reids的特點
Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached犀被,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當中進行操作绍填,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進行保存。因為是純內(nèi)存操作稀余,Redis的性能非常出色邦邦,每秒可以處理超過 10萬次讀寫操作安吁,是已知性能最快的Key-Value DB。
Redis的出色之處不僅僅是性能燃辖,Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu)鬼店,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的數(shù)據(jù)黔龟,因此Redis可以用來實現(xiàn)很多有用的功能妇智,比方說用他的List來做FIFO雙向鏈表,實現(xiàn)一個輕量級的高性 能消息隊列服務(wù)氏身,用他的Set可以做高性能的tag系統(tǒng)等等巍棱。另外Redis也可以對存入的Key-Value設(shè)置expire時間,因此也可以被當作一 個功能加強版的memcached來用蛋欣。
Redis的主要缺點是數(shù)據(jù)庫容量受到物理內(nèi)存的限制航徙,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上陷虎。
3.Redis支持的數(shù)據(jù)類型
Redis通過Key-Value的單值不同類型來區(qū)分, 以下是支持的類型:
Strings
Lists
Sets 求交集到踏、并集
Sorted Set
hashes
4.為什么redis需要把所有數(shù)據(jù)放到內(nèi)存中?
Redis為了達到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中尚猿,并通過異步的方式將數(shù)據(jù)寫入磁盤窝稿。所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中凿掂,磁盤I/O速度為嚴重影響redis的性能伴榔。在內(nèi)存越來越便宜的今天,redis將會越來越受歡迎庄萎。
如果設(shè)置了最大使用的內(nèi)存踪少,則數(shù)據(jù)已有記錄數(shù)達到內(nèi)存限值后不能繼續(xù)插入新值。
5.Redis是單進程單線程的
redis利用隊列技術(shù)將并發(fā)訪問變?yōu)榇性L問糠涛,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷秉馏。
6.虛擬內(nèi)存
當你的key很小而value很大時,使用VM的效果會比較好.因為這樣節(jié)約的內(nèi)存比較大.
當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value.
vm-max-threads這個參數(shù),可以設(shè)置訪問swap文件的線程數(shù),設(shè)置最好不要超過機器的核數(shù),如果設(shè)置為0,那么所有對swap文件的操作都是串行的.可能會造成比較長時間的延遲,但是對數(shù)據(jù)完整性有很好的保證.
自己測試的時候發(fā)現(xiàn)用虛擬內(nèi)存性能也不錯。如果數(shù)據(jù)量很大脱羡,可以考慮分布式或者其他數(shù)據(jù)庫
7.分布式
redis支持主從的模式萝究。原則:Master會將數(shù)據(jù)同步到slave,而slave不會將數(shù)據(jù)同步到master锉罐。Slave啟動時會連接master來同步數(shù)據(jù)帆竹。
這是一個典型的分布式讀寫分離模型。我們可以利用master來插入數(shù)據(jù)脓规,slave提供檢索服務(wù)栽连。這樣可以有效減少單個機器的并發(fā)訪問數(shù)量。
8.讀寫分離模型
通過增加Slave DB的數(shù)量侨舆,讀的性能可以線性增長秒紧。為了避免Master DB的單點故障,集群一般都會采用兩臺Master DB做雙機熱備挨下,所以整個集群的讀和寫的可用性都非常高熔恢。
讀寫分離架構(gòu)的缺陷在于,不管是Master還是Slave臭笆,每個節(jié)點都必須保存完整的數(shù)據(jù)叙淌,如果在數(shù)據(jù)量很大的情況下,集群的擴展能力還是受限于單個節(jié)點的存儲能力愁铺,而且對于Write-intensive類型的應(yīng)用鹰霍,讀寫分離架構(gòu)并不適合。
9.數(shù)據(jù)分片模型
為了解決讀寫分離模型的缺陷茵乱,可以將數(shù)據(jù)分片模型應(yīng)用進來茂洒。
可以將每個節(jié)點看成都是獨立的master,然后通過業(yè)務(wù)實現(xiàn)數(shù)據(jù)分片瓶竭。
結(jié)合上面兩種模型督勺,可以將每個master設(shè)計成由一個master和多個slave組成的模型。
10.Redis的回收策略
- volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
- volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
- volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
- allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
- allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
- no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)在验。
11.使用Redis有哪些好處玷氏?
1.速度快,因為數(shù)據(jù)存在內(nèi)存中腋舌,類似于HashMap盏触,HashMap的優(yōu)勢就是查找和操作的時間復(fù)雜度都是O(1)。
2.支持豐富數(shù)據(jù)類型块饺,支持string赞辩,list,set授艰,sorted set辨嗽,hash。
3.支持事務(wù)淮腾,操作都是原子性糟需,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行屉佳,要么全部不執(zhí)行。
4.豐富的特性:可用于緩存洲押,消息武花,按key設(shè)置過期時間,過期后將會自動刪除杈帐。
12.Redis持久化方式
由于Redis的數(shù)據(jù)都存放在內(nèi)存中体箕,如果沒有配置持久化,redis重啟后數(shù)據(jù)就全丟失了挑童,于是需要開啟Redis的持久化功能累铅,將數(shù)據(jù)保存到磁盤上,當redis重啟后站叼,可以從磁盤中恢復(fù)數(shù)據(jù)娃兽。redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在內(nèi)存中的數(shù)據(jù)庫記錄定時dump到磁盤上的RDB持久化),大年,另外一種是AOF(append only file)持久化(原理是將Reids的操作日志以追加的方式寫入文件)
- RDB持久化是指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤换薄,實際操作過程是fork一個子進程,先將數(shù)據(jù)集寫入臨時文件翔试,寫入成功后轻要,再替換之前的文件,用二進制壓縮存儲垦缅。
- AOF持久化以日志的形式記錄服務(wù)器所處理的每一個寫冲泥、刪除操作,查詢操作不會記錄壁涎,以文本的方式記錄凡恍,可以打開文件看到詳細的操作記錄。