当前位置: 首页 > 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.lryc.cn/news/610919.html

相关文章:

  • 【Linux】特效爆满的Vim的配置方法 and make/Makefile原理
  • 【01】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法
  • Occ3D: A Large-Scale 3D Occupancy Prediction Benchmark for Autonomous Driving
  • Python爬虫实战:研究weiboSpider技术,构建新浪微博数据采集系统
  • 多层Model更新多层ListView
  • RHCA05--进程管理与文件系统管理
  • 数据结构(01)—— 数据结构的基本概念
  • 应用科普 | 漫谈6G通信的未来
  • 【技术教程】如何将 ONLYOFFICE 文档连接到 Confluence
  • 坚鹏:AI智能体软件是知行学成为AI智能体创新应用引领者的抓手
  • Fiddler 中文版实战指南,如何构建高效的 API 调试工作流?
  • Z20K118库中寄存器及其库函数封装-ADC库
  • Linux操作系统从入门到实战(十三)版本控制器Git基础概念讲解
  • 自抗扰ADCR--跟踪微分器的作用
  • sqli-labs通关笔记-第32关 GET宽字符注入(单引号闭合 手工注入+脚本注入两种方法)
  • Android 中几种常用布局的优缺点
  • 如何在nuxt项目中使用scss
  • 自动驾驶中的传感器技术24——Camera(15)
  • AI智能体的安全困境:防护机制与伦理平衡的艺术
  • PostgreSQL bytea 类型的大小限制
  • fastgpt本地运行起来的 服务配置
  • SELinux加固Linux安全
  • 基于Django的计算机资源爬虫及可视化系统的设计与实现
  • 开源密码恢复实用程序 Hashcat 7.0.0 发布
  • 最新安卓原生对接苹果cms App后端+app(最新优化版)
  • QML开发:QML的第一个程序
  • echarts在前后端分离项目中的实践与应用
  • C# --- 本地缓存失效形成缓存击穿触发限流
  • RHCA04--系统模块管理与资源限制
  • 武汉火影数字:VR大空间在文旅产业的创新应用