ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis 原理 - String [打印本页]

作者: 八卦阵    时间: 2022-8-20 09:31
标题: Redis 原理 - String
String 数据结构

首先我来看下, Redis 中 String 的数据结构:
我们称之为 SDS (Simple Dynamic String) 简单动态字符串
  1. struct sdshdr {
  2.     //记录buf数组中已经使用的字节数(等价于字符串的长度strlen)
  3.     int len;
  4.     //记录buf数组中未使用的字节数(用于动态扩容)
  5.     int free;
  6.     //字节数组,用于保存字符串
  7.     char buf[];
  8. }
复制代码
对比C语言字符串:
RedisObject 数据结构

在redis中存储的每个对象都表示为一个redisObject,它记录了这个对象的数据类型,编码方式,指向实际内容的指针等
  1. typedef struct redisObject {
  2.     // 类型 4bits (String,Hash,Set,List等)
  3.     unsigned type:4;
  4.     // 编码方式 4bits (int, embstr, raw 等)
  5.     unsigned encoding:4;
  6.     // LRU 时间(相对于 server.lruclock) 24bits
  7.     unsigned lru:22;
  8.     // 引用计数 Redis里面的数据可以通过引用计数进行共享 32bits
  9.     int refcount;
  10.     // 指向实际存储的对象 (比如:指向一个SDS字符串对象) 64bits
  11.     void *ptr;
  12. } robj;
复制代码
String的三种编码方式

int编码不必多说,为了数值计算方便
为什么要分为 embstr 和 raw 呢?

首先来张图,直观感受下,这2种存储方式的内存布局:

这么做的原因当然是为了性能考虑,Redis考虑到多数字符串,可能都不会很长, 这样使用 embstr 只需分配一次内存(也很小),而且还是连续的存储,性能很高,也有利于减少内存碎片
String编码演示

演示 int 编码:
  1. 127.0.0.1:6379> set age 100
  2. OK
  3. 127.0.0.1:6379> type age
  4. string
  5. 127.0.0.1:6379> object encoding age
  6. "int"
复制代码
演示 embstr 编码:
  1. 127.0.0.1:6379> SET name tom
  2. OK
  3. 127.0.0.1:6379> TYPE name
  4. string
  5. 127.0.0.1:6379> OBJECT ENCODING name
  6. "embstr"
复制代码
演示 raw 编码:
  1. 127.0.0.1:6379> set name sdsdnjjkasjdnnjasjdnasldklaksdkkansndmasdulasndnkadashdahsdhkpasduasdybasbdvcfaffafkgsaas
  2. OK
  3. 127.0.0.1:6379> type name
  4. string
  5. 127.0.0.1:6379> object encoding name
  6. "raw"
复制代码
String的常用命令


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4