数据库
首页 > 数据库> > redis学习笔记

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