前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis源码】setrange命令

【Redis源码】setrange命令

作者头像
zeekling
发布2022-08-26 19:40:14
2640
发布2022-08-26 19:40:14
举报

简介

setrange命令主要用于设置value的部分子串,设置时将值从偏移量offset开始覆盖成value值。如果偏移值大于原值的长度,则偏移量之前的字符串由“\x00”填充。

命令格式:

代码语言:javascript
复制
setrange key offset value

setrange 命令

由于要指定值的偏移量,所以setrange在执行时会首先判断offset参数必须为long类型且必须大于等于0,否则设置失败。

与append命令一样,原key在Redis中不存在时,Redis会创建一个robj对象,并将robj先设置到数据库;当key在Redis中存在时,会要求原值必须为string类型,并且由于Redis的限制,value的长度加offset值必须小于512 MB。

代码语言:javascript
复制
if (checkStringLength(c,offset+sdslen(value)) != C_OK)
            return;

setrange命令会修改原value值,如果原值是共享类型的,则需解除共享,新创建一个新robj对象,对新对象进行操作。代码实现:

代码语言:javascript
复制
/* Create a copy when the object is shared or encoded. */
        o = dbUnshareStringValue(c->db,c->argv[1],o);

考虑到当value的长度加offset会大于原值长度时,需要额外分配空间用于存储新值并返回。此时调用了sdsgrowzero函数。sdsgrowzero函数会进行识别,只有当offset+sdslen(value)大于原值长度时才会扩充空间,否则直接返回原字符串。

代码语言:javascript
复制
o->ptr = sdsgrowzero(o->ptr,offset+sdslen(value));
memcpy((char*)o->ptr+offset,value,sdslen(value));

当有了robj的地址之后,从offset位置开始将value覆盖掉原值,通过memcpy函数来实现。

通过以上步骤,实现了字符串的setrange操作。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020.11.08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • setrange 命令
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档