Redis存儲方式介紹
在 Redis 中數據是以鍵值對的凡事存儲的,鍵(Key)和值(Value)是基本的數據存儲單元。以下是對 Redis 鍵值對的詳細講解:
鍵(Key):
類型:鍵是字符串類型,可以包含任何二進制數據。
長度限制:鍵的最大長度為 512 MB。
命名規范:雖然 Redis 對鍵的命名沒有嚴格的要求,但為了提高可讀性和管理性,通常使用有意義的命名規范。例如:?session:abc123
值(Value):
值可以是多種數據類型之一,Redis 提供了豐富的數據結構來存儲不同類型的數據:
比如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set,ZSet)、位圖(Bitmap)、HyperLogLog、地理空間索引(Geospatial)、流(Stream)
這里以字符串類型舉例,其他數據類型后面會介紹
基礎全局命令介紹
設置和獲取鍵值對(string)
這里操作就是這是一個key1?value1的鍵值對,key1為鍵,value1為值
設置好后,再用get命令獲取到key1對應的值
獲取到value1
檢查鍵是否存在
exists key
因為有key1,所以使用key1可以查詢到,返回了1
(這里也可以一次性查詢多個key,返回就是有幾個查到了,就返回幾)
沒有key2,查詢不到,返回0
查找鍵
keys [pattern]
返回所有滿足樣式(pattern)的 key。支持如下統配樣式。
h?llo 匹配 hello , hallo 和 hxllo
h*llo 匹配 hllo 和 heeeello
h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
h[a-b]llo 匹配 hallo 和 hbllo
?keys *?返回數據庫中所有key
使用 keys?命令在 Redis 中有很大的風險,特別是在生產環境中。這是因為 keys?命令會掃描整個數據庫并返回匹配指定模式的所有鍵。這種操作可能會對 Redis 服務器的性能產生嚴重影響,特別是在鍵數量較多的情況下。
keys命令的風險
-
性能問題:
KEYS
命令是阻塞操作,會遍歷整個數據庫來查找匹配的鍵。- 在鍵數量較多時,執行
KEYS
命令可能會導致 Redis 服務卡頓,影響其他操作的響應時間。 - 這種操作的時間復雜度為 O(N),其中 N 是數據庫中的鍵數量。
-
阻塞客戶端:
- 如果一個客戶端執行
KEYS
命令,其他客戶端的請求可能會被阻塞,直到KEYS
命令執行完畢。 - 在高并發場景下,這種阻塞可能導致大量請求堆積,造成 Redis 服務不可用。
- 如果一個客戶端執行
-
內存消耗:
KEYS
命令返回的結果集可能非常大,導致返回的數據量超出客戶端的處理能力。- 結果集需要在內存中存儲,可能導致 Redis 服務器的內存壓力增大。
當然,也有其他命令可以代替keys,比如scan命令,后面會講到。
在數據量很小的情況下,使用keys命令問題不大。
?刪除鍵
del key
這里因為存在key1,所以使用del刪除返回1,表示刪除成功1個
但是key2不存在,沒有刪除任何key,返回0
設置過期時間
expire key seconds? ? ? ? (單位是秒)
pexpire?key?millisecond? ? ? ? (單位是毫秒)
設置key1,然后設置key1的過期時間為10秒
10秒后用exists查詢,返回0,說明key1已經過期被刪除了
查詢鍵的剩余生存時間
TTL:獲取鍵的剩余生存時間(單位是秒)
PTTL:獲取鍵的剩余生存時間(單位是毫秒)
設置鍵值對并設置過期時間
用ttl和pttl查詢剩余過期時間
過期后,key1被刪除,返回-2
如果返回-1,說明key是永久存在的,沒有設置過期時間
redis過期策略
Redis 通過多種策略來管理鍵的過期和內存回收
可以在redis系統文件的配置,也就是redis.conf里修改過期策略
1. 惰性刪除(Lazy Deletion)
惰性刪除策略意味著當客戶端訪問某個鍵時,Redis 會檢查該鍵是否已經過期。如果該鍵已經過期,Redis 將立即刪除它,并返回一個不存在的結果。
- 實現方式:
- 每次讀取或寫入一個鍵時,Redis 都會檢查該鍵的過期時間。
- 如果過期時間已到,Redis 會刪除該鍵,然后返回不存在的結果或進行相應的寫操作。
- 優點:
- 不會額外占用 CPU 資源,因為只在訪問鍵時進行檢查。
- 缺點:
- 過期鍵在沒有被訪問時仍會占用內存。
2. 定期刪除(Periodic Deletion)
定期刪除策略是指 Redis 以固定的時間間隔對帶有過期時間的鍵進行掃描和刪除。
- 實現方式:
- Redis 內部會運行一個后臺任務,以每秒 10 次的頻率隨機抽取一部分帶有過期時間的鍵進行檢查。
- 如果發現這些鍵已經過期,Redis 會刪除它們。
- 優點:
- 相對平衡了性能和內存回收的需求。
- 可以在一定程度上避免大量過期鍵長時間占用內存。
- 缺點:
- 由于是定期抽樣檢查,仍有可能存在一些過期鍵在被檢查到之前長時間占用內存。
Redis 過期鍵處理策略(惰性刪除和定期刪除)是內置的,不需要特別配置。
但是可以通過以下配置調整定期刪除的頻率:(在redis.conf配置文件里)
hz 10
這表示 Redis 的事件循環頻率,每秒執行 10 次事件循環。這個值會影響定期刪除過期鍵的頻率。
3. 主動刪除(Active Deletion)
主動刪除策略主要是通過內存淘汰策略(Eviction Policy)來實現,當 Redis 內存達到配置的最大使用量時,會主動刪除一些鍵來釋放內存。
-
配置方式:
- 可以通過
maxmemory
配置項設置 Redis 的最大內存使用量。 - 可以通過
maxmemory-policy
配置項設置內存淘汰策略,包括以下幾種:volatile-lru
:從設置了過期時間的鍵中移除最近最少使用的鍵。allkeys-lru
:從所有鍵中移除最近最少使用的鍵。volatile-lfu
:從設置了過期時間的鍵中移除最不常使用的鍵。allkeys-lfu
:從所有鍵中移除最不常使用的鍵。volatile-ttl
:從設置了過期時間的鍵中移除將要過期的鍵。noeviction
:當內存達到限制時,不再進行刪除操作,直接返回錯誤。volatile-random
:從設置了過期時間的鍵中隨機移除鍵。allkeys-random
:從所有鍵中隨機移除鍵。
- 可以通過
-
優點:
- 可以確保 Redis 在達到內存上限時繼續運行。
- 根據不同的策略,可以優化特定場景下的性能和內存使用。
-
缺點:
- 可能導致一些熱鍵(高頻訪問的鍵)被移除,從而影響性能。
4. 內存淘汰策略
當 Redis 內存使用達到限制時,會根據配置的內存淘汰策略刪除一些鍵,以釋放內存。以下是一些常用的內存淘汰策略:
- LRU(Least Recently Used):刪除最近最少使用的鍵。
- LFU(Least Frequently Used):刪除使用頻率最少的鍵。
- TTL(Time to Live):刪除最早過期的鍵。
- 隨機刪除:隨機刪除一些鍵。
可以通過 maxmemory-policy
配置項來設置具體的淘汰策略。
比如:
maxmemory-policy allkeys-lru
這表示當達到最大內存限制時,Redis 將采用 LRU策略在所有鍵中移除最近最少使用的鍵。