Redis 基礎入門 原

爲什麼需要Redis
傳統的關係數據庫MySQL,ORacle等的數據主要還是存儲在磁盤上,雖然數據庫各自都帶有緩存功能,但隨着業務量的增大,數據庫自身的緩存終將成爲瓶頸,次數如果要提供應用的效率,降低數據庫的讀寫次數,就需要引入緩存技術。
緩存
緩存就是在內存中存儲的數據備份,當數據沒有發生本質改變的時候,我們就不讓數據的查詢去數據庫進行操作,而去內存中取數據,這樣就大大降低了數據庫的讀寫次數,而且從內存中讀數據的速度比去數據庫查詢要快一些,這樣同時又提高了效率。

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。

Redis持久化的兩種方式
RDB(Redis DataBase)
RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上;
redis在進行數據持久化的過程中,會先將數據寫入到一個臨時文件中,待持久化過程都結束了,纔會用這個臨時文件替換上次持久化好的文件。正是這種特性,讓我們可以隨時來進行備份,因爲快照文件總是完整可用的。
對於RDB方式,redis會單獨創建(fork)一個子進程來進行持久化,而主進程是不會進行任何IO操作的,這樣就確保了redis極高的性能。
如果需要進行大規模數據的恢復,且對於數據恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
會丟失近持久化間隔時間的數據,數據備份的完整性無法保證。

AOF(Append Only File)
AOF,(只允許追加不允許改寫的文件)則是換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啓動時,只要把這些寫指令從前到後再重複執行一遍,就可以實現數據恢復了。關閉持久化功能則redis將變成一個純內存數據庫,就像memcache一樣。
如果出現意外導致日誌追加不完整可以通過redis-check-aof工具,可以用來進行日誌修復。
redis提供了AOF文件重寫(rewrite)機制,即當AOF文件的大小超過所設定的閾值時,redis就會啓動AOF文件的內容壓縮,只保留可以恢復數據的最小指令集。
同樣數據規模的情況下,AOF文件要比RDB文件的體積大,AOF方式的恢復速度也要慢於RDB方式
對於我們應該選擇RDB還是AOF,官方的建議是兩個同時使用。這樣可以提供更可靠的持久化方案。

Redis的主從用法
Redis支持主從同步,採用異步進行,在主從結構中關閉主服務器的持久化功能,只讓從服務器進行持久化,可以提高主服務器的處理性能,從服務器設置爲只讀模式。
同步原理
從服務器會向主服務器發出SYNC指令,當主服務器接到此命令後,就會調用BGSAVE指令來創建一個子進程專門進行數據持久化工作,也就是將主服務器的數據寫入RDB文件中。在數據持久化期間,主服務器將執行的寫指令都緩存在內存中。
在BGSAVE指令執行完成後,主服務器會將持久化好的RDB文件發送給從服務器,從服務器接到此文件後會將其存儲到磁盤上,然後再將其讀取到內存中。這個動作完成後,主服務器會將這段時間緩存的寫指令再以redis協議的格式發送給從服務器。在2.8版本之後,redis支持了效率更高的增量同步策略,這大大降低了連接斷開的恢復成本。

Redis的事務處理
redis指令,即MULTI、EXEC、DISCARD、WATCH。這四個指令構成了redis事務處理的基礎。
1.MULTI用來組裝一個事務;
2.EXEC用來執行一個事務;
3.DISCARD用來取消一個事務;
4.WATCH用來監視一些key,一旦這些key在事務執行之前被改變,則取消事務的執行。

redis和memcache比較
1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2.Redis支持master-slave(主-從)模式應用
3.Redis支持數據持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用。
4.Redis單個value的最大限制是1GB,memcached只能保存1MB的數據。

主從模式
master節點掛了以後,redis就不能對外提供寫服務了,因爲剩下的slave不能成爲master這個缺點影響是很大的,尤其是對生產環境來說,是一刻都不能停止服務的,所以一般的生產壞境是不會單單隻有主從模式的。

哨兵模式
Redis Sentinel是Redis官方提供的集羣管理工具,可以部署在其他與redis集羣可通訊的機器中監控redis集羣。
sentinel的中文含義是哨兵、守衛。也就是說既然主從模式中,當master節點掛了以後,slave節點不能主動選舉一個master節點出來,那麼我就安排一個或多個sentinel來做這件事,當sentinel發現master節點掛了以後,sentinel就會從slave中重新選舉一個master。
監控:能持續監控Redis的主從實例是否正常工作;
通知:當被監控的Redis實例出問題時,能通過API通知系統管理員或其他程序;
自動故障恢復:如果主實例無法正常工作,Sentinel將啓動故障恢復機制把一個從實例提升爲主實例,其他的從實例將會被重新配置到新的主實例,且應用程序會得到一個更換新地址的通知。
當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以後,sentinel就會感知並將新的master節點提供給使用者。
sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中,就是下面要講的。

cluster模式
cluster的出現是爲了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多臺機器。對cluster的一些理解:
cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。
因爲Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容這種模式適合數據量巨大的緩存要求,當數據量不是很大使用sentinel即可。
 

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