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

Redis存储string里面embstr和raw格式区别

文章目录

    • Redis 字符串存储揭秘:embstr 与 raw 格式深度解析
      • 核心区别:内存分配与效率
      • 编码转换的临界点
      • 如何查看字符串的编码?
      • 总结

Redis 字符串存储揭秘:embstr 与 raw 格式深度解析

在 Redis 中,String(字符串)是最基础也是最常用的数据类型。然而,为了极致地优化内存使用和执行效率,Redis 在内部并不会用同一种方式来存储所有的字符串。其中,embstrraw 是两种主要的编码格式,它们的选择取决于字符串的长度,并直接影响着内存分配和操作效率。

简而言之,embstr 是一种专门用于存储短字符串的优化格式,而 raw 则是用于存储长字符串的通用格式。

核心区别:内存分配与效率

embstrraw 格式最根本的区别在于它们的内存分配策略。

  • raw 格式:两次内存分配
    当一个字符串使用 raw 格式存储时,Redis 会进行两次内存分配。一次是为 Redis 的对象头(redisObject)分配内存,另一次是为字符串的实际内容(sdshdr,即简单动态字符串)分配内存。redisObject 中的指针会指向存储实际字符串内容的 sdshdr。(对sdshdr有疑问的可以参考末尾文章链接!)

  • embstr 格式:一次内存分配
    为了优化短字符串的存储,embstr 格式应运而生。它通过一次内存分配,将 redisObjectsdshdr 存储在一块连续的内存空间中。这种方式不仅减少了内存分配的开销,更重要的是,由于数据在内存中的连续性,能够更好地利用 CPU 缓存,从而提升了访问效率。

特性embstrraw
内存分配一次(redisObjectsdshdr 连续存储)两次(redisObjectsdshdr 分开存储)
内存碎片更少可能产生更多碎片
访问效率更高(更好的 CPU 缓存局部性)相对较低
适用场景短字符串长字符串
修改操作只读,任何修改都会先转换为 raw 格式可直接修改

编码转换的临界点

Redis 会根据字符串的长度自动选择使用 embstr 还是 raw 编码。这个长度阈值在不同的 Redis 版本中有所变化:

  • Redis 3.2 及以后版本: 当字符串长度小于等于 44 字节时,使用 embstr 编码。
  • Redis 3.2 以前版本: 这个阈值是 39 字节

需要特别注意的是,embstr 编码是只读的。一旦你对一个使用 embstr 编码的字符串进行任何修改操作(例如 APPEND),Redis 会先将其转换为 raw 编码,然后再执行修改。即使修改后的字符串长度仍然小于44字节,它也会保持为 raw 编码。

如何查看字符串的编码?

你可以通过 OBJECT ENCODING 命令来查看一个键所对应的字符串的内部编码。

示例:

redis> SET short_str "hello world"
OK
redis> OBJECT ENCODING short_str
"embstr"redis> SET long_str "This is a longer string that will exceed the embstr length limit."
OK
redis> OBJECT ENCODING long_str
"raw"redis> APPEND short_str " again"
(integer) 17
redis> OBJECT ENCODING short_str
"raw"

总结

embstrraw 格式是 Redis 在字符串存储上进行精细化优化的体现。通过为短字符串设计专门的 embstr 格式,Redis 有效地减少了内存分配开销和内存碎片,并提升了数据访问的效率。了解这两种内部编码的区别,有助于我们更深入地理解 Redis 的高性能原理,并在实践中更高效地利用内存。对于开发者而言,虽然这种转换是自动且透明的,但理解其背后的机制,对于进行性能分析和故障排查大有裨益。

下一篇:
Redis中什么是SDSHDR

http://www.dtcms.com/a/315798.html

相关文章:

  • 新浪新闻获取
  • Redis里面什么是sdshdr,可以详细介绍一下吗?
  • Erdős–Rényi (ER) 模型
  • 克莱姆法则(Cramer‘s Rule)求解两条直线交点坐标的步骤
  • Redis 常用数据类型 (下)
  • AR眼镜成本挑战与突破路径:技术创新引领产业变革
  • Opencv: cv::Mat支持的类型汇总
  • 当送餐机器人学会“思考“:Deepoc如何赋予机器人具身智能
  • AI-03a1.Python深度学习-Tensorflow和Keras入门
  • eBay退货管理深度解析:筑牢售后防线,驱动账号长效稳健发展
  • AutoSar AP LT规范中 建模消息和非建模消息都可以使用LogInfo() API吗?
  • visual studio 历史版本安装
  • FLAN-T5:大规模指令微调的统一语言模型框架
  • 为什么要选择时序数据库IoTDB?
  • Redis实现可重入锁
  • “Why“比“How“更重要:层叠样式表CSS
  • 《C++初阶之STL》【模板参数 + 模板特化 + 分离编译】
  • @【JCIDS】【需求论证】联合能力集成与开发系统知识图谱
  • 机器学习通关秘籍|Day 03:决策树、随机森林与线性回归
  • 【工程化】tree-shaking 的作用以及配置
  • Android Framework代码屏蔽未接来电振动及声音通知
  • DHTMLX重磅发布React Scheduler组件,赋能日程管理开发!
  • SELinux加固Linux安全
  • 将普通用户添加到 Docker 用户组
  • 第十七天:原码、反码、补码与位运算
  • RAFT:让语言模型更聪明地用文档答题
  • Java从入门到精通 - 集合框架(一)
  • 最长连续序列(每天刷力扣hot100系列)
  • FastDeploy2.0:报qwen2.embed_tokens.weight
  • 2.4 组件通信