<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->netherlands->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真正的分布式實作,提供了高可用、讀寫和容量的擴充性。