1. 存儲數據結構
Redis 總的以 HashTable 存儲,內部存儲 5 種數據結構。
- Key-String 字符串存儲;
- Key-List 列表存儲;
- Key-Hash 哈希存儲;
- Key-Set 集合存儲;
- Key-Zset 有序集合存儲。
其他高級命令:
keys 全量遍歷鍵(謹慎使用) scan 漸進式遍歷鍵 >scan 0 match * count 1000 從遊標位置,匹配 1000 條記錄,返回遊標加集合 >scan p1 match p2 count p3 其中,3 個參數,p1:遊標,p2:匹配內容,p3:查詢數量。
2.特點、實現&部分配置
2.1 特點
- 連接請求使用單線程,無線程間切換損耗 此處注意,單線程只是接收命令的入口使用單線程。還有其他線程用於處理持久化,AOF 重寫以及其他操作。
- I/O多路複用
- 內存數據,基本操作在納秒級別。緩存數據被存在內存中,訪問速度非常迅速。但需要注意的是,避免使用消耗資源較大的命令,如 keys ,若數據量小時沒問題,如果數據量非常龐大時,將會影響 Redis 的性能,比如數據的傳輸變慢,佔用內存飆高,CPU 上升等問題。
2.2 Redis持久化機制與內存淘汰策略
- 快照持久化:
默認開啓,配置快照持久化後,會生成一個快照文件(相當於將數據打包並且壓縮備份好,默認:dump.rdb),並可以配置生成快照文件的頻率。啓動加載 RDB 文件。 配置文件名與文件保存地址。 - AOF 持久化:
默認關閉,開啓此配置後,將會生成一個 AOF 文件,內部記錄的 Redis 啓動後執行的所有命令。啓動執行 AOF 文件內的命令。
1.首先開啓配置:appendonly yes
2.配置文件名: appendfilename “appendonly.aof” 生成文件目錄與 RDB 路徑相同
AOF 文件的生成規則:
這樣的配置,涉及持久化文件的重寫,配置:
- 文件擴大 100% 的時候重寫;
- 文件大於 64M 的時候才能觸發重寫動作。
這裏所說的重寫是指,Redis 啓動後,除了生成快照的持久化,還有 AOF 記錄命令的持久化,當 AOF 文件過大,且達到重寫的條件後,將 AOF 內的命令與 RDB 文件結合,重新生成 RDB,而 AOF 內的命令將會清除,開始記錄新的命令。
-
持久化文件有了,並且理論上大小不限,那麼 Redis 的數據就要收到內存的限制了,那麼是否會將內存撐爆呢?
查看內存管理模塊,可以看到一大部分註釋,最後一行,默認是註釋掉的,就相當於不限制 Redis 的內存使用,那麼如果數據了持久增加的情況下,內存會爆掉。可以適當設置內存的大小,比如設置 8GB,在集羣的情況下,不需要設置太高,保持良好性能。 -
設置好了內存大小限制,那麼當內存滿了之後,Redis 將會如何處理呢?
此時,需要提供緩存淘汰策略了,配置當內存達到最大時,按照一定規則去刪除內存中舊的值。
Redis 提供了多種緩存淘汰策略。LRU:表示最近最少使用; LFU:表示最不常用的。
區別在於:LFU 是一定時間內訪問最少的,比如 10 分鐘內訪問最少的,而 LRU 則是指服務啓動後,訪問量最少的內容。 下面按順序說明下淘汰策略:- 篩選出設置了有效期的,最近最少使用的 key;
- 所有 key 中,篩選出最近最少使用的 key;
- 篩選出設置了有效期的,最不常用的 key;
- 所有 key 中,篩選出最不常用的 key ;
- 隨機篩選出設置了有效期的 key;
- 所有 key 中,隨機篩選出 key進行刪除;
- 篩選出所有設置有效期的 key 中,有效期最短的 key;
- 拒絕策略,當內存滿了之後,服務不做任何處理,直接返回一個錯誤 Redis 默認是拒絕策略,可根據實際情況做出設置。
-
這樣做的目的是什麼呢?
在 Redis 服務重啓時,快照數據恢復的時間,比 AOF 一行行執行命令快;
AOF 是實時記錄 Redis 執行的命令的,不會造成命令丟失,而快照是要滿足一定條件才能出發(如,記錄變動了 1 次,不滿足更新快照的條件,此時服務宕機了,那麼重啓時,這次變動的數據就丟失了,而 AOF 記錄下了執行的命令)。這樣就防止了數據的丟失;
快速恢復快照的內容,之後再執行剩餘的 AOF 內的命令,完整恢復數據。