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