為什麼要使用Redis做快取

山有木xi發表於2020-04-27

對Redis,百度百科給出的的解釋是

Redis(Remote Dictionary Server ),即遠端字典服務,是一個開源的使用ANSI 編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value ,並提供多種語言的API

Redis 是一個高效能的key-value資料庫。 redis的出現,很大程度補償了 這類key/value儲存的不足,在部 分場合可以對關聯式資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。

那麼,Redis有什麼 優點

  • Redis支援資料持久化

  • Redis的讀寫效能非常優異

  • 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除

  • 支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合併後的原子性執行。

  • Redis的資料結構豐富,除了支援string型別的value外還支援hash、set、zset、list等資料結構。

相對應的,Redis也有 缺點

  • 資料庫容量會受到實體記憶體的限制,不能用作海量資料的高效能讀寫,因此Redis適合的場景主要侷限在較小資料量的高效能操作和運算上。

  • Redis 不具備自動容錯和恢復功能,主機從機的當機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。

  • 如果主機當機,當機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一致的問題,降低了系統的可用性。

  • Redis 較難支援線上擴容

  • Redis是單執行緒的,單臺伺服器無法充分利用多核伺服器的CPU

為什麼我們要使用Redis呢?

從高併發上來說:

  • 直接操作快取能夠承受的請求是遠遠大於直接訪問資料庫的,所以我們可以考慮把資料庫中的部分資料轉移到快取中去,這樣使用者的一部分請求會直接到快取這裡而不用經過資料庫

從高效能上來說:

  • 使用者第一次訪問資料庫中的某些資料。 因為是從硬碟上讀取的所以這個過程會比較慢。將該使用者訪問的資料存在快取中,下一次再訪問這些資料的時候就可以直接從快取中獲取了。操作快取就是直接操作記憶體,所以速度相當快。如果資料庫中的對應資料改變的之後,同步改變快取中相應的資料

為什麼要使用Redis而不是其他的,例如Java自帶的 map 或者 guava

  • 快取分為本地快取和分散式快取。以 Java 自帶的 map 或者 guava為例子, 實現的是本地快取,最主要的特點是輕量以及快速,生命週期隨著 jvm 的銷燬而結束,並且在多例項的情況下,每個例項都需要各自儲存一份快取,快取不具有一致性。

  • 使用 redis 或 memcached 之類的稱為分散式快取,在多例項的情況下,各例項共用一份快取資料,快取具有一致性。缺點是需要保持 redis 或 memcached服務的高可用,整個程式架構上較為複雜。

Redis為什麼這麼快

  • 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中

  • 資料結構簡單,對資料操作也簡單

  • 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程式或者多執行緒導致的切換而消耗 CPU

  • 使用多路 I/O 複用模型,非阻塞 IO


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2688704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章