Redis是什嗎?兩句話可以做下概括:
1. 是一個完全開源免費的key-value記憶體資料庫
2. 通常被認為是一個資料結構伺服器,主要是因為其有著豐富的資料結構 strings、map、 list、sets、 sorted sets
Redis不是什嗎?同樣從兩個方面來做下對比:
1. 不是sql server、mySQL等關係型資料庫,主要原因是:
. redis目前還只能作為小資料量儲存全部資料能夠載入在記憶體中) ,海量資料存放區方面並不是redis所擅長的領域
. 設計、實現方法很不一樣.關係型資料庫通過表來儲存資料,通過SQL來查詢資料。而Redis通上述五種資料結構來儲存資料,通過命令 來查詢資料
2. 不是Memcached等緩衝系統,主要原因有以下幾個:
.網路IO模型方面:Memcached是多線程,分為監聽線程、worker線程,引入鎖,帶來了效能損耗。Redis使用單線程的IO複用模型,將速度優勢發揮到最大,也提供了較簡單的計算功能
.記憶體管理方面:Memcached使用預分配的記憶體池的方式,帶來一定程度的空間浪費 並且在記憶體仍然有很大空間時,新的資料也可能會被剔除,而Redis使用現場申請記憶體的方式來儲存資料,不會剔除任何非臨時資料 Redis更適合作為儲存而不是cache
.資料的一致性方面:Memcached提供了cas命令來保證.而Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷
. 儲存方式方面:Memcached只支援簡單的key-value儲存,不支援枚舉,不支援持久化和複製等功能
一句話小結一下:Redis是一個高效能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部分場合可以對關聯式資料庫起到很好的補充作用。
Redis有什麼用?只有瞭解了它有哪些特性,我們在用的時候才能揚長避短,為我們所用:
1. 速度快:使用標準C寫,所有資料都在記憶體中完成,讀寫速度分別達到10萬/20萬
2. 持久化:對資料的更新採用Copy-on-write技術,可以非同步地儲存到磁碟上,主要有兩種策略,一是根據時間,更新次數的快照save 300 10 )二是基於語句追加方式(Append-only file,aof)
3. 自動操作:對不同資料類型的操作都是自動的,很安全
4. 快速的主--從複製,官方提供了一個資料,Slave在21秒即完成了對Amazon網站10G key set的複製。
5. Sharding技術: 很容易將資料分布到多個Redis執行個體中,資料庫的擴充是個永恒的話題,在關係型資料庫中,主要是以添加硬體、以分區為主要技術形式的縱向擴充解決了很多的應用情境,但隨著web2.0、移動互連網、雲端運算等應用的興起,這種擴充模式已經不太適合了,所以近年來,像採用主從配置、資料庫複寫形式的,Sharding這種技術把負載分布到多個特理節點上去的橫向擴充方式用處越來越多。
這裡對Redis資料庫做下小結:
1. 提高了DB的可擴充性,只需要將新加的資料放到新加的伺服器上就可以了
2. 提高了DB的可用性,隻影響到需要訪問的shard伺服器上的資料的使用者
3. 提高了DB的可維護性,對系統的升級和配置可以按shard一個個來搞,對服務產生的影響較小
4. 小的資料庫存的查詢壓力小,查詢更快,效能更好
寫到這裡,可能就會有人急不可待地想用它了,那怎麼用呢?可以直接到官方文檔,裡面幫我們整理好了各個語言環境下的用戶端,主要有Ruby、Python、 PHP、Perl、Lua、Java、C#....有幾種語言,我也沒見過,所以就不多說了,你懂的....
最後,把我使用過程中的一些 經驗傳承,做個小結:
1. 要進行Master-slave配置,出現服務故障時可以支援切換。
2. 在master側禁用資料持久化,只需在slave上配置資料持久化。
3. 實體記憶體+虛擬記憶體不足,這個時候dump一直死著,時間久了機器掛掉。這個情況就是災難!
4. 當Redis實體記憶體使用超過記憶體總容量的3/5時就會開始比較危險了,就開始做swap,記憶體片段大
5. 當達到最大記憶體時,會清空帶有到期時間的key,即使key未到到期時間.
6. redis與DB同步寫的問題,先寫DB,後寫redis,因為寫記憶體基本上沒有問題
本文出自 “科大訊飛ceecy的專欄” 部落格,請務必保留此出處http://ceecyj.blog.51cto.com/1640670/1262267