當前位置:
首頁 > 知識 > Redis,真的不完美

Redis,真的不完美

Redis,真的不完美

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 全球最大的使用者。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

技術面試別扯智力題
開源操作系統 FreeDOS 二十五年演進史:因微軟拋棄 MS-DOS 而來

TAG:CSDN |