Redis ,真的不完美

GitChat 精品課發表於2019-04-18

640?wx_fmt=jpeg


本文選自 | 《Redis 實戰場景詳解》

Chat 作者 | 馳騁

整理 | DS


01

前言

顯而易見,如今的 Redis 已經進入了成熟期,但依舊存在很多疑難雜症。數以千計的開發者都在開發和使用這個資料庫,它擁有非常完善的文件。

我記得第一次使用 Redis,是為了在儲存有數百萬使用者的關聯式資料庫裡對某個條件進行查詢。在不斷優化後每次操作可以控制在 1 秒鐘甚至更短,帶給我相當大的震撼。

02

關於 Redis 特性

在 Redis 之前,很多網際網路公司會使用 MySQL + Memcached 架構,這個架構雖然適合於海量資料儲存,但隨著業務的增加,會出現很多問題。

Redis 就在這種時代背景中產生,你會發現 Memcached 遇到的問題都被 Redis 給解決了。

那麼 Redis 有哪些具體特性呢?大致可分為如下八大特性。

  • 速度極快。官方給出的資料是 10 萬次 ops 的讀寫,這主要歸功於這些資料都存在於記憶體中。由於 Redis 是開源的,當你開啟原始碼,就會發現 Redis 都是用 C 語言寫的,C 語言是最接近計算機語言的程式碼,而且只有區區 5 萬行,保證了 Redis 的速度。同時一個 Redis 只是一個單執行緒,其真正的原因還是因為單執行緒在記憶體中是效率最高的。

  • 持久化。Redis 的持久化可以保證將記憶體中的資料每隔一段時間就儲存於磁碟中,重啟的時候會再次載入到記憶體。持久化方式是 RDB 和 AOF。

  • 支援多種資料結構。分別支援雜湊、集合、BitMaps,還有點陣圖(多用於活躍使用者數等統計)、HyperLogLog(超小記憶體唯一值計數,由於只有 12K,是有一定誤差範圍的)、GEO(地理資訊定位)。

  • 支援多種程式語言。支援 Java、PHP、Python、Ruby、Lua、Node.js。

  • 功能豐富。如釋出訂閱、Lua 指令碼、事務、Pipeline(管道,即當指令到達一定數量後,客戶端才會執行)。

  • 簡單。不依賴外部庫、單執行緒、只有 23000 行 Code。

  • 主從複製。主節點的資料做副本,這是做高可用的基石。

  • 高可用和分散式。Redis-Sentinel(v2.8)支援高可用,Redis-Cluster(v3.0)支援分散式。

上面是一些 Redis 介紹性的內容,如果你還沒有接觸過 Redis,但又對此有興趣的話,這裡有適合工作實戰的教程

掃碼訂閱 Redis

640?wx_fmt=jpeg


如果已經開始用到 Redis,那麼你在應用過程中是否也遇到過下面的這些問題?

03

關於 Redis 疑難問題

在各種場景中,無論是什麼架構,你都可以將 Redis 融入專案中來,這可以解決很多關聯式資料庫無法解決的問題。

比如,現有資料庫處理緩慢的任務,或者在原有的基礎上開發新的功能,都可以使用 Redis。但大家在實踐中總會遇到難題,下面我們盤點一下:

  1. Redis 持久化問題?

  2. Redis 實際應用場景裡怎麼使用?

  3. 1000 個執行緒壓測時 Redis Incr 出現錯誤,就是 Timeout,怎麼排查?有什麼好的經驗分享?

  4. 批量查尋是用 MGET 好還是 Hash 更好,Hash 的效能瓶頸是多少,達到多少個 Key 或者多大容量後效能急劇下降?如果需要大批量的查例如 1000 個 Key,用什麼方案更好?MGET 在叢集模式下的實現方式是什麼,怎麼知道某個 Key 在哪個叢集分片上?Redis 最大併發大約支援 5~10 萬併發,假設現在有 20 萬或者 50 萬併發該怎麼辦?

  5. Redis 分散式叢集的幾種解決方案,哨兵等方案結合生產環境經驗的區別、優劣是什麼?

  6. jedispool 連結物件無法釋放,這個怎麼辦?程式碼寫了在 finally 裡面也執行了,然後看客戶端連線數越來越多,最後專案掛了怎麼辦?

  7. Redis 和資料庫同步、緩衝穿透、雪崩問題、hyperloglog slowqery 實現原理?

  8. 無論是 Win 或 Linux 都有此現象,伺服器 Redis 3.x,客戶端 Hiredis,在客戶機與伺服器間網路不穩定的情況下,客戶機可能收不到伺服器推送來的訊息,以及客戶機發布訊息時會塞死。是否能提供相關解決經驗?

  9. Redis 的連線數用什麼命令監測?

  10. Redis 的配置要主要哪些引數調優?

  11. 登入 Redis 出現提示,要求密碼 NOAUTH Authentication required 有什麼辦法可以免密登入?

  12. 有沒有在生產環境下用 Redis 做持久化儲存的例子?一般怎麼配置 AOF 和 RDB?在高併發並且儘量少資料丟失的情況下有哪些優化手段?

  13. 哨兵模式下 Client 是隨機挑選其中一個哨兵傳送 Request 嗎?那麼如果這個哨兵 Process 掛了會怎樣?

  14. Redis 叢集很多個 Redis 的話,是把多個 IP 全部寫到程式碼裡面,那會不會導致壓力不均衡?

  15. 要開始使用 Redis 的時候,如何預估生產環境需要多少計算資源(Cluster 機器數量、記憶體、CPU、硬碟空間、Slave 數量等)?有沒有一些通用的經驗?

  16. AOF 和 RDB 配合著用,恢復資料哪個為主?

  17. 假如記憶體 8G 的話,Redis 既然是執行在記憶體中,那 Redis 最大能存多大資料?

熟練使用和運維 Redis 已經成為開發人員的一個必備技能。

國外使用 Redis 的公司包括 Twitter、Instagram 等網際網路巨頭,而國內對 Redis 的使用更有後來者居上之勢,除 BAT 外,新浪微博已成為 Redis 全球最大的使用者。

點選閱讀原文,訂閱學習這場 Chat ,解決以上所有 Redis 疑難雜症!!

相關文章