“隐式 DEL 操作”与用户调用的 DEL 命令不同。
您可以将其配置为使用异步或同步删除。其背后的原因可能是为了给用户更多的控制权。
在 redis 配置文件中,LAZY FREEING 部分显示
FLUSHALL 和 FLUSHDB 的 DEL、UNLINK 和 ASYNC 选项由用户控制。
由应用程序的设计来了解何时是好的
使用其中一个的想法。然而,Redis 服务器有时必须
删除键或刷新整个数据库作为其他操作的副作用。**
具体来说,Redis 独立于用户调用删除对象
以下场景:
....
例如,RENAME 命令可能会在将旧密钥内容替换为 >another 时删除它。
....
在上述所有情况下,默认都是以阻塞的方式删除对象,
就像调用 DEL 一样。但是您可以具体配置每种情况
为了以非阻塞方式释放内存,例如如果 UNLINK
被调用,使用以下配置指令。
然后是配置
lazyfree-lazy-server-del no
只需将其切换为 YES,它的行为就会像 UNLINK
我检查了源代码,
对于 Redis 5.0 版本,调用 RENAME 命令时会调用该函数
void renameGenericCommand(client *c, int nx) {
// some code....
// When source and dest key is the same, no operation is performed,
// if the key exists, however we still return an error on unexisting key.
if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) samekey = 1;
// some code ...
if (samekey) {
addReply(c,nx ? shared.czero : shared.ok);
return;
}
...
/* Overwrite: delete the old key before creating the new one
* with the same name. */
dbDelete(c->db,c->argv[2]);
}
这是它调用的dbDelete函数
int dbDelete(redisDb *db, robj *key) {
return server.lazyfree_lazy_server_del ? dbAsyncDelete(db,key) :
dbSyncDelete(db,key);
}
如您所见,它确实引用了 lazyfree-lazy-server-del 的配置