【特性】Redis4.0新特性

模塊系統

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 2.0

新版本的 PSYNC 命令解決了舊版本的 Redis 在複製時的一些不夠優化的地方:github

  • 在舊版本 Redis 中, 若是一個從服務器在 FAILOVER 以後成爲了新的主節點, 那麼其餘從節點在複製這個新主的時候就必須進行全量複製。 在 Redis 4.0 中, 新主和從服務器在處理這種狀況時, 將在條件容許的狀況下使用部分複製。
  • 在舊版本 Redis 中, 一個從服務器若是重啓了, 那麼它就必須與主服務器從新進行全量複製, 在 Redis 4.0 中, 只要條件容許, 主從在處理這種狀況時將使用部分複製。

緩存驅逐策略優化

新添加了 Last Frequently Used 緩存驅逐策略, 具體信息見 antirez 的博文《Random notes on improving the Redis LRU algorithm》: http://antirez.com/news/109redis

另外 Redis 4.0 還對已有的緩存驅逐策略進行了優化, 使得它們可以更健壯、高效、快速和精確。sql

非阻塞 DEL 、 FLUSHDB 和 FLUSHALL

在 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"                 -- 證實兩個數據庫已經互換

 

混合 RDB-AOF 持久化格式

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

兼容 NAT 和 Docker

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
相關文章
相關標籤/搜索