我們爲什麼要用Redis

 

最近閱讀了《 Redis 開發與運維》,非常不錯。這裏對書中的知識整理一下,方便自己回顧 Redis 的整個體系,來對相關知識點查漏補缺。

按照五點把書中的內容進行一下整理:

1、爲什麼要選擇 Redis:介紹Redis的使用場景與使用 Redis 的原因;

2、Redis 常用命令總結:包括時間複雜度總結與具體數據類型在 Redis 內部使用的數據結構;

3、Redis 的高級功能:包括持久化、複製、哨兵、集羣介紹;

4、理解 Redis:理解內存、阻塞,這部分是非常重要的,前面介紹的都可以成爲術,這裏應該屬於道的部分;

5、開發技巧:主要是一些開發實戰的總結,包括緩存設計與常見坑點。

先來開啓第一部分的內容,對Redis來一次重新打量。

Redis 不是萬金油

在面試的時候,常被問比較下 Redis 與 Memcache 的優缺點,個人覺得這二者並不適合一起比較,一個是非關係型數據庫不僅可以做緩存還能幹其他事情,一個是僅用做緩存。常常讓我們對這二者進行比較,主要也是由於 Redis 最廣泛的應用場景就是 Cache,那麼 Redis 到底能幹什麼?又不能幹什麼呢?

Redis都可以幹什麼事兒

緩存,毫無疑問這是 Redis 當今最爲人熟知的使用場景,再提升服務器性能方面非常有效。

1.排行榜,如果使用傳統的關係型數據庫來做,非常麻煩,而利用 Redis 的 SortSet 數據結構能夠非常方便搞定;

2.計算器/限速器,利用 Redis 中原子性的自增操作,我們可以統計類似用戶點贊數、用戶訪問數等,這類操作如果用 MySQL,頻繁的讀寫會帶來相當大的壓力;限速器比較典型的使用場景是限制某個用戶訪問某個 API 的頻率,常用的有搶購時,防止用戶瘋狂點擊帶來不必要的壓力;

 

3.好友關係,利用集合的一些命令,比如求交集、並集、差集等,可以方便搞定一些共同好友、共同愛好之類的功能;

4.簡單消息隊列,除了 Redis 自身的發佈/訂閱模式,我們也可以利用 List 來實現一個隊列機制,比如到貨通知、郵件發送之類的需求,不需要高可靠,但是會帶來非常大的 DB 壓力,完全可以用 List 來完成異步解耦;

5.Session 共享,以 PHP 爲例,默認 Session 是保存在服務器的文件中,如果是集羣服務,同一個用戶過來可能落在不同機器上,這就會導致用戶頻繁登陸;採用 Redis 保存 Session 後,無論用戶落在那臺機器上都能夠獲取到對應的 Session 信息。

 

Redis 不能幹什麼事兒

Redis 感覺能幹的事情特別多,但它不是萬能的,合適的地方用它事半功倍,如果濫用可能導致系統的不穩定、成本增高等問題。

1.比如,用 Redis 去保存用戶的基本信息,雖然它能夠支持持久化,但是它的持久化方案並不能保證數據絕對的落地,並且還可能帶來 Redis 性能下降,因爲持久化太過頻繁會增大 Redis 服務的壓力。

2.簡單總結就是數據量太大、數據訪問頻率非常低的業務都不適合使用 Redis,數據太大會增加成本,訪問頻率太低,保存在內存中純屬浪費資源。

 

選擇總需要找個理由

上面說了 Redis 的一些使用場景,那麼這些場景的解決方案也有很多其它選擇,比如緩存可以用 Memcache,Session共享還能用 MySql 來實現,消息隊列可以用RabbitMQ,我們爲什麼一定要用 Redis 呢?

速度快,完全基於內存,使用 C 語言實現,網絡層使用 epoll 解決高併發問題,單線程模型避免了不必要的上下文切換及競爭條件;

注意:單線程僅僅是說在網絡請求這一模塊上用一個請求處理客戶端的請求,像持久化它就會重開一個線程/進程去進行處理。

豐富的數據類型,Redis 有 8 種數據類型,當然常用的主要是 String、Hash、List、Set、 SortSet 這 5 種類型,他們都是基於鍵值的方式組織數據。每一種數據類型提供了非常豐富的操作命令,可以滿足絕大部分需求,如果有特殊需求還能自己通過 lua 腳本自己創建新的命令(具備原子性);

除了提供的豐富的數據類型,Redis 還提供了像慢查詢分析、性能測試、Pipeline、事務、Lua自定義命令、Bitmaps、HyperLogLog、發佈/訂閱、Geo 等個性化功能。

Redis 的代碼開源在 GitHub,代碼非常簡單優雅,任何人都能夠吃透它的源碼;它的編譯安裝也是非常的簡單,沒有任何的系統依賴;有非常活躍的社區,各種客戶端的語言支持也是非常完善。另外它還支持事務(沒用過)、持久化、主從複製讓高可用、分佈式成爲可能。

做爲一個開發者,對於我們使用的東西不能讓它成爲一個黑盒子,我們應該深入進去,對它更瞭解、更熟悉,今天簡單說了下 Redis 的使用場景,以及爲什麼選擇了 Redis 而不是其他。

 

轉載自:http://ifeve.com/%e6%88%91%e4%bb%ac%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8redis/#more-43560

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