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

【赵渝强老师】Redis中的字符串

b435

Redis的优势之一在于提供了丰富的数据类型,它不仅仅支持基本的Key-Value类型数据,还提供list、set、zset和hash等数据结构的存储。Redis没有直接使用C语言传统的字符串表示方式,而是自己构建了一种名为简单动态字符串的抽象类型,并将该类型用作Redis的默认字符串表示。简单动态字符串的英文是Simple Dynamic String,缩写为SDS。视频讲解如下:

image.png
点击这里查看视频讲解:【赵渝强老师】Redis中的字符串

Redis使用SDS表示字符串的优势在于:

  • 获取字符串的长度的事件复杂度为o(1)。
  • API安全,即通过API操作sds不会造成缓冲区溢出。
  • 每次修改字符串不一定需要进行内存分配,提高性能。
  • 可以保存文本和二进制数据。

SDS字符串的结构声明如下:

struct sdshdr {// 记录 buf 数组中已经使用字节的数量// 等于 SDS 所保存字符串的长度unsigned int len;// 记录 buf 数组中还未使用字节的数量unsigned int free;// 字节数组,数据域,保存字符数据char buf[];
};

SDS字符串结构中的buf是一个柔性数组(Flexible Array Member),又称伸缩性数组成员,这种数组主要是为了结构体而产生的。因为开发时,偶尔需要在结构体中存放长度可变的数组,一般情况下会定义一个数组指针,在需要时分配内存使用,这样有个缺点就是,内存利用的效率很低,所以柔性数组作用就像动态数组一样,可以在结构体中存放一个长度动态的字符串。下图展示了一个使用SDS存储的字符串。
image

下面是在Redis中如何操作字符串。

  • SET key value
    设置指定key的值
# 对不存在的键进行设置
redis 127.0.0.1:6379> SET key "value"
OKredis 127.0.0.1:6379> GET key
"value"# 对已存在的键进行设置
redis 127.0.0.1:6379> SET key "new-value"
OKredis 127.0.0.1:6379> GET key
"new-value"
  • GET key
    获取指定key的值
# 对不存在的 key 或字符串类型 key 进行 GET
redis> GET db
(nil)redis> SET db redis
OKredis> GET db
"redis"# 对不是字符串类型的 key 进行 GET
redis> DEL db
(integer) 1redis> LPUSH db redis mongodb mysql
(integer) 3redis> GET db
(error) ERR Operation against a key holding the wrong kind of value
  • GETRANGE key start end
    返回 key 中字符串值的子字符
redis> SET mykey "This is my test key"
OKredis> GETRANGE mykey 0 3
"This"redis> GETRANGE mykey 0 -1
"This is my test key"
  • GETSET key value
    将给定key的值设为value ,并返回key的旧值(old value)
redis> DEL db
(integer) 1redis> GETSET db mongodb    # 没有旧值,返回 nil
(nil)redis> GET db
"mongodb"redis> GETSET db redis      # 返回旧值 mongodb
"mongodb"redis> GET db
"redis"
  • MGET key1 [key2..]
    获取所有(一个或多个)给定key的值
redis> SET key1 "hello"
OKredis> SET key2 "world"
OKredis> MGET key1 key2 someOtherKey
1) "Hello"
2) "World"
3) (nil)
  • SETEX key seconds value
    将值value关联到key ,并将key的过期时间设为seconds(以秒为单位)
redis> SETEX mykey 10 redis
OKredis> TTL mykey
10redis> GET mykey
"redis
  • SETNX key value
    只有在key不存在时设置 key 的值
redis> EXISTS job                # job 不存在
(integer) 0redis> SETNX job "programmer"    # job 设置成功
(integer) 1redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败
(integer) 0redis> GET job                   # 没有被覆盖
"programmer"
  • SETRANGE key offset value
    用value参数覆写给定key所储存的字符串值,从偏移量offset开始
redis> SET key1 "Hello World"
OKredis> SETRANGE key1 6 "Redis"
(integer) 11redis> GET key1
"Hello Redis"
  • STRLEN key
    返回key所储存的字符串值的长度
# 获取字符串的长度
redis> SET mykey "Hello world"
OKredis> STRLEN mykey
(integer) 11# 不存在的 key 长度为 0
redis> STRLEN nonexisting
(integer) 0
  • MSET key value [key value ...]
    同时设置一个或多个key-value对
redis> MSET key1 "Hello" key2 "World"
OKredis> GET key1
"Hello"redis> GET key2
1) "World"
  • MSETNX key value [key value ...]
    同时设置一个或多个key-value对,当且仅当所有给定key都不存在
# 对不存在的 key 进行 MSETNX
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"# MSET 的给定 key 当中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python"  
(integer) 0               # rmdbs键已经存在,操作失败redis> EXISTS language    # 因为MSET是原子性操作,language没有被设置
(integer) 0redis> GET rmdbs          # rmdbs也没有被修改
"MySQL"
  • PSETEX key milliseconds value
    这个命令和SETEX命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位
redis> PSETEX mykey 1000 "Hello"
OKredis> PTTL mykey
999redis> GET mykey
1) "Hello"
  • APPEND key value
    如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)的末尾
# 对不存在的 key 执行 APPEND
redis> EXISTS myphone            # 确保myphone不存在
(integer) 0redis> APPEND myphone "nokia"    # 对不存在的key进行APPEND等同于SET myphone "nokia"
(integer) 5                      # 字符长度# 对已存在的字符串进行 APPEND
redis> APPEND myphone " - 1110"  # 长度从5个字符增加到12个字符
(integer) 12redis> GET myphone
"nokia - 1110"
http://www.jsqmd.com/news/539278/

相关文章:

  • OpenCV+YOLOv3目标检测实战:5分钟搞定视频流实时检测(附Python/C++代码)
  • 2026年广州靠谱的讯灵AI渠道经理推荐,联系方式查询 - 工业推荐榜
  • 用LoRA低成本定制你的Qwen模型:单卡搞定角色扮演AI(附西游记数据集)
  • Anaconda 介绍、安装
  • 2026讯灵AI渠道经理移动电话所在公司,AISaaS产品靠谱吗 - myqiye
  • 工业铁盒宇宙:08 当 PLC 遇上机器人,工厂智能化的“团战模式”开启
  • DOA估计中的ESPRIT算法:除了LS和TLS,别忘了还有TAM这个实用变体
  • 男士油痘肌洁面实测:常天然舒护氨基酸洁面乳凭什么适配多数男生肤质? - 资讯焦点
  • 2026年北京知识产权法律服务排名,探讨哪家强更适合你 - mypinpai
  • 2026年 安全门窗十大品牌推荐 沿海家庭抗醛之选 - 资讯焦点
  • 海澜之家与无锡马拉松的三年:一场关于信任、热爱与未来的长跑 - 资讯焦点
  • 瑜伽动作教学动图辅助:雯雯的后宫-造相Z-Image-瑜伽女孩多帧提示词设计
  • 山东一卡通快速回收全攻略:高效、安全又专业的选择 - 团团收购物卡回收
  • 山东一卡通快速回收:简单便捷的回收平台,助您省时省力! - 团团收购物卡回收
  • EGM英皇环球金融:黄金投资策略及市场适配指南 - 资讯焦点
  • 探讨知识产权服务多少钱,北京万信达收费合理吗 - 工业设备
  • 绣花厂家怎么选?从义乌市天瑀服饰的实践,看懂高精度刺绣加工的关键细节 - 企师傅推荐官
  • 2026家用咖啡机推荐:打造家庭咖啡角的理想选择 - 品牌排行榜
  • FPGA实战:用Verilog实现可逆十进制计数器(附七段数码管驱动代码)
  • 保姆级教程:在Ubuntu 20.04上搞定地平线OE 3.2.0 GPU Docker环境(含NVIDIA驱动避坑)
  • 灵感画廊实战教程:如何导出生成图元数据用于AIGC版权存证
  • 2026年钢铁公司怎么选,仁和(天津)钢铁与同行对比优势大起底 - mypinpai
  • Newtonsoft.Json-for-Unity完整指南:解决Unity JSON序列化难题的终极方案
  • 避开这些坑!基于Arduino Uno的Grbl固件DIY数控雕刻机实战指南
  • 戴尔灵越/游匣用户看过来:保姆级Ubuntu 24.04 + Win11双系统安装避坑指南
  • Jieba中文分词实战:从入门到精通(附N元模型应用示例)
  • 从E1到STM-1:手把手拆解一个2M信号在SDH网络里的“打包上车”全流程(含C12/VC12/TU12详解)
  • 记忆黑市交易:一小时童年体验标价百万
  • 智能问数落地实录:语义建模项目90天交付,宽表建模为何要180天?
  • 2026年讯灵AI渠道经理联系地址大盘点,哪家服务好 - 工业品牌热点