摘要:在 Redis 之前,很多互聯網公司會使用 MySQL + Memcached 架構,這個架構雖然適合於海量數據存儲,但隨着業務的增加,會出現很多問題。Redis 持久化問題。

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

如果已經開始用到 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 疑難雜症!!

相關文章