天天看點

Redis開發與運維. 1.2 Redis特性

<b>1.2 redis特性</b>

redis之是以受到如此多公司的青睐,必然有之過人之處,下面是關于redis的8個重要特性。

1.?速度快

正常情況下,redis執行指令的速度非常快,官方給出的數字是讀寫性能可以達到10萬/秒,當然這也取決于機器的性能,但這裡先不讨論機器性能上的差異,隻分析一下是什麼造就了redis除此之快的速度,可以大緻歸納為以下四點:

redis的所有資料都是存放在記憶體中的,表1-1是谷歌公司2009年給出的各層級硬體執行速度,是以把資料放在記憶體中是redis速度快的最主要原因。

redis是用c語言實作的,一般來說c語言實作的程式“距離”作業系統更近,執行速度相對會更快。

redis使用了單線程架構,預防了多線程可能産生的競争問題。

作者對于redis源代碼可以說是精打細磨,曾經有人評價redis是少有的集性能和優雅于一身的開源代碼。

表1-1 谷歌公司給出的各層級硬體執行速度

層  級         速  度

l1 cache reference  0.5ns

branch mispredict   5ns

l2 cache reference  7ns

mutex lock/unlock   25ns

main memory reference 100ns

compress 1k bytes with zippy         3?000ns

send 2k bytes over 1 gbps network         20?000ns

read 1 mb sequentially from memory   250?000ns

round trip within same datacenter         500?000ns

disk seek 10?000?000ns

read 1 mb sequentially from disk   20?000?000ns

send packet ca-&gt;netherlands-&gt;ca          150?000?000ns

2.?基于鍵值對的資料結構伺服器

幾乎所有的程式設計語言都提供了類似字典的功能,例如java裡的map、python裡的dict,類似于這種組織資料的方式叫作基于鍵值的方式,與很多鍵值對資料庫不同的是,redis中的值不僅可以是字元串,而且還可以是具體的資料結構,這樣不僅能便于在許多應用場景的開發,同時也能夠提高開發效率。redis的全稱是remote dictionary server,它主要提供了5種資料結構:字元串、哈希、清單、集合、有序集合,同時在字元串的基礎之上演變出了位圖(bitmaps)和hyperloglog兩種神奇的“資料結構”,并且随着lbs(location based service,基于位置服務)的不斷發展,redis 3.2版本中加入有關geo(地理資訊定位)的

功能,總之在這些資料結構的幫助下,開發者可以開發出各種“有意思”的應用。

3.?豐富的功能

除了5種資料結構,redis還提供了許多額外的功能:

提供了鍵過期功能,可以用來實作緩存。

提供了釋出訂閱功能,可以用來實作消息系統。

支援lua腳本功能,可以利用lua創造出新的redis指令。

提供了簡單的事務功能,能在一定程度上保證事務特性。

提供了流水線(pipeline)功能,這樣用戶端能将一批指令一次性傳到redis,減少了網絡的開銷。

4.簡單穩定

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

redis雖然很簡單,但是不代表它不穩定。以筆者維護的上千個redis為例,沒有出現過因為redis自身bug而宕掉的情況。

5.?用戶端語言多

redis提供了簡單的tcp通信協定,很多程式設計語言可以很友善地接入到redis,并且由于redis受到社群和各大公司的廣泛認可,是以支援redis的用戶端語言也非常多,幾乎涵蓋了主流的程式設計語言,例如java、php、python、c、c++、nodejs等,第4章我們将對redis的用戶端進行詳細說明。

6.?持久化

通常看,将資料放在記憶體中是不安全的,一旦發生斷電或者機器故障,重要的資料可能就會丢失,是以redis提供了兩種持久化方式:rdb和aof,即可以用兩種政策将記憶體的資料儲存到硬碟中(如圖1-1所示),這樣就保證了資料的可持久性,第5章我們将對redis的持久化進行詳細說明。

7.?主從複制

redis提供了複制功能,實作了多個相同資料的redis副本(如圖1-2所示),複制功能是分布式redis的基礎。第6章我們将對redis的複制進行詳細說明。

8.?高可用和分布式

redis從2.8版本正式提供了高可用實作redis

sentinel,它能夠保證redis節點的故障發現和故障自動轉移。redis從3.0版本正式提供了分布式實作redis cluster,它是redis真正的分布式實作,提供了高可用、讀寫和容量的擴充性。

繼續閱讀