「Redis数据结构」字符串对象(String)
「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
编码则通过调用一次内存分配函数来分配一块连续的空间, 空间中依次包含 redisObject
和 sdshdr
两个结构。
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)相关推荐
- 「Redis数据结构」集合对象(Set)
「Redis数据结构」集合对象(Set) 文章目录 「Redis数据结构」集合对象(Set) 一.概述 二.结构 三.编码转换 四.小结 一.概述 Set是Redis中的单列集合,其特点为不保证有序性 ...
- 「Redis数据结构」哈希对象(Hash)
「Redis数据结构」哈希对象(Hash) 文章目录 「Redis数据结构」哈希对象(Hash) 一.概述 二.编码 ZipList HashTable 三.编码转换 一.概述 Redis中hash对 ...
- 「Redis数据结构」压缩列表(ZipList)
「Redis数据结构」压缩列表(ZipList) 文章目录 「Redis数据结构」压缩列表(ZipList) 一.概述 二.结构 三.连锁更新问题 四.压缩列表的缺陷 五.小结 参考 ZipList ...
- 「Redis数据结构」哈希表(Dict)
「Redis数据结构」哈希表(Dict) 文章目录 「Redis数据结构」哈希表(Dict) @[toc] 一.概述 二.结构 三.哈希冲突 四.链式哈希 五.rehash 六. 渐进式 rehash ...
- 深入剖析Redis系列(五) - Redis数据结构之字符串
前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...
- redis 系列10 字符串对象
redis 系列10 字符串对象 原文:redis 系列10 字符串对象 一. 字符串对象编码 Redis中字符串可以存储3种类型,分别是字节串(byte string).整数.浮点数.在上章节中讲到 ...
- startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...
引言 本文是对<redis设计与实现(第二版)>中数据结构与对象相关内容的整理与说明.本篇文章只对对象结构,1种对象--字符串对象.以及字符串对象所对应的两种编码--raw和embstr, ...
- Java中字符串对象String、StringBuffer、StringBuilder的比较
原文地址:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉, ...
- 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )
文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...
最新文章
- 【Python】KNN简单的判别预测
- ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)
- 考研结束后去政审时穿的鞋子
- 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
- hadoop环境搭建笔记
- java 基本类型 引用类型_Java中的基本类型和引用类型变量的区别
- MFC小笔记:滑动条与编辑框
- 一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方
- jquery中常见的标题内容之间的切换
- C#高级编程----反射的小结
- 【智能制造】智能制造能力成熟度评测三部曲
- 奥哲徐平俊:乘风、冒险与未来
- 量子化学计算机理,量子化学(理论化学的分支学科)_百度百科
- 远程连接mysql失败异常,未配置权限,skip-name-resolve以及防火墙
- meri oracle view_Oracle Siebel CRM
- 【游戏客户端】制作节奏大师Like音游(全)
- 家用路由器与企业路由器有什么区别
- Mountainous landscape
- 微信小程序canvas绘制图片真机不显示问题
- 【学习日志】2023.04.24 C++ 调整黑点、白点和中值以增加、平衡或降低对比度