為什麼使用Redis及其產品定位
傳統MySQL+ Memcached架構遇到的問題
實際MySQL是適合進行海量資料儲存的,透過Memcached將熱點資料載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務資料量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:
- MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作佔據大量開發時間。
- Memcached與MySQL資料庫資料一致性問題。
- Memcached資料命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。
- 跨機房cache同步問題。
眾多NoSQL百花齊放,如何選擇
最近幾年,業界不斷湧現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是瞭解這些產品的定位,並且瞭解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題
- 少量資料儲存,高速讀寫訪問。此類產品透過資料全部in-momery 的方式來保證高速訪問,同時提供資料落地的功能,實際這正是Redis最主要的適用場景。
- 海量資料儲存,分散式系統支援,資料一致性保證,方便的叢集節點新增/刪除。
- 這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間透過gossip方式傳遞叢集資訊,資料保證最終一致性,後者是一箇中心化的方案設計,透過類似一個分散式鎖服務來保證強一致性,資料寫入先寫記憶體和redo log,然後定期compat歸併到磁碟上,將隨機寫最佳化為順序寫,提高寫入效能。
- Schema free,auto-sharding等。比如目前常見的一些文件資料庫都是支援schema-free的,直接儲存json格式資料,並且支援auto-sharding等功能,比如mongodb。
面對這些不同型別的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。
Redis適用場景,如何正確的使用
前面已經分析過,Redis最適合所有資料in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?
Redis與Memcached的比較
- 網路IO模型
- 記憶體管理方面
- 資料一致性問題
- 儲存方式及其它方面
- 關於不同語言的客戶端支援
Memcached是多執行緒,非阻塞IO複用的網路模型,分為監聽主執行緒和worker子執行緒,監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe 傳遞給worker執行緒,進行讀寫IO, 網路層使用libevent封裝的事件庫,多執行緒模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全域性變數加鎖,進行計數等工作,帶來了效能損耗。
![為什麼使用Redis及其產品定位](https://i.iter01.com/images/20bbb502cbfd791cf630eda25770b24d225de2e3bcc40a85bbb019ee361cebc4.jpg)
(Memcached網路IO模型)
Redis使用單執行緒的IO複用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單執行緒可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單執行緒模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO排程都是被阻塞住的。
Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除,原因可以參考Timyang的文章:
Redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來最佳化記憶體分配,會在一定程度上存在記憶體碎片,Redis跟據儲存命令引數,會把帶過期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便實體記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上Redis更適合作為儲存而不是cache。
Memcached提供了cas命令,可以保證多個併發訪問操作同一份資料的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。
Memcached基本只支援簡單的key-value儲存,不支援列舉,不支援持久化和複製等功能
Redis除key/value之外,還支援list,set,sorted set,hash等眾多資料結構,提供了KEYS
進行列舉操作,但不能線上上使用,如果需要列舉線上資料,Redis提供了工具可以直接掃描其dump檔案,列舉出所有資料,Redis還同時提供了持久化和複製等功能。
在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發展的時間更久一些,目前看在客戶端支援方面,Memcached的很多客戶端更加成熟穩定,而Redis由於其協議本身就比Memcached複雜,加上作者不斷增加新的功能等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。
根據以上比較不難看出,當我們不希望資料被踢出,或者需要除key/value之外的更多資料型別時,或者需要落地功能時,使用Redis比使用Memcached更合適。
關於Redis的一些周邊功能
Redis除了作為儲存之外還提供了一些其它方面的功能,比如聚合計算、pubsub、scripting等,對於此類功能需要了解其實現原理,清楚地瞭解到它的侷限性後,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支援的,消費方連線閃斷或重連之間過來的訊息是會全部丟失的,又比如聚合計算和scripting等功能受Redis單執行緒模型所限,是不可能達到很高的吞吐量的,需要謹慎使用。
總的來說Redis作者是一位非常勤奮的開發者,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入瞭解後再使用。
總結:
- Redis使用最佳方式是全部資料in-memory。
- Redis更多場景是作為Memcached的替代者來使用。
- 當需要除key/value之外的更多資料型別支援時,使用Redis更合適。
- 當儲存的資料不能被剔除時,使用Redis更合適。
後續關於Redis文章計劃:
- Redis資料型別與容量規劃。
- 如何根據業務場景搭建穩定,可靠,可擴充套件的Redis叢集。
- Redis引數,程式碼最佳化及二次開發基礎實踐。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477398/viewspace-1258878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼要使用 Redis?Redis
- 瓴羊隱私計算產品的定位是什麼?
- Redis為什麼快及其高可用技術的幾種方案Redis
- Redis為什麼要使用跳躍表Redis
- 為什麼要使用Redis做快取Redis快取
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- 如何做產品定位?
- 為什麼要用RedisRedis
- redis為什麼快Redis
- 為什麼我們做分散式使用Redis?分散式Redis
- 為什麼Redis叢集要使用反向代理?Redis
- 為什麼通才能成為更好的產品經理 - productcoalition
- 軟體產品為什麼要做壓力測試?
- 程式設計師與產品之間應該如何配合,什麼時候技術為重,什麼時候產品為重?程式設計師
- Redis為什麼那麼快?Redis
- Redis為什麼這麼快?Redis
- 你的Redis為什麼變慢了?常見延遲問題定位與分析Redis
- 聊聊產品的重新定位
- 資料庫產品用什麼抓住使用者資料庫
- 機器學習為什麼難以產品化? - kdnuggests機器學習
- 「轉」產品助理、產品經理、產品負責人、產品總監有什麼區別?
- 為什麼Redis這麼快?5分鐘成為Redis高手Redis
- 分散式為什麼使用Redis,以及他的好處分散式Redis
- Facebook產品設計人談什麼是產品思維?
- 為什麼產品經理總被吐槽是”水貨“
- 為什麼SaaS產品需要一個完善的幫助中心?
- 我們為什麼要用RedisRedis
- 為什麼要做Redis分割槽?Redis
- 為什麼要用Redis叢集?Redis
- 為什麼產品思考是使用者體驗設計時所不可或缺的?
- 解放AI生產力——為什麼要使用ComfyUIAIUI
- 破玩意 | Redis 為什麼那麼快Redis
- 什麼是定位?
- 為什麼 Redis 要有哨兵機制?Redis
- redis為什麼要提供pipeline功能Redis
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- 我選單為什麼跟著滑動了?!!—— 固定定位為什麼會失效?
- 作為AI產品經理,我們到底在優化什麼?AI優化
- 產品經理應該讀什麼書?