redis簡介以及與memcached比較

來源:互聯網
上載者:User

標籤:

  一.redis

  (1)簡介:

  Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。是noSql資料庫的一種。

  redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊類型)。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。  Redis 是一個高效能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部分場合可以對關聯式資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很方便。Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。存檔可以有意無意的對資料進行寫操作。由於完全實現了發布/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息發布記錄。同步對讀取操作的可擴充性和資料冗餘很有協助。  (2)常用命令:     就DB來說,Redis成績已經很驚人了,且不說memcachedb和Tokyo Cabinet之流,就說原版的memcached,速度似乎也只能達到這個層級。Redis根本是使用記憶體儲存,持久化的關鍵是這三條指令:SAVE BGSAVE LASTSAVE …當接收到SAVE指令的時候,Redis就會dump(轉儲)資料到一個檔案裡面。值得一說的是它的獨家功能:儲存列表和集合,這是它與mc之流相比更有競爭力的地方。不介紹mc裡面已經有的東東,只列出特殊的:TYPE key — 用來擷取某key的類型KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,當然,複雜度O(n)RANDOMKEY - 返回隨機的一個keyRENAME oldkeynewkey— key也可以改名列表操作,精華RPUSH key string — 將某個值加入到一個key列表末尾LPUSH key string — 將某個值加入到一個key列表頭部LLEN key — 列表長度LRANGE key start end — 返回列表中某個範圍的值,相當於mysql裡面的分頁查詢那樣LTRIM key start end — 只保留列表中某個範圍的值LINDEX key index — 擷取列表中特定索引號的值,要注意是O(n)複雜度LSET key index value — 設定列表中某個位置的值LPOP keyRPOP key — 和上面的LPOP一樣,就是類似棧或隊列的那種取頭取尾指令,可以當成訊息佇列來使用了集合操作SADD key member — 增加元素SREM key member — 刪除元素SCARD key — 返回集合大小SISMEMBER key member — 判斷某個值是否在集合中SINTER key1 key2 ... keyN — 擷取多個集合的交集元素SMEMBERS key — 列出集合的所有元素還有Multiple DB的命令,可以更換db,資料可以隔離開,預設是存放在DB 0。

  二.redis與memcached比較

  眾多NoSQL百花齊放,如何選擇

  最近幾年,業界不斷湧現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是瞭解這些產品的定位,並且瞭解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題

  1.少量資料存放區,高速讀寫訪問。此類產品通過資料全部in-momery 的方式來保證高速訪問,同時提供資料落地的功能,實際這正是Redis最主要的適用情境。

  2.海量資料存放區,分布式系統支援,資料一致性保證,方便的叢集節點添加/刪除。

  3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞叢集資訊,資料保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,資料寫入先寫記憶體和redo log,然後定期compat歸併到磁碟上,將隨機寫最佳化為順序寫,提高寫入效能。

  4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支援schema-free的,直接儲存json格式資料,並且支援auto-sharding等功能,比如mongodb。

  面對這些不同類型的NoSQL產品,我們需要根據我們的業務情境選擇最合適的產品。

  Redis適用情境,如何正確的使用

  前面已經分析過,Redis最適合所有資料in-momory的情境,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?

 

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

1  Redis不僅僅支援簡單的k/v類型的資料,同時還提供list,set,zset,hash等資料結構的儲存。

2  Redis支援資料的備份,即master-slave模式的資料備份。

3  Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。

拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。

在Redis中,並不是所有的資料都一直儲存在記憶體中的。這是和Memcached相比一個最大的區別。Redis只會緩衝所有的 key的資訊,如果Redis發現記憶體的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在記憶體中清除。這種特性使得Redis可以 保持超過其機器本身記憶體大小的資料。當然,機器本身的記憶體必須要能夠保持所有的key,畢竟這些資料是不會進行swap操作的。同時由於Redis將記憶體 中的資料swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共用這部分記憶體,所以如果更新需要swap的資料,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。

使用Redis特有記憶體模型前後的情況對比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on:  300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on:  1 million keys, 256 bytes values: 160.09M used
VM on:  1 million keys, values as large as you want, still: 160.09M used

當 從Redis中讀取資料的時候,如果讀取的key對應的value不在記憶體中,那麼Redis就需要從swap檔案中載入相應資料,然後再返回給請求方。 這裡就存在一個I/O線程池的問題。在預設的情況下,Redis會出現阻塞,即完成所有的swap檔案載入後才會相應。這種策略在用戶端的數量較小,進行 大量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程式程式中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設定I/O線程 池的大小,對需要從swap檔案中載入相應資料的讀取請求進行並行作業,減少阻塞的時間。

如果希望在海量資料的環境中使用好Redis,我相信理解Redis的記憶體設計和阻塞的情況是不可缺少的。

補充的知識點:

memcached和redis的比較

1 網路IO模型

  Memcached是多線程,非阻塞IO複用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將串連描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多執行緒模式可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全域變數加鎖,進行計數等工作,帶來了效能損耗。

 (memcached網路IO模型)

Redis使用單線程的IO複用模型,自己封裝了一個簡單的AeEvent事件處理架構,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、彙總等,對於這些操作,單執行緒模式實際會嚴重影響整體輸送量,CPU計算過程中,整個IO調度都是被阻塞住的。

  2.記憶體管理方面

  Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體片段產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

  Redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來最佳化記憶體配置,會在一定程度上存在記憶體片段,Redis跟據儲存命令參數,會把帶到期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便實體記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上Redis更適合作為儲存而不是cache。

  3.資料一致性問題

  Memcached提供了cas命令,可以保證多個並發訪問操作同一份資料的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

  4.儲存方式及其它方面

  Memcached基本只支援簡單的key-value儲存,不支援枚舉,不支援持久化和複製等功能

  Redis除key/value之外,還支援list,set,sorted set,hash等眾多資料結構,提供了KEYS

  進行枚舉操作,但不能線上上使用,如果需要枚舉線上資料,Redis提供了工具可以直接掃描其dump檔案,枚舉出所有資料,Redis還同時提供了持久化和複製等功能。

  5.關於不同語言的用戶端支援

  在不同語言的用戶端方面,Memcached和Redis都有豐富的第三方用戶端可供選擇,不過因為Memcached發展的時間更久一些,目前看在用戶端支援方面,Memcached的很多用戶端更加成熟穩定,而Redis由於其協議本身就比Memcached複雜,加上作者不斷增加新的功能等,對應第三方用戶端跟進速度可能會趕不上,有時可能需要自己在第三方用戶端基礎上做些修改才能更好的使用。

  根據以上比較不難看出,當我們不希望資料被踢出,或者需要除key/value之外的更多資料類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。

  關於Redis的一些周邊功能

  Redis除了作為儲存之外還提供了一些其它方面的功能,比如彙總計算、pubsub、scripting等,對於此類功能需要瞭解其實現原理,清楚地瞭解到它的局限性後,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支援的,消費方串連閃斷或重連之間過來的訊息是會全部丟失的,又比如彙總計算和scripting等功能受Redis單執行緒模式所限,是不可能達到很高的輸送量的,需要謹慎使用。

  總的來說Redis作者是一位非常勤奮的開發人員,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入瞭解後再使用。

  總結:

  1.Redis使用最佳方式是全部資料in-memory。

  2.Redis更多情境是作為Memcached的替代者來使用。

  3.當需要除key/value之外的更多資料類型支援時,使用Redis更合適。

  4.當儲存的資料不能被剔除時,使用Redis更合適。

  以上資訊轉自:http://gnucto.blog.51cto.com/3391516/998509

redis簡介以及與memcached比較

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.