redis核心原理

2021-09-27 11:16:07 字數 2477 閱讀 4015

1、redis的單執行緒和高效能

redis 單執行緒為什麼快?

因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算(納秒),而且單執行緒避免了多執行緒的切換(上下文切換)效能損耗問題。正因為 redis 是單執行緒,所以要小心使用 redis 指令,對於那些耗時的指令(比如keys),一定要謹慎使用,一不小心就可能會導致 redis 卡頓。

redis 單執行緒如何處理那麼多的併發客戶端連線?

redis的io多路復用:redis利用epoll來實現io多路復用,將連線資訊和事件放到佇列中,

依次放到檔案事件分派器,事件分派器將事件分發給事件處理器。

2.持久化

rdb快照(snapshot)

在預設情況下, redis 將記憶體資料庫快照儲存在名字為dump.rdb的二進位制檔案中。

你可以對 redis 進行設定, 讓它在n秒內資料集至少有m個改動這一條件被滿足時, 自動儲存一次資料集。

比如說, 以下設定會讓 redis 在滿足60秒內有至少有1000個鍵被改動」這一條件時, 自動儲存一次資料集:

redis.conf檔案裡面有預設的3種情況,3種是或的關係。

快照功能並不是非常耐久(durable): 如果 redis 因為某些原因而造成故障停機, 那麼伺服器將丟失最近寫入、且仍未儲存到快照中的那些資料。從 1.1 版本開始, redis 增加了一種完全耐久的持久化方式: aof 持久化,將修改的每一條指令記錄進檔案

你可以通過修改配置檔案來開啟 aof 功能:

開啟後,每當 redis 執行乙個改變資料集的命令時(比如set), 這個命令就會被追加到 aof 檔案的末尾。

這樣的話, 當 redis 重新啟時, 程式就可以通過重新執行 aof 檔案中的命令來達到重建資料集的目的。

你可以配置 redis 多久才將資料fsync到磁碟一次。

有三個選項:

每次有新命令追加到 aof 檔案時就執行一次fsync:非常慢,也非常安全。

每秒fsync一次:足夠快(和使用 rdb 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料。

從不fsync:將資料交給作業系統來處理。更快,也更不安全的選擇。

推薦(並且也是預設)的措施為每秒fsync一次, 這種fsync策略可以兼顧速度和安全性。

3.rdb 和 aof ,應該用哪乙個?

如果你非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失, 那麼你可以只使用 rdb 持久化。

有很多使用者都只使用 aof 持久化, 但我們並不推薦這種方式: 因為定時生成 rdb 快照(snapshot)非常便於進行資料庫備份,

並且 rdb 恢復資料集的速度也要比 aof 恢復的速度要快。

4.快取淘汰策略(解決資料熱點問題)

當 redis 記憶體超出物理記憶體限制時,記憶體的資料會開始和磁碟產生頻繁的交換 (swap)。

交換會讓 redis 的效能急劇下降,對於訪問量比較頻繁的 redis 來說,這樣速度的訪問效率基本上等於不可用。

在生產環境中我們是不允許 redis 出現交換行為的,為了限制最大使用記憶體,

redis 提供了配置引數 maxmemory 來限制記憶體超出期望大小。

當實際記憶體超出 maxmemory 時,

redis 提供了幾種可選策略 (maxmemory-policy) 來讓使用者自己決定該如何騰出新的空間以繼續提供讀寫服務。

(1)noeviction

不會繼續服務寫請求 (del 請求可以繼續服務),讀請求可以繼續進行。這樣可以保證不會丟失資料,但是會讓線上的業務不能持續進行。這是預設的淘汰策略。

(2)volatile-lru

嘗試淘汰設定了過期時間的 key,最少使用的 key 優先被淘汰。

沒有設定過期時間的 key 不會被淘汰,這樣可以保證需要持久化的資料不會突然丟失。

(3)volatile-ttl

跟上面一樣,除了淘汰的策略不是 lru,而是 key 的剩餘壽命 ttl 的值,ttl 越小越優先被淘汰。

(4)volatile-random

跟上面一樣,不過淘汰的 key 是過期 key 集合中隨機的 key。

(5)allkeys-lru

區別於 volatile-lru,這個策略要淘汰的 key 物件是全體的 key 集合,而不只是過期的 key 集合。

這意味著沒有設定過期時間的 key 也會被淘汰。

allkeys-random跟上面一樣,不過淘汰的策略是隨機的 key。

==(6)volatile-*** ==

策略只會針對帶過期時間的 key 進行淘汰,allkeys-*** 策略會對所有的 key 進行淘汰。如果你只是拿 redis 做快取,那應該使用 allkeys-***,客戶端寫快取時不必攜帶過期時間。如果你還想同時使用 redis 的持久化功能,那就使用 volatile-*** 策略,這樣可以保留沒有設定過期時間的 key,它們是永久的 key 不會被 lru 演算法淘汰。

Redis深度歷險 核心原理與應用實踐

高可用架構 的各位老鐵們,你們好!你是否還記得上個月發布的文章中,有兩篇深入講解redis的文章,分別是 挑戰kafka redis5.0重量級特性stream嘗鮮 和 10個常見的redis面試 刁難 問題 廣大粉絲讀者們對這兩篇文章整體評價頗高。而我就是這兩篇文章的原創作者 老錢 錢文品 我是來...

Redis深度歷險 核心原理與應用實踐

高可用架構 的各位老鐵們,你們好!你是否還記得上個月發布的文章中,有兩篇深入講解redis的文章,分別是和,廣大粉絲讀者們對這兩篇文章整體評價頗高。而我就是這兩篇文章的原創作者 老錢 錢文品 我是來自掌閱的服務端技術專家。上週我用了蹩腳的英語向redis作者antirez就 跳躍列表 的演算法問題向...

Redis 深度歷險 核心原理與應用實踐 全集

1 redis核心原理和應用實踐 集群 3 眾志成城 cluster 2 redis核心原理和應用實踐 拓展 1 耳聽八方 stream 3 redis核心原理和應用實踐 拓展 2 無所不知 info 指令 4 redis核心原理和應用實踐 拓展 4 朝生暮死 過期策略 5 redis核心原理和應用...