当前位置: 首页 > news >正文

Redis原理:rename命令

RENAME key newkey

将一个key重命名为新key,如果key不存在,则会返回异常。如果newKey已经存在,则会被覆盖,其实newKey会被显示的删除,所以如果newKey是一个大key,则会引起延迟。

源码

void renameCommand(client *c)
{
    //调用rename通用方法
    //第二个参数为false
    renameGenericCommand(c, 0);
}
void renameGenericCommand(client *c, int nx)
{
    robj *o;
    long long expire;
    int samekey = 0;

    /* 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. */
    // 判断是否源key与目标key是否相同,相同则不会处理
    if (sdscmp(c->argv[1]->ptr, c->argv[2]->ptr) == 0)
        samekey = 1;
    // 如果旧key不存在,则报错
    if ((o = lookupKeyWriteOrReply(c, c->argv[1], shared.nokeyerr)) == NULL)
        return;
    // 如果前后key相同
    if (samekey)
    {
        // 如果nx == 0 则返回ok
        addReply(c, nx ? shared.czero : shared.ok);
        return;
    }
    // 增加引用计数
    incrRefCount(o);
    // 判断旧key是否过期
    expire = getExpire(c->db, c->argv[1]);
    // 如果目标key存在
    if (lookupKeyWrite(c->db, c->argv[2]) != NULL)
    {
        // nx == 1时,则需要目标key不存在
        if (nx)
        {
            //引用计数减一
            decrRefCount(o);
            addReply(c, shared.czero);
            return;
        }
        /* Overwrite: delete the old key before creating the new one
         * with the same name. */
        //目标key存在,则显示删除目标key
        dbDelete(c->db, c->argv[2]);
    }
    // 添加目标key
    dbAdd(c->db, c->argv[2], o);
    // 设置过期时间
    if (expire != -1)
        setExpire(c, c->db, c->argv[2], expire);
    // 删除旧key
    dbDelete(c->db, c->argv[1]);
    // 通知key修改
    signalModifiedKey(c, c->db, c->argv[1]);
    signalModifiedKey(c, c->db, c->argv[2]);
    // 通知事件
    notifyKeyspaceEvent(NOTIFY_GENERIC, "rename_from",
                        c->argv[1], c->db->id);
    notifyKeyspaceEvent(NOTIFY_GENERIC, "rename_to",
                        c->argv[2], c->db->id);
    server.dirty++;
    addReply(c, nx ? shared.cone : shared.ok);
}

从以上的源码也可以看出,其实做了以下几件事

  1. 判断源key是否存在,不存在则报错
  2. 判断源key与目标key是否相同,如果相同则直接返回
  3. 获取源key的值,并计数加1
  4. 获取源key的过期时间
  5. 如果nx == 1, 则目标key存在,会报错
  6. 如果nx == 0, 如果目标key存在,会先删除
  7. 将源key对应的值,设置到目标key上
  8. 删除源key
  9. 设置目标key的过期时间

从这里也可以看到,源key与目标key都会执行一次删除,如果两个都是大key,都可能会导致延迟。

相关文章:

  • 玩机搞机基本常识-------安卓机型各种root方式面面观 选择适合自己机型的root方式
  • 自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)
  • 人工智能图像识别大数据技术之Scala2
  • 工业通信协议“牵手密码”,Ethernet IP转Profinet网关的桥梁魔法
  • 体验智谱清言的AutoGLM进行自动化的操作(Chrome插件)
  • MySQL数据库中,tinyint(1) 和 tinyint 有什么区别
  • 深入剖析JavaScript多态:从原理到高性能实践
  • 基于R语言与MaxEnt的物种分布建模全流程解析:从算法优化到科研制图实战
  • C++编程指南32 - 模板编程时要避免过度约束以提高通用性
  • 蓝桥杯训练士兵
  • 单点登录(SSO)实战:基于Vue与Spring Boot的深度实现
  • 蓝桥复习3(AT240C2 EE2PROM IIC ) 继电器 蜂鸣器 PWM
  • 汇编学习之《push , pop指令》
  • LeetCode 94. 二叉树的中序遍历
  • PUSCH(Physical Uplink Shared Channel,物理上行共享信道)
  • 自动备份文件到服务器,自动备份文件到服务器有哪些方法?
  • SkyWalking+Springboot实战(最详细)
  • mysql 日期时间变成中文显示
  • 如何解决 Hive 在创建 MySQL 表时出现乱码???的问题
  • 堤坝决口快速沉箱,守护生命的抗洪防线|鼎跃安全
  • 经济日报整版聚焦:上海构建法治化营商环境,交出高分答卷
  • 第十届影像上海博览会落幕后,留给中国摄影收藏的三个问题
  • 上海北外滩开发建设五周年交出亮眼答卷,未来五年有何新目标?
  • 多地警务新媒体整合:关停交警等系统账号,统一信息发布渠道
  • 2025上海科技节本周六启幕,机器人和科学家同走AI科学红毯
  • 中美大幅下调超100%关税,印巴四日“战争”复盘|907编辑部