Redis 4.0 發生的最大變化就是加入了模塊系統, 這個系統可讓用戶經過本身編寫的代碼來擴展和實現 Redis 自己並不具有的功能, 具體使用方法能夠參考 antirez 的博文《Redis Loadable Module System》: http://antirez.com/news/106node
由於模塊系統是經過高層次 API 實現的, 它與 Redis 內核自己徹底分離、互不干擾, 因此用戶能夠在有須要的狀況下才啓用這個功能, 如下是 redis.conf
中記載的模塊載入方法:python
################################## MODULES ##################################### # Load modules at startup. If the server is not able to load modules # it will abort. It is possible to use multiple loadmodule directives. # # loadmodule /path/to/my_module.so # loadmodule /path/to/other_module.so
目前已經有人使用這個功能開發了各類各樣的模塊, 好比 Redis Labs 開發的一些模塊就能夠在 http://redismodules.com 看到, 此外 antirez 本身也使用這個功能開發了一個神經網絡模塊: https://github.com/antirez/neural-redismysql
模塊功能使得用戶能夠將 Redis 用做基礎設施, 並在上面構建更多功能, 這給 Redis 帶來了無數新的可能性。git
新版本的 PSYNC
命令解決了舊版本的 Redis 在複製時的一些不夠優化的地方:github
新添加了 Last Frequently Used 緩存驅逐策略, 具體信息見 antirez 的博文《Random notes on improving the Redis LRU algorithm》: http://antirez.com/news/109redis
另外 Redis 4.0 還對已有的緩存驅逐策略進行了優化, 使得它們可以更健壯、高效、快速和精確。sql
在 Redis 4.0 以前, 用戶在使用 DEL
命令刪除體積較大的鍵, 又或者在使用 FLUSHDB
和 FLUSHALL
刪除包含大量鍵的數據庫時, 均可能會形成服務器阻塞。docker
爲了解決以上問題, Redis 4.0 新添加了 UNLINK
命令, 這個命令是 DEL
命令的異步版本, 它能夠將刪除指定鍵的操做放在後臺線程裏面執行, 從而儘量地避免服務器阻塞:數據庫
redis> UNLINK fruits
(integer) 1
由於一些歷史緣由, 執行同步刪除操做的 DEL
命令將會繼續保留。緩存
此外, Redis 4.0 中的 FLUSHDB
和 FLUSHALL
這兩個命令都新添加了 ASYNC
選項, 帶有這個選項的數據庫刪除操做將在後臺線程進行:
redis> FLUSHDB ASYNC OK redis> FLUSHALL ASYNC OK
Redis 4.0 對數據庫命令的另一個修改是新增了 SWAPDB
命令, 這個命令能夠對指定的兩個數據庫進行互換: 好比說, 經過執行命令 SWAPDB 0 1
, 咱們能夠將原來的數據庫 0 變成數據庫 1 , 而原來的數據庫 1 則變成數據庫 0 。
如下是一個使用 SWAPDB
的例子:
redis> SET your_name "huangz" -- 在數據庫 0 中設置一個鍵 OK redis> GET your_name "huangz" redis> SWAPDB 0 1 -- 互換數據庫 0 和數據庫 1 OK redis> GET your_name -- 如今的數據庫 0 已經沒有以前設置的鍵了 (nil) redis> SELECT 1 -- 切換到數據庫 1 OK redis[1]> GET your_name -- 以前在數據庫 0 設置的鍵如今能夠在數據庫 1 找到 "huangz" -- 證實兩個數據庫已經互換
Redis 4.0 新增了 RDB-AOF 混合持久化格式, 這是一個可選的功能, 在開啓了這個功能以後, AOF 重寫產生的文件將同時包含 RDB 格式的內容和 AOF 格式的內容, 其中 RDB 格式的內容用於記錄已有的數據, 而 AOF 格式的內存則用於記錄最近發生了變化的數據, 這樣 Redis 就能夠同時兼有 RDB 持久化和 AOF 持久化的優勢 —— 既可以快速地生成重寫文件, 也可以在出現問題時, 快速地載入數據。
這個功能能夠經過 aof-use-rdb-preamble
選項進行開啓, redis.conf
文件中記錄了這個選項的使用方法:
# When rewriting the AOF file, Redis is able to use an RDB preamble in the # AOF file for faster rewrites and recoveries. When this option is turned # on the rewritten AOF file is composed of two different stanzas: # # [RDB file][AOF tail] # # When loading Redis recognizes that the AOF file starts with the "REDIS" # string and loads the prefixed RDB file, and continues loading the AOF # tail. # # This is currently turned off by default in order to avoid the surprise # of a format change, but will at some point be used as the default. aof-use-rdb-preamble no
新添加了一個 MEMORY
命令, 這個命令能夠用於視察內存使用狀況, 並進行相應的內存管理操做:
redis> MEMORY HELP
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
2) "MEMORY STATS - Show memory usage details"
3) "MEMORY PURGE - Ask the allocator to release memory"
4) "MEMORY MALLOC-STATS - Show allocator internal stats"
其中, 使用 MEMORY USAGE
子命令能夠估算儲存給定鍵所需的內存:
redis> SET msg "hello world" OK redis> SADD fruits apple banana cherry (integer) 3 redis> MEMORY USAGE msg (integer) 62 redis> MEMORY USAGE fruits (integer) 375
使用 MEMORY STATS
子命令能夠查看 Redis 當前的內存使用狀況:
redis> MEMORY STATS
1) "peak.allocated"
2) (integer) 1014480
3) "total.allocated"
4) (integer) 1014512
5) "startup.allocated"
6) (integer) 963040
7) "replication.backlog"
8) (integer) 0
9) "clients.slaves"
10) (integer) 0
11) "clients.normal"
12) (integer) 49614
13) "aof.buffer"
14) (integer) 0
15) "db.0"
16) 1) "overhead.hashtable.main"
2) (integer) 264
3) "overhead.hashtable.expires"
4) (integer) 32
17) "overhead.total"
18) (integer) 1012950
19) "keys.count"
20) (integer) 5
21) "keys.bytes-per-key"
22) (integer) 10294
23) "dataset.bytes"
24) (integer) 1562
25) "dataset.percentage"
26) "3.0346596240997314"
27) "peak.percentage"
28) "100.00315093994141"
29) "fragmentation"
30) "2.1193723678588867"
使用 MEMORY PURGE
子命令能夠要求分配器釋放更多內存:
redis> MEMORY PURGE
OK
使用 MEMORY MALLOC-STATS
子命令能夠展現分配器內部狀態:
redis> MEMORY MALLOC-STATS Stats not supported for the current allocator
Redis 4.0 將兼容 NAT 和 Docker , 具體的使用方法在 redis.conf
中有記載:
########################## CLUSTER DOCKER/NAT support ######################## # In certain deployments, Redis Cluster nodes address discovery fails, because # addresses are NAT-ted or because ports are forwarded (the typical case is # Docker and other containers). # # In order to make Redis Cluster working in such environments, a static # configuration where each node known its public address is needed. The # following two options are used for this scope, and are: # # * cluster-announce-ip # * cluster-announce-port # * cluster-announce-bus-port # # Each instruct the node about its address, client port, and cluster message # bus port. The information is then published in the header of the bus packets # so that other nodes will be able to correctly map the address of the node # publishing the information. # # If the above options are not used, the normal Redis Cluster auto-detection # will be used instead. # # Note that when remapped, the bus port may not be at the fixed offset of # clients port + 10000, so you can specify any port and bus-port depending # on how they get remapped. If the bus-port is not set, a fixed offset of # 10000 will be used as usually. # # Example: # # cluster-announce-ip 10.1.1.5 # cluster-announce-port 6379 # cluster-announce-bus-port 6380