Redis使用總結之與Memcached異同

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,因爲寫內存基本上沒有問題


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章