「Redis数据结构」字符串对象String

文章目录

  • 「Redis数据结构」字符串对象String
    • 一、概述
    • 二、编码分类
      • int
      • embstr
      • row
    • 三、小结
    • 四、参考

一、概述

字符串数据类型是Redis里最常用的类型,它的键和值都是字符串,使用起来非常的方便。虽然字符串数据类型的值都统称为字符串了,但是在实际存储时会根据值的不同自动选择合适的编码。字符串对象的编码一共有三种:int、raw、embstr


二、编码分类

int

如果以字符串对象保存的是一个整数值,且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在ptr属性里面(void* 转为long*),并将字符串对象的编码设置为REDIS_ENCODING_INT

redis> SET number 10086
OKredis> OBJECT ENCODING number
"int"

// 只对长度小于或等于 21 字节,并且可以被解释为整数的字符串进行编码
if (len <= 21 && string2l(s,len,&value)) {if (server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS) {decrRefCount(o);incrRefCount(shared.integers[value]);return shared.integers[value];  // 这里value < REDIS_SHARED_INTEGERS,直接使用共享的字符串对象。} else {  if (o->encoding == REDIS_ENCODING_RAW) sdsfree(o->ptr);o->encoding = REDIS_ENCODING_INT;o->ptr = (void*)value;return o;}
}

embstr

如果字符串对象保存的是一个字符串值,并且这个字符串值长度小于等于39字节(redis3.2前)。那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值, 并将对象的编码设置为 embstr

redis> SET msg "hello"
OKredis> OBJECT ENCODING msg
"embstr"

embstr 编码专门用于保存短字符串的一种优化编码方式, 这种编码和 raw 编码一样, 都使用 redisObject 结构和 sdshdr 结构来表示字符串对象, 但 raw 编码会调用两次内存分配函数来分别创建 redisObject 结构和 sdshdr 结构, 而 embstr 编码则通过调用一次内存分配函数来分配一块连续的空间, 空间中依次包含 redisObjectsdshdr 两个结构。

  • embstr 编码将创建字符串对象所需的内存分配次数raw 编码的两次降低为一次
  • 释放 embstr 编码的字符串对象只需要调用一次内存释放函数, 而释放 raw 编码的字符串对象需要调用两次内存释放函数。
  • 因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面, 所以这种编码的字符串对象比起 raw 编码的字符串对象能够更好地利用缓存带来的优势。

row

如果字符串对象保存的是一个字符串值,并且这个字符串值长度大于39(redis3.2前)字节。那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值, 并将对象的编码设置为 raw

redis> SET story "Long, long, long ago there lived a king ..."
OKredis> STRLEN story
(integer) 43redis> OBJECT ENCODING story
"raw"

三、小结

  • embstr与raw都使用redisObject和sds保存数据
  • embstr只分配一次内存空间,因此redisObject和sds是连续的
  • raw需要分配两次内存空间,分别为redisObject和sds分配空间,不连续。
  • embstr好处:创建/删除时少分配/释放一次空间,对象的所有数据连续,查找方便
  • embstr坏处:当需要重新分配内存时,整个redisObject和sds都要重新分配空间,因此redis中的embstr实现为只读。

四、参考

Redis 字符串对象

《Redis 设计与实现》

「Redis数据结构」字符串对象(String)相关推荐

  1. 「Redis数据结构」集合对象(Set)

    「Redis数据结构」集合对象(Set) 文章目录 「Redis数据结构」集合对象(Set) 一.概述 二.结构 三.编码转换 四.小结 一.概述 Set是Redis中的单列集合,其特点为不保证有序性 ...

  2. 「Redis数据结构」哈希对象(Hash)

    「Redis数据结构」哈希对象(Hash) 文章目录 「Redis数据结构」哈希对象(Hash) 一.概述 二.编码 ZipList HashTable 三.编码转换 一.概述 Redis中hash对 ...

  3. 「Redis数据结构」压缩列表(ZipList)

    「Redis数据结构」压缩列表(ZipList) 文章目录 「Redis数据结构」压缩列表(ZipList) 一.概述 二.结构 三.连锁更新问题 四.压缩列表的缺陷 五.小结 参考 ZipList ...

  4. 「Redis数据结构」哈希表(Dict)

    「Redis数据结构」哈希表(Dict) 文章目录 「Redis数据结构」哈希表(Dict) @[toc] 一.概述 二.结构 三.哈希冲突 四.链式哈希 五.rehash 六. 渐进式 rehash ...

  5. 深入剖析Redis系列(五) - Redis数据结构之字符串

    前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...

  6. redis 系列10 字符串对象

    redis 系列10 字符串对象 原文:redis 系列10 字符串对象 一. 字符串对象编码 Redis中字符串可以存储3种类型,分别是字节串(byte string).整数.浮点数.在上章节中讲到 ...

  7. startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...

    引言 本文是对<redis设计与实现(第二版)>中数据结构与对象相关内容的整理与说明.本篇文章只对对象结构,1种对象--字符串对象.以及字符串对象所对应的两种编码--raw和embstr, ...

  8. Java中字符串对象String、StringBuffer、StringBuilder的比较

    原文地址:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉, ...

  9. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

    文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...

最新文章

  1. 【Python】KNN简单的判别预测
  2. ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)
  3. 考研结束后去政审时穿的鞋子
  4. 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
  5. hadoop环境搭建笔记
  6. java 基本类型 引用类型_Java中的基本类型和引用类型变量的区别
  7. MFC小笔记:滑动条与编辑框
  8. 一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方
  9. jquery中常见的标题内容之间的切换
  10. C#高级编程----反射的小结
  11. 【智能制造】智能制造能力成熟度评测三部曲
  12. 奥哲徐平俊:乘风、冒险与未来
  13. 量子化学计算机理,量子化学(理论化学的分支学科)_百度百科
  14. 远程连接mysql失败异常,未配置权限,skip-name-resolve以及防火墙
  15. meri oracle view_Oracle Siebel CRM
  16. 【游戏客户端】制作节奏大师Like音游(全)
  17. 家用路由器与企业路由器有什么区别
  18. Mountainous landscape
  19. 微信小程序canvas绘制图片真机不显示问题
  20. 【学习日志】2023.04.24 C++ 调整黑点、白点和中值以增加、平衡或降低对比度

热门文章

  1. 二维码生成工具:zxing
  2. 【C++】敲笨种(PTA)
  3. 【模型加速】PointPillars模型TensorRT加速实验(7)
  4. DataGrid控件介绍
  5. Netty源码分析(六)—Future和Promis分析
  6. MTCNN 人脸检测
  7. 雷军晒出小米手环4真机
  8. Compose 动画艺术探索之可见性动画
  9. 在本机搭建自己的ftp服务器--最简单的方法(详细教程)
  10. 用python循环帮皇帝选妃