Redis是Remote Dictionary Service的简称,也是远程字典服务
Redis是内存数据库,KV数据库,数据结构数据库
Redis的数据结构分为五种:
string,hash,list,set,zset
下图为redis中几种数据结构示意图:
redis整体存储结构如下图:
redis中的value底层是自适应的数据结构,如下图:
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
集合:用来存储唯一性字段,不要求有序