您的位置:首页 > 数据库 > Redis

【redis-2.6.12】 ChangeDetail

2013-04-03 00:00 99 查看
Redis 2.6.12

UPGRADE URGENCY: MODERATE, nothing very critical but a few non trivial bugs.

[BUGFIX] redis-cli --bigkeys: don't crash with empty DB.

[BUGFIX] stop-writes-on-bgsave-error now works in redis.conf

[BUGFIX] Don't crash at startup if RDB is there but can't be opened.

[BUGFIX] Initial value for master_link_down_since_seconds is now huge.

[BUGFIX] Allow SELECT while loading the DB.

[BUGFIX] Don't replicate/AOF an empty MULTI/EXEC if the transaction is empty or containing just read-only commands.

[BUGFIX] EXPIRE should not be able to resurrect keys (see issue #1026).

[IMPROVED] Extended SET back ported from Redis 2.8 / unstable

[IMPROVED] Test suite improved.

[BUGFIX] redis-cli --bigkeys: don't crash with empty DB.

对应 commit :
f93d9929d8bc2d97345070c9caa9509c0481496e

说明 :

修复了对空的数据库执行redis-cli --bigkeys因为数据库为空,返回nil由于指针问题会导致SIGSEGV。

所谓bigkeys就是在redis中找到value占用内存最大的key

redis使用RANDOMKEY指令,进行随机采样,暴力的地找出近似最大的key

[BUGFIX] stop-writes-on-bgsave-error now works in redis.conf

对应 commit :
18d16f8592500d54831dde07727a68fcfd243442

说明 :

之前_stop-writes-on-bgsave-error_ 配置不起作用,

因为读配置的函数loadServerConfiginitServer之前。

而initServer里直接给**stop-writes-on-bgsave-error赋值1,所以直接覆盖掉了。

从选项的字面意思大致可以看出作用。bgsave主要由serverCron(_save_配置)或用户指令BGSAVE触发,

执行
rdbSaveBackground函数,通过fork子进程来生成内存快照,有CoW技术保证数据一致。

然后
serverCron不断等待子进程退出,如果子进程退出码非零,则表示出错。

通常由于磁盘只读引起。Redis在
backgroundSaveDoneHandlerlastbgsave_status设成REDIS_ERR**,

此时,如果执行写操作的命令,并且设置了该配置就会直接返回具体的出错信息,"blabla disk blabla error ..."

[BUGFIX] Don't crash at startup if RDB is there but can't be opened.

对应 commit :
b9f8c2a5b0e4a0217ff9c181e61595c89d1ba1f7

说明 :

这儿应该是作者表述有误, 在2.6.11里,只要fopen rdb文件失败都标记为ENOENT

这样当文件存在,但是不可以打开时会直接跳过(没任何日志)。

新版本出现这种问题会直接exit(1)

所以这个BUGFIX的说明有点点问题 :)

[BUGFIX] Initial value for master_link_down_since_seconds is now huge.

对应 commit :
4f8b18f3dd8a4a7feaa8b8d4c41d894b75f73405

说明 : 略... 主要是为了INFO显示时,可以更准确,并不是显示redis启动时间。

[BUGFIX] Allow SELECT while loading the DB.

对应 commit :
68189054067d54bf0c1f697244ff5b6b8842635c

说明 :

类似我上一篇写
3ff0
的[BUGFIX] Allow AUTH while loading the DB in memory.

这里我复制一下过来:

这儿增加了 'l' 标志,在redis中表示REDIS_CMD_LOADING

直观地说,就是允许redis仍在loading阶段(初始化、读rdb等等)就可以接收指令,

详见populateCommandTableprocessCommand两个函数。

同样为'l'标志的有sub/pub相关的cmd和info。

[BUGFIX] Don't replicate/AOF an empty MULTI/EXEC if the transaction is empty or containing just read-only commands.

对应 commit :
611dcb56ee6a07066dd491ffbae102f0498acdcc

说明 :

execCommand里对批量执行的多个指令进行过滤,跳过REDIS_CMD_READONLY(只读)的指令

[BUGFIX] EXPIRE should not be able to resurrect keys (see issue #1026).

对应 commit :

140260409eef36dd4d155e488eb9531cf119728e

说明 :

默认redis会在serverCronactiveExpireCycle来清理过期的key,但是每次只对每个db最多处理10个。

所以,如果expires dict比较多来不及清理,在后面调用EXPIRE的expireGenericCommand函数时,

因为原来使用dictFind不会检查expires dict,这样相当于原来本应该删除的key复活了...

lookupKeyRead函数会调expireIfNeeded来避免这种情况

[IMPROVED] Extended SET back ported from Redis 2.8 / unstable

对应 commit :

d785413d868e5817a2bfb5994e3833d6f6ced9c6

说明 :

新特性,详见:http://www.redis.io/commands/set

给SET指令丰富了选项,可以设超时、存在覆盖、非存在写入等。

感觉以后可以把那些SETEX, SEXTNX等等指令归一了。

[IMPROVED] Test suite improved.

对应 commit :

说明 : 一堆tcl测试脚本,针对本次bugfix和新特性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息