redis Object是什么?
Redis是key-value存储,key和value在Redis中都被抽象为对象,key只能是
String对象,而Value支持丰富的对象种类,包括String、List、Set、
Hash、Sorted Set、Stream等。
String
String就是字符串,它是Redis中最基本的数据对象,最大为512MB,我们
可以通过配置项proto-max-bulk-len来修改它,一般来说是不用主动修改
的。
常用操作
常用操作聚焦于创建、查询、更新和删除。
创建,即产生一个字符串对象数据,可以用SET、SETNX。
查询操作可以用GET,如果想一次获取多个,可以用MGET。
而更新的话,其实也是用SET来更新的。
删除就是针对String对象本身的销毁,用DEL命令。
底层实现
三种编码方式
String看起来简单,但实际有三种编码方式,如下图所示:
INT:当内容可以被解释为一个64位有符号整数的时候使用
EMBSTR:当长度较短时使用,会进行特殊编码以节省存储空间.
Raw:原生方式,直接将字符串以字节数组的形式存储,适用于较长的字符串
结构组成
EMBSTR和RAW都是由redisObject和SDS两个结构组成,它们的老异在
于,EMBSTR下redisObject和SDS是连续的内存,RAW编码下redisObject
和SDS的内存是分开的。
EMBSTR
优点
是redisObject和SDS两个结构可以一次性分配空间,
缺点
在于如果重新分配空间,整体都需要再分配,所以EMBSTR设计为只读,任何写
操作之后EMBSTR都会变成RAW,理念是发生过修改的字符串通常会认为是
易变的。
EMBSTR内存:
RAW内存
内存格式转换
INT->RAW:当存的内容不再是整数,或者大小超过了long的时候
EMBSTR->RAW:任何写操作之后EMBSTR都会变成RAW,原因前面有解
释。
SDS格式
其中有两个关键字段,一个是len,表示使用了多少;一个是alloc,表示一
共分配了多少内存。这两个字段的差值(alloc-len)就是预留望空间的大小。