「Redis数据结构」字符串对象String
创始人
2024-04-18 11:42:36
0

「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"

image-20221205151558746

// 只对长度小于或等于 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

image-20221205151815596

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

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

image-20221205202318529

  • 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"

image-20221205152102178

三、小结

image-20221205152705074

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

四、参考

Redis 字符串对象

《Redis 设计与实现》

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...