Redis原理二之数据类型String

Redis原理二之数据类型String

    • Redis对象类型
    • string的存储方式

Redis对象类型

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、 encoding属性和ptr属性:
Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的健(键对象),另一个对象用作键值对的值(值对象)。

/*
* Redis 对象 
*/
typedef struct redisObject {
      
	// 类型
	unsigned type:4; 
	// 对齐位
	unsigned notused:2; 
	// 编码方式
	unsigned encoding:4;
	// LRU 时间(相对于 server.lruclock)
	unsigned lru:22; 
	// 引用计数
	int refcount; 
	// 指向对象的值
	void *ptr; 
} robj;

Redis原理二之数据类型String_第1张图片

string的存储方式

我们都知道,Redis是由C语言编写的。在C语言中,字符串标准形式是以空字符\0作为结束符的,但是Redis里面的字符串却没有直接沿用C语言的字符串。主要是因为C语言中获取字符串长度可以调用strlen这个标准函数,这个函数的时间复杂度是O(N),由于Redis是单线程的,承受不了这个时间复杂度。

对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。
Redis原理二之数据类型String_第2张图片

  • int
    当存储的字符串全是数字时,此时使用int方式来存储。如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成1ong),并将字符串对象的编码设置为int。
127.0.0.1:6379> set myint 12345
OK
127.0.0.1:6379> type myint
string
127.0.0.1:6379> object encoding myint
"int"
127.0.0.1:6379> 

Redis原理二之数据类型String_第3张图片

  • embstr
    当存储的字符串长度小于44个字符时,此时使用embstr方式来存储;如果字符串对象保存的是一个字符串值,并且这个字符申值的长度小于等于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为embstr。
127.0.0.1:6379> set myembstr "abcdefg"
OK
127.0.0.1:6379> type myembstr
string
127.0.0.1:6379> object encoding myembstr
"embstr"

在这里插入图片描述

  • raw
    如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于等于44字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw。对于embstr和raw这两种encoding类型,其存储方式还不太一样。对于embstr类型,它将RedisObject对象头和SDS对象在内存中地址是连在一起的,但对于raw类型,二者在内存地址不是连续的。
127.0.0.1:6379> set myraw "abcdefghiljlmnopqrstuvwxyzabcdefghijklmnopqrs"
OK
127.0.0.1:6379> object encoding myraw
"raw"
127.0.0.1:6379> type myraw
string

Redis原理二之数据类型String_第4张图片

你可能感兴趣的:(redis)