寫在前面:筆者翻閱了不少資料,只能找到Redis2.2及之後的主要版本的發佈日誌。因此,讓咱們從2.2開始一步一步深刻了解Redis。
2.2redis
- redis-cli命令很是大的改進: Tab補全,支持help(例如help SET、help BITCOUNT),原生輸出,並用最新的hiredis C庫對其進行重寫。
- copy-on-write機制對不少讀命令支持更友好,這就意味着,若是大部分是讀操做的話,fork出來的子進程只須要不多的內存便可。
- 新命令WATCH,實現CAS事務。
- 能夠對具備EXPIRE失效屬性的KEY進行寫操做。
- 全新的SETBIT、GETBIT、SETRANGE、GETRANGE、STRLEN命令,操做string就像一個數組同樣,咱們能夠進行位操做。
- 支持syslog(在配置文件中指定:syslog-enabled yes)。
- List新增了不少命令:LINSERT,LPUSHX,RPUSHX,BRPOPLPUSH 。
- 更強大的INFO命令。
- 啓動時加載RDB或者AOF是無阻塞的,而且在INFO輸出有進度信息。
- hiredis:強大的C語言Redis客戶端庫。
- 支持在配置文件中rename重命名(rename-command KEYS afeikeys)者禁用(rename-command KEYS "")命令。
syslog說明:數組
在Linux的世界裏,有兩種寫日誌的方式:緩存
1. 就是把日誌寫到文件中,隨着時間的推移,咱們會寫到一個新的文件中。這種方式的問題就是,若是有不少的服務產生不少的日誌,那麼就比較麻煩了。性能優化
2.利用syslog服務記錄日誌,在幾乎全部可用的Unix和Linux服務器的TCP和UDP端口514上運行一個名爲syslog的服務,syslog接受任何向其發送的日誌消息並將這些消息路由到各類消息的磁盤上的日誌文件,同時處理舊日誌的滾動和刪除。經過配置,它甚至能夠將消息轉發到其餘服務器以進行進一步處理,它是遠比直接記錄到文件更方便,由於全部的特殊日誌文件的滾動和刪除已經幫咱們作好了。服務器
2.4網絡
Redis2.4沒有值得大書特書的特性,大部分是一些bug fix或者特性加強,這個版本的新特性一覽:數據結構
- VM deprecated,還會支持不過會給出告警,不建議使用。
- 新增CLIENT命令,支持KILL,LIST等操做,從而可以觀察CLIENT的一些信息;
- 新增OBJECT命令,從而可以觀察對象的一些內在信息,好比對象是什麼編碼;
- 經過直接經過CONFIG SET在不重啓Redis服務的狀況下關閉密碼受權;
- 若是沒有設置密碼,而又經過AUTH發送密碼進行鑑權,那麼返回ERROR。
- redis-cli新增實現了--latency模式,以便能監控採樣Redis延遲。
- 當fsync刷新策略是everysec的時候,AOF fsync在後臺執行。
- SADD, HDEL, SREM, ZREM, ZADD, L/RPUSH命令加強,增長對可變參數的支持(老版本只支持一個參數)。
2.6架構
Redis2.6新特性以下:併發
- 服務側的Lua腳本支持,經過EVAL執行,例如:eval "return redis.call('set','foo','bar')" 0。
- 失效時間支持毫秒精度,而且相應的增長了毫秒級失效的命令:PEXPIRE、PSETEX和PTTL等。
- 支持只讀的Slave。
- 支持位操做命令:BITCOUNT和BITOP,還有不少其餘新增的命令,例如:DUMP, RESTORE, MIGRATE等。
- RDB文件中新增CRC64校驗值。
- SHUTDOWN支持兩個選項:SAVE和NOSAVE。
- INFO命令輸出按段分割。
- watchdog特性定位延遲問題,只需執行config set watchdog-period 100就能開啓該特性,若是值是0就表示關閉該特性。須要說明的是,該特性不能在配置文件中開啓。
- 集成內存測試模式,參考執行:redis-server --test-memory 1024。
- 全部redis.conf中的配置均可以經過redis-server的命令行選項指定。
- hash table的seed隨機化,以防止碰撞攻擊。
- 去掉虛擬內存你功能(2.4已經deprecated)。
- 去掉對客戶端鏈接數硬編碼限制。
watchdog能夠參考:https://redis.io/topics/latency,筆者接下來也會單獨撰文進行深刻剖析。異步
2.8
Redis2.8雖然沒有很是重磅的新特性,可是它很是很是穩定,除了沒有分佈式特性,我挑不出太大的毛病,高可用能夠由sentinel保證。筆者當年經歷過的一個項目,用Redis2.8.23這個版本,單機模式,10G+的數據量,竟然穩定的運行了500天左右。
即便到如今,若是你的項目不須要幾十個G的緩存,我依然認爲Redis2.8.x這個版本是不錯的選擇,結合sentinel模式保證高可用,並且相比Redis3.x的分佈式集羣模式,它的架構更簡單,並且不須要妥協任何功能和命令(Redis cluster模式下,不少命令功能閹割,或者受到限制。固然,Redis3.x之後的高版本,也能夠只用sentinel,能夠不用redis cluster架構)。
OK,仍是來看一下2.8新特性吧:
- slave支持從master部分同步,這樣就能避免主從斷開一下子時間(例如網絡抖動)後須要經過RDB全量同步。
- 支持IPv6。
- 支持config set maxclients 1024。
- 支持綁定多個IP地址。
- CONFIG REWRITE可以將經過CONFIG SET操做的配置輸出在redis.conf配置文件中。
- 新增PUBSUB命令,即爲了實現Pub/Sub的自省能力。
- 經過Pub/Sub實現keyspaces的變化通知,例如實現過時KEY的通知功能。
- 若是在最大延遲下沒有足夠數量從,主能夠中止寫請求。配置參考以下:
# 例如,至少3個延遲在10秒之內的slave,master纔會正常寫入:
# min-slaves-to-write 3
# min-slaves-max-lag 10
3.0
Redis3.0絕對是一個里程碑版本,耗時4年纔開發完成。在Redis3.0以前,Redis是沒有分佈式模式的(sentinel模式只能保證高可用)。正由於這樣,致使民間出現了不少Redis分佈式方案,比較有名氣的3種是:1. Redis客戶端分片,2. twemproxy,3. codis(豌豆莢)。
Redis3.0的重磅功能有:
- Redis Cluster,即Redis分佈式模式,Redis3.0最重磅的特性;
- WAIT命令阻塞,直到寫命令被同步到指定數量的slave上,命令始終返回寫命令發送的slaves的數量。用法:WAIT numslaves timeout。例如:WAIT 2 5000,即等待2個slave同步全部寫命令並設置超時5秒鐘。
- 新增CLIENT PAUSE命令,例如:CLIENT PAUSE 10000,即中止處理客戶端命令10秒鐘,這時候若是有新的命令執行,會一直阻塞。
- CONFIG SET命令加強,支持不一樣的單位,例如CONFIG SET maxmemory 1gb、CONFIG SET maxmemory 1024mb;
- MIGRATE命令加強,增長了COPY和REPLACE操做。
- Redis日誌作了小小的調整,日誌中會反應當前實例的角色,很明顯是爲了Redis Cluster。
3.2
Redis3.2版本的一些重要特性以下:
- Lua debugger,官方給出了參考視頻,不過是在Youtube上:https://www.youtube.com/watch?v=IMvRfStaoyM,能不能看的了就靠本身了。
- CONFIG SET/GET實現重寫,支持更多的操做項。
- 新增HSTRLEN命令,返回hash結構指定field的value的字符串長度,若是hash或者field不存在,那麼返回0。
- 經過RESIZEDB避免沒必要要的hash擴容,實現更快的RDB加載速度。
- 新增對GEO的支持,並提供若干個操做GEO的命令,例如:GEOADD, GEORADIUS,GEOHASH,GEOPOS等。
- 實現CLIENT REPLY,並支持三種操做:ON、OFF、SKIP。ON就是正常模式,服務端會回覆請求。OFF模式下,服務端不會對任意命令回覆。這種狀況通常用於發送-忘記的場景下,例如:大量緩存數據加載,利用OFF模式能夠關閉響應,節省帶寬等資源。
- SPOP命令支持count參數,使用參考:SPOP key [count]。即刪除並返回count個元素。
- List類型新的編碼方式:Quicklists。在RDB文件中能節省不少內存和存儲空間。
- 極力向你們推薦推薦一個Java架構方面的交流學習qq羣:834962734,裏面有:Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系,進羣立刻免費領取學習資源!真的不錯。
4.0
Redis官方給出沒有命名爲3.4而是4.0的緣由是:這個版本添加了不少重要的特性,並且不少核心功能被重寫了。讓咱們看一下Redis4.0主要的功能有哪些:
- Redis模塊系統,這個功能的實現,開發者能夠爲Redis自定義擴展,實現新的數據結構等任意特性。
- PSYNC版本升級到v2版本,優化了以前版本中,主從節點切換必然引發全量複製的問題。
- 緩存驅逐策略加強,新增了LFU策略,即Least Frequently Used。
- 異步刪除(延遲迴收)。Redis4.0能夠在後臺異步刪除KEY,而不須要同步阻塞服務端,經過新增的命令UNLINK實現,用法:UNLINK key [key …]。
- 混合RDB-AOF格式,這種格式被用在重寫AOF文件的時候,重寫用更緊湊更快速的方式生成RDB文件,AOF流追加到這個文件上,這樣的話,AOF持久化重寫和從新加載的速度更快,參考配置:aof-use-rdb-preamble yes。
- 增長一個MEMORY命令,可否作不少不一樣的內存分析工做,例如內存問題排查、查看一個KEY用了多少內存、提供與INFO命令內容相比更加深刻地報告Redis內存使用狀況;
- Redis能夠整理內存碎片化了,能在運行的過程當中回收內存空間,參考配置:activedefrag yes,還有不少對應的配置參數,能夠在Redis4.0之後的版本的redis.conf中查看。
- Redis集羣支持NAT/Docker。
memory命令使用參考--查看一個KEY用了多少內存(單位是字節),相信不少同窗不知道這個神奇的命令吧,那麼,如今就GET它吧:
> SET foo bar
OK
> MEMORY USAGE foo
(integer) 54
5.0
這是Redis最新的一個主要版本,筆者以前有篇文章對Redis5.0有深刻分析,感興趣的朋友請戳:。5.0的重要特性主要有:
- Streams數據結構,Redis一個全新的數據結構,借鑑了不少kafka的設計(這個數據結構筆者以前也有文章介紹,詳情請戳:)。
- Redis集羣管理腳本從Ruby(redis-trib.rb)遷移到存C,且集成到redis-cli中(redis-cli --cluster)。
- Sorted Set新增兩個重要的命令:ZPOPMIN和ZPOPMAX。
- 支持HZ動態化;
- 再也不使用slave這個詞,除非爲了API向後兼容(種族歧視問題)。
- Lua腳本能夠設置超時。
- CLIENT支持兩個新命令:CLIENT ID和CLIENT UNBLOCK。