redis学习笔记
作者:互联网
最近在学习redis,用问答方式检查下自己的学习情况
一、简单的介绍下redis?
redis是key-value型的缓存数据库,key为字符串类型,value支持五种类型,分别是字符串,列表,哈希表,集合,有序集合。
二、redis数据类型底层是如何实现的?
redis中最基础的类型是字符串,其他复合类型的元素都是字符串。
redis中key是字符串,底层使用SDS存储
value是数据类型,底层使用redisObject存储
redis数据类型底层使用redisObject实现。
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; void *ptr; } robj;
redisObject包含以下字段
type 占4个比特,表示类型,值为支持的五种类型,最多支持2^4=16种类型
encoding 占4个比特,表示编码方式。每个类型都至少有两种编码方式,最多也是支持16种编码方式。
lru 64位系统占24比特,表示程序最近访问该对象的时间。
refCount 占4个字节,表示引用计数,redis默认使用0-9999作为共享对象(数据可以通过OBJ_SHARED_INTEGERS调整),每当有共享对象被引用,引用计数加一,反之减一。当引用计数为零会被回收。
*ptr 占8个字节,表示实际存储对象的指针
redisObject对象大小为
4bit+4bit+24bit+4Byte+8Byte=16Byte
字符串底层使用SDS(simple dynamic string)简单动态字符串实现
struct sdshdr { int len; int free; char buf[]; };
SDS包含三个字段,分别是len,free,[]buf。
len int类型,占4个字节。表示已使用字符串长度
free int类型,占4个字节,表示未使用长度,len+free+1等于字符串总长度
buf[]表示字节数组,存储具体的字符串以\0结尾
SDS占用空间为4+4+字符串长度+1(\0)=9Byte+字符串长度
其实如果学过golang,会发现SDS跟[]byte是类似的,len相同都表示已使用长度,[]byte中cap-len就等于free
使用sds好处在于
获取字符串长度为o(1)
存储二进制文件,不以\0标记字符串结束,而是用len
三、简单描述下redis五种类型编码方式和转换关系(3.0以下)
编码转换在Redis写入数据时完成,且转换过程不可逆,只能从小内存编码向大内存编码转换。
1、字符串,长度不能超过512MB
1、int:8个字节的长整型,字符串值为整型时,用long整型表示
2、embstr:长度小于等于39字节的字符串。embstr和raw都使用redisObject和sds保存数据,区别在于embstr使用只分配一次内存空间,redisObject和sds一起分配,是连续的。
raw需要分配两次。embstr好处在于少分配一次空间,并且数据连在一起,寻找方便。坏处是字符串增加需要重新分配内存。所以embstr实现为只读。
3、raw:长度大于39字节的字符串。
embstr长度为39的原因是
39=64(jemalloc分配)-16(redisObject)+9(SDS)
编码转换,只能由embstr转换为raw。如果修改embstr对象,修改后的对象为raw,无论长度是否达到39字节。
2、列表,可以存储2^32-1个有序字符串。支持两端插入和弹出,并且可以获取指定位置元素,可以充当数组、列表、栈等。
1、压缩列表
2、双向链表
元素个数小于512个,并且所有字符串对象都不足64字节菜使用压缩列表。只能由压缩列表转化为双端链表
3、哈希表
1、压缩列表
2、hashTable
4、集合 无序,不能重复
1、整数集合
typedef struct intset{ uint32_t encoding; uint32_t length; int8_t contents[]; } intset;
2、hashTable
集合中元素数量小于512个;集合中所有元素都是整数值,才使用整数集合,否则使用哈希表。只能由整数集合转换为哈希表
5、有序集合 有序 不能重复
1、压缩列表
2、跳跃表
有序集合中元素数量小于128个;有序集合中所有成员长度都不足64字节,才使用压缩列表,否则使用跳跃表。只能由压缩列表转化为跳跃表。
四、redis中如何实现持久化存储
五、redis的主从复制原理
六、redis的哨兵机制介绍
七、redis集群介绍
标签:字节,redisObject,redis,笔记,embstr,学习,字符串,列表 来源: https://www.cnblogs.com/lgh344902118/p/14906252.html