初識 Redis

redis 簡介

Redis是一種基於鍵值對(key-value)的NoSQL數據庫,與很多鍵值對數據庫不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位圖)、HyperLogLog、GEO(地理信息定位)等多種數據結構和算法組成,因此Redis可以滿足很多的應用場景,而且因爲Redis會將所有數據都存放在內存中,所以它的讀寫性能非常驚人。不僅如此,Redis還可以將內存的數據利用快照和日誌的形式保存到硬盤上,這樣在發生類似斷電或者機器故障的時候,內存中的數據不會“丟失”。除了上述功能以外,Redis還提供了鍵過期、發佈訂閱、事務、流水線、Lua腳本等附加功能。

2008年,Redis的作者Salvatore Sanfilippo在開發一個叫LLOOGG的網站時,需要實現一個高性能的隊列功能,最開始是使用MySQL來實現的,但後來發現無論怎麼優化SQL語句都不能使網站的性能提高上去,再加上自己囊中羞澀,於是他決定自己做一個專屬於LLOOGG的數據庫,這個就是Redis的前身。後來,Salvatore Sanfilippo將Redis1.0的源碼開放到GitHub
上,可能連他自己都沒想到,Redis後來如此受歡迎。

Redis 特性

 1.速度快

正常情況下,Redis執行命令的速度非常快,官方給出的數字是讀寫性能可以達到10萬/秒,當然這也取決於機器的性能,但這裏先不討論機器性能上的差異,只分析一下是什麼造就了Redis除此之快的速度,可以大致歸納爲以下三點:

  • Redis的所有數據都是存放在內存中的,下圖表是谷歌公司2009年給出的各層級硬件執行速度,所以把數據放在內存中是Redis速度快的最主要原因。
  • Redis是用C語言實現的,一般來說C語言實現的程序“距離”操作系統更近,執行速度相對會更快。
  • Redis使用了單線程架構,預防了多線程可能產生的競爭問題。

  2. 基於鍵值對的數據結構服務器

幾乎所有的編程語言都提供了類似字典的功能,例如Java裏的map、Python裏的dict,類似於這種組織數據的方式叫作基於鍵值的方式,與很多鍵值對數據庫不同的是,Redis中的值不僅可以是字符串,而且還可以是具體的數據結構,這樣不僅能便於在許多應用場景的開發,同時也能夠提高開發效率。Redis的全稱是REmote Dictionary Server,它主要提供了5種數據結構:字符串、哈希、列表、集合、有序集合,同時在字符串的基礎之上演變出了位圖(Bitmaps)和HyperLogLog兩種神奇的“數據結構”,並且隨着LBS(Location Based Service,基於位置服務)的不斷髮展,Redis3.2版本中加入有關GEO(地理信息定位)的功能。

3.豐富的功能

除了5種數據結構,Redis還提供了許多額外的功能:

  • 提供了鍵過期功能,可以用來實現緩存。
  • 提供了發佈訂閱功能,可以用來實現消息系統。
  • 支持Lua腳本功能,可以利用Lua創造出新的Redis命令。
  • 提供了簡單的事務功能,能在一定程度上保證事務特性。
  • 提供了流水線(Pipeline)功能,這樣客戶端能將一批命令一次性傳到Redis,減少了網絡的開銷

4.簡單穩定

Redis的簡單主要表現在三個方面。首先,Redis的源碼很少,早期版本的代碼只有2萬行左右,3.0版本以後由於添加了集羣特性,代碼增至5萬行左右,相對於很多NoSQL數據庫來說代碼量相對要少很多,也就意味着普通的開發和運維人員完全可以“吃透”它。其次,Redis使用單線程模型,這樣不僅使得Redis服務端處理模型變得簡單,而且也使得客戶端開發變得簡單。最後,Redis不需要依賴於操作系統中的類庫(例如Memcache需要依賴libevent這樣的系統類庫),Redis自己實現了事件處理的相關功能。

5.客戶端語

Redis提供了簡單的TCP通信協議,很多編程語言可以很方便地接入到Redis,並且由於Redis受到社區和各大公司的廣泛認可,所以支持Redis的客戶端語言也非常多,幾乎涵蓋了主流的編程語言,例如Java、PHP、Python、C、C++、Nodejs等。

6.持久化

通常看,將數據放在內存中是不安全的,一旦發生斷電或者機器故障,重要的數據可能就會丟失,因此Redis提供了兩種持久化方式:RDB和AOF,即可以用兩種策略將內存的數據保存到硬盤中(如圖下圖1-1),這樣就保證了數據的可持久性。

7.主從複製

Redis提供了複製功能,實現了多個相同數據的Redis副本(如圖1-2所示),複製功能是分佈式Redis的基礎。

                            

Redis 使用場景

1.緩存

緩存機制幾乎在所有的大型網站都有使用,合理地使用緩存不僅可以加快數據的訪問速度,而且能夠有效地降低後端數據源的壓力。Redis提供了鍵值過期時間設置,並且也提供了靈活控制最大內存和內存溢出後的淘汰策略。

2.排行榜

排行榜系統幾乎存在於所有的網站,例如按照熱度排名的排行榜,按照發布時間的排行榜,按照各種複雜維度計算出的排行榜,Redis提供了列表和有序集合數據結構,合理地使用這些數據結構可以很方便地構建各種排行榜系統。

3.計數器

計數器在網站中的作用至關重要,例如視頻網站有播放數、電商網站有瀏覽數,爲了保證數據的實時性,每一次播放和瀏覽都要做加1的操作,如果併發量很大對於傳統關係型數據的性能是一種挑戰。Redis天然支持計數功能而且計數的性能也非常好,可以說是計數器系統的重要選擇。

4.社交網絡

贊/踩、粉絲、共同好友/喜好、推送、下拉刷新等是社交網站的必備功能,由於社交網站訪問量通常比較大,而且傳統的關係型數據不太適合保存這種類型的數據,Redis提供的數據結構可以相對比較容易地實現這些功能。

5.消息隊列

消息隊列系統可以說是一個大型網站的必備基礎組件,因爲其具有業務解耦、非實時業務削峯等特性。Redis提供了發佈訂閱功能和阻塞隊列的功能,雖然和專業的消息隊列比還不夠足夠強大,但是對於一般的消息隊列功能基本可以滿足。

6.Redis 不適合場景

站在數據規模的角度看,數據可以分爲大規模數據和小規模數據,我們知道Redis的數據是存放在內存中的,雖然現在內存已經足夠便宜,但是如果數據量非常大,例如每天有幾億的用戶行爲數據,使用Redis來存儲的話,基本上是個無底洞,經濟成本相當的高。

站在數據冷熱的角度看,數據分爲熱數據和冷數據,熱數據通常是指需要頻繁操作的數據,反之爲冷數據,例如對於視頻網站來說,視頻基本信息基本上在各個業務線都是經常要操作的數據,而用戶的觀看記錄不一定是經常需要訪問的數據,這裏且不討論兩者數據規模的差異,單純站在數據冷熱的角度上看,視頻信息屬於熱數據,用戶觀看記錄屬於冷數據。如果將這些冷數據放在Redis中,基本上是對於內存的一種浪費,但是對於一些熱數據可以放在Redis中加速讀寫,也可以減輕後端存儲的負載,可以說是事半功倍。

參考文檔:https://download.csdn.net/download/weixin_39576234/10958940

 

 

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