只用redis不用mysql的项目_干货!带你了解为什么那么多开源项目都是用Redis!
很多開源項目中都使用了redis,這些項目為什么使用redis?使用redis有什么好處?怎么使用redis?帶著這些疑問,我們來了解一下redis。
一、什么是Redis
Redis是一個免費開源用于內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合等數據類型。它支持多種集群部署,輔助項目達到更高的性能。
二、Redis的結構
Redis 數據類型分為:字符串、哈希、列表、集合、有序集合等五種類型。
1.String(字符串)
字符串類型是redis中最基本的數據類型,一個key對應一個value。字符串類型實際上可以是字符串(簡單的字符串、復雜的字符串(xml、json)、數字(整數、浮點數)、二進制(圖片、音頻、視頻))等,但最大不能超過512M。
2.Hash(哈希)
哈希類型是一個Map,我們知道redis本身就是鍵值對結構,哈希結構就是“值”也充當鍵值對結構,如 value={{value-a1,value-b1},......value-an,value-bn}}
3.list(鏈表)
列表類型是用來儲存多個有序的字符串,列表中的每個字符串成為元素(element),一個列表最多可以儲存2的32次方-1個元素,在redis中,可以隊列表兩端插入(pubsh)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下表的元素等,列表是一種比較靈活的數據結構,它可以充當棧和隊列的角色,在實際開發中有很多應用場景。
4.Set(集合)
集合類型也是用來保存多個字符串的元素,但和列表不同的是集合中不允許有重復的元素,并且集合中的元素是無序的,不能通過索引下標獲取元素,redis除了支持集合內的增刪改查,同時還支持多個集合取交集、并集、差集,并合理的使用好集合類型
5.zset (有序集合)
有序集合也是用來保存多個字符串的元素,跟集合的區別在于,有序集合中的元素是可以排序的,它給每個元素設置一個分數,作為排序的依據。
三、Redis的三種集群模式
Redis的三種集群模式主要是:主從模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和redis cluster集群模式(redis3.0版本之后)。
1、主從模式(master-slave)
(1)模式來源:
同Mysql主從復制的原因一樣,Redis雖然讀取寫入的速度都特別快,但是也會產生讀壓力特別大的情況。為了分擔讀壓力,Redis支持主從復制,在主從復制中,數據庫分為兩類:主數據庫(master)和從數據庫(slave)。Redis的主從結構可以采用一主多從或者級聯結構,客戶端可對主數據庫進行讀寫操作,對從數據庫進行讀操作,主數據庫寫入的數據會實時自動同步給從數據庫。
(2)工作機制:
當主數據庫slave啟動后,主動向從數據庫master發送同步SYNC命令。master接收到SYNC命令后在后臺保存快照(RDB持久化)和緩存保存快照這段時間的命令,然后將保存的快照文件和緩存的命令發送給slave。slave接收到快照文件和命令后加載快照文件和緩存的執行命令。
復制初始化后,master每次接收到的寫命令都會同步發送給slave,保證主從數據一致性。
(3)優缺點
優點:master能自動將數據同步到slave,可以進行讀寫分離,分擔master的讀壓力;
master、slave之間的同步是以非阻塞的方式進行的,同步期間,客戶端仍然可以提交查詢或更新請求
缺點:不具備自動容錯與恢復功能。主從模式下,master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務,導致客戶端請求失敗,需要等待機器重啟或手動切換客戶端IP才能恢復;
master宕機,如果宕機前數據沒有同步完,則切換IP后會存在數據不一致的問題
難以支持動態擴容,Redis的容量受限于單機配置。
2、哨兵(Sentinel)
(1)模式來源:
主從模式的弊端就是不具備高可用性,當master掛掉以后,Redis將不能再對外提供寫入操作,因此sentinel應運而生。sentinel中文含義為哨兵,顧名思義,它的作用就是監控redis集群的運行狀況。那么如何得知某一臺redis服務器掛了,如何切換,如何保證備份的機器是原始服務器的完整備份呢?這時候就需要Sentinel和Replication(復制)出場了。Sentinel可以管理多個Redis服務器,它提供了監控,提醒以及自動的故障轉移的功能;Replication則是負責讓一個Redis服務器可以配備多個備份的服務器。Redis也是利用這兩個功能來保證Redis的高可用的。
在redis3.0以前的版本要實現集群一般是借助哨兵sentinel工具來監控master節點的狀態,如果master節點異常,則會做主從切換,將某一臺slave作為master,哨兵的配置略微復雜,并且性能和高可用性等各方面表現一般,特別是在主從切換的瞬間存在訪問瞬斷的情況,而且哨兵模式只有一個主節點對外提供服務,沒法支持很高的并發,且單個主節點內存也不宜設置得過大,否則會導致持久化文件過大,影響數據恢復或主從同步的效率。
(2)工作機制:
每個Sentinel(哨兵)進程以每秒鐘一次的頻率向整個redis集群中的master主服務器、slave從服務器以及其他的Sentinel(哨兵)進程發送一個ping命令。
如果一個實例距離最后一次有效回復ping命令的時間超過down-after-milliseconds選項所指定的值則這個實例會被Sentinel標記為主觀下線(SDOWN)。
如是是master主服務器被標記為SDOWN,則正在監控這個服務器的所有Sentinel都要以每秒一次的頻率確認服務器是否真的已經進入SDOWN(主觀下線狀態)。
當有足夠數量(≥配置文件配置值)的Sentinel在指定的時間內確認了master進入了SDOWN狀態,則master被標記為ODOWN(客觀下線狀態)。
在一般情況下,每個Sentinel會每10秒向redis 主服務器和從服務器發送Info命令。但是當master被標記為客觀下線時,頻率改為1秒一次。
若沒有足夠數量的Sentinel同意master服務器下線,則master的SDOWN狀態被移除,若master重新向Sentinel發送ping命令返回了有效回復,則master的SDOWN狀態被移除。
(3)優缺點
優點:哨兵集群,基于主從復制模式,所有的主從配置優點,它都有主從可以切換,故障可以轉移,高可用性的系統哨兵模式就是主從模式的升級,手動到自動,更加健壯;
缺點:Redis不好在線擴容的,集群容量一旦到達上限,在線擴容就十分麻煩,哨兵模式的配置繁瑣;
3、集群(Cluster )
(1)模式來源:
sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。單臺服務器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復制,進行讀寫分離,把一部分CPU和IO的壓力轉移到從服務器上。但是內存資源怎么辦,主從模式做到的只是相同數據的備份,并不能橫向擴充內存;單臺機器的內存也只能進行加大處理,但是總有上限的。所以我們就需要一種解決方案,可以讓我們橫向擴展。cluster模式的出現就是為了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多臺機器。
cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。
使用集群,只需要將redis配置文件中的cluster-enable配置打開即可。每個集群中至少需要三個主數據庫才能正常運行,新增節點非常方便。還有就是客戶端與redis節點直連,不需要中間代理層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可。
(2)工作機制:
在redis的每一個節點上,有兩樣東西我們比較關注,一個是插槽(slot),它的取值范圍是:0~16383。還有一個就是cluster,它類似是一個集群管理的插件。當我們的存取的key到達的時候,redis會根據特定的算法得出一個結果,然后把結果對16384求余數,這樣每個 key都會對應一個編號在 0-16383 之間的哈希槽,通過這個值,去找到對應的插槽所對應的節點,然后直接自動跳轉到這個對應的節點上進行存取操作。
Redis Cluster 一般由多個節點組成,節點數量至少為 6 個才能保證組成完整高可用的集群,其中三個為主節點,三個為從節點。三個主節點會分配槽,處理客戶端的命令請求,而從節點可用在主節點故障后,頂替主節點。
(3)優缺點
優點:無中心架構,數據按照slot分布在多個節點;
集群中的每個節點都是平等的關系,每個節點都保存各自的數據和整個集群的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節點,就可以獲取到其他節點的數據;
可線性擴展到1000多個節點,節點可動態添加或刪除;
能夠實現自動故障轉移,節點之間通過gossip協議交換狀態信息,用投票機制完成slave到master的角色轉換;
缺點:客戶端實現復雜,驅動要求實現Smart Client,緩存slots mapping信息并及時更新,提高了開發難度;slave充當“冷備”,不能緩解讀壓力;批量操作限制,目前只支持具有相同slot值的key執行批量操作,對其他的如sunion、mset和mget等支持不是很好;
不支持多數據庫空間,單機redis可以支持16個db,從db0到db15,而集群模式下只能使用一個。
綜上所訴,主從模式和哨兵模式都不利于擴展,系統的高可用性都依賴于master的內存大小,哨兵模式在redis2.6開始支持,2.8穩定,cluster模式是redis可擴展的模式。
四、Redis的運用
Redis可用作數據庫,高速緩存和消息隊列代理,那么當你打算使用它們這些功能的時候,可以考慮一下與其他產品的對比,選出一個更好用的。
1、redis與Mysql/Oracle數據庫比較
Mysql/Oracle等數據庫可以將數據保存數據庫當中,應用啟動以后建立數據庫連接就可以通過代碼邏輯對數據庫進行中增刪改查。而Redis也是可以做為數據庫來使用的,它可以看做一個key/value型數據庫,Redis會根據配置定時將內存中的數據寫入到硬盤中,但我們在項目中一般不會將Redis直接當作數據庫來使用,主要原因在于:
(1)Redis只能存儲key/value類型,雖然value的類型可以有多種,但是對于關聯性的記錄查詢,沒有Oracle/Mysql方便。
(2)Redis內存數據寫入硬盤有一定的時間間隔,在這個間隔內數據可能會丟失,安全性不高。
2、redis高速緩存
redis做為高速緩存,這也是redis應用最廣的地方。 對于那些經常被查詢,不經常被修改和刪除的數據,利用Redis緩存可以提升網站的訪問速度,大大降低數據庫的壓力。redis作為高速緩存,帶來這么大的優勢的同時也存在一定的弊端,因為Redis是存放在內存中的,就會導致內存占用過高,另外持久化的代價也過高。
相比于其他的緩存工具,比如Ehcache和Memcached,開源項目使用redis的比例還是要略高一點,redis同這些緩存工具相比,有以下特征或者優勢:
(1)結構簡單,key/value型數據庫,賦值取值方式簡單。但同時它的數據結構又非常豐富,它支持字符串、哈希表、列表、集合、位圖等數據類型。
(2)支持多語言集成,redis發展到今天,Redis客戶端支持多種語言,包括:C、C++、C#、php、java、python、go等語言,根據自己的開發語言,選擇合適的redis client版本類型即可。并且每一種語言下還包括多種類型可供選擇,比如Java語言,redis client提供了諸如Jedis、Redisson、JRedis、JDBC-Redis、RJC、redis-protocol、aredis、lettuce等類型可供選擇,目前比較推薦使用的是Jedis、Redisson。
(3)支持直連模式,哨兵模式(Sentinal),集群模式等,用于負載均衡和容災,具有高可用性。
3、redis 持久化
redis的數據是存儲在內存中的,如果搭載redis的服務器哪天突然心情不好,宕機不干活了,就會導致所有的緩存都丟失了。雖然可以把Redis服務器重新上線,但是由于內存的數據丟失,造成了緩存雪崩,應用服務器和數據庫的壓力一下子就上來了,對于一些并發很高的應用,說不動此時就導致應用崩潰無法訪問。這個時候Redis的持久化功能就派上用場了,可以緩解一下緩存雪崩帶來的影響。redis的持久化指的是redis會把內存的中的數據寫入到硬盤中,在redis重新啟動的時候加載這些數據,從而最大限度的降低緩存丟失帶來的影響。
4、做為消息隊列
Redis也是可以做為消息隊列的,對于一些要求不高的運用場景可以使用redis,redis具備發布訂閱功能。而如果專門來做消息隊列處理或者要求比較,那還是選擇更專業一點的Kafka、rabbitMQ等。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的只用redis不用mysql的项目_干货!带你了解为什么那么多开源项目都是用Redis!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美股周一:三大股指全线上涨,拼多多跌超1
- 下一篇: mysql分片建表语句_Mysql元数据