Redis基础数据结构详解

Redis是Remote Dictionary Service的简称,也是远程字典服务
Redis是内存数据库,KV数据库,数据结构数据库

Redis的数据结构分为五种:
string,hash,list,set,zset
下图为redis中几种数据结构示意图:
在这里插入图片描述
redis整体存储结构如下图:
在这里插入图片描述
redis中的value底层是自适应的数据结构,如下图:
redis内存分配器认为,长度小于等于64的字符串为小字符串,大于64的字符串为大字符串
string数据结构
字符数组,该字符串为动态字符串,字符串长度小于 1M时,加倍扩容;超过1M的字符串每次只扩容1M,字符串最大长度为512M
注意:redis字符串为二进制安全字符串,可以存储图片,二进制协议等二进制数据.
该数据结构的基本操作命令如下图:
在这里插入图片描述
存储结构
字符串长度小于等于20且能转换成整数,则用int存储
字符串长度小于等于44则使用embstr存储
字符串长度大于44,则使用raw存储

下面探究44长度的由来
由于redis内存分配器认为大于64字节的字符串为大字符串,则为小字符串预留的最大空间(除去必须占用的字节后)为44字节:

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;
} robj;
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44
robj *createStringObject(const char *ptr, size_t len) {
    if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT)
        return createEmbeddedStringObject(ptr,len);
    else
        return createRawStringObject(ptr,len);
}

redisObject要占用16个字节,sdshdr8要占用4个字节,char buf[]要预留\0,所以留给小字符串的长度就是44
redis,string的应用
1.对象存储:
在这里插入图片描述
2.累加器
在这里插入图片描述
3.位运算
在这里插入图片描述
list:双端链表实现,列表首位操作(增加和删除)的时间复杂度为O(1),查找中间元素的时间复杂度为O(n)
基础操作命令如下:
在这里插入图片描述
队列的应用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hash:散列表,在很多高级语言中有这种数据结构,c++的unordered_map通过key快速索引value
基础命令操作:
在这里插入图片描述
编码转换:当hash对象可以同时满足以下两个条件时,hash对象使用ziplist编码
1.hash对象所保存的所有键值对的键和值的长度都小于64
2.hash对象保存的键值对数量小于512个;不能满足这两个条件的使用hashtable编码

应用:
在这里插入图片描述
购物车
在这里插入图片描述
在这里插入图片描述
set
集合:用来存储唯一性字段,不要求有序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值