目录
Redis说明
被叫作非关系型数据库,通过“键”来查询“值”,被用作内存数据库,支持将数据存储在硬盘;
键数据类型:
字符串;
值数据类型:
字符串、列表、字典、集合、有序集合;
Redis底层数据结构
-
压缩列表:
- 比数组节省内存,数组固定单元;支持多种类型、连续内存、读取效率高;
-
有序数组
-
散列表
- 散列函数生成的值要尽可能随机并且均匀分布;
-
跳表
-
双向链表:
- listnode包含前、后指针;list包含首、尾指针和长度;
// 以下是C语言代码,因为Redis是用C语言实现的。
typedef struct listnode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
typedef struct list {
listNode *head;
listNode *tail;
unsigned long len;
// ....省略其他定义
} list;
Redis “值”的数据类型
-
字符串:字符串
-
列表(list):压缩列表(ziplist)、双向循环链表
- 压缩列表2个必要条件:
- 列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;
- 列表中数据个数少于 512 个。
- 压缩列表2个必要条件:
-
字典(hash):压缩列表、散列表
- 压缩列表2个必要条件:
- 字典中保存的键和值的大小都要小于 64 字节;
- 字典中键值对的个数要小于 512 个。
- 散列表哈希函数:MurmurHash2,速度快、随机性;
- 哈希冲突:链表法;
- 动态扩容、缩容:装载因子>1扩容为2倍左右;当装载因子小于 0.1缩容2倍左右;
- 扩容、缩容:散列表渐进式、分批扩容,避免大量数据一次性搬移导致的服务停顿;
- 压缩列表2个必要条件:
-
集合(set):有序数组、基于散列表;
- 有序数组的2个必要条件:
- 存储的数据都是整数;
- 存储的数据元素个数不超过 512 个。
- 有序数组的2个必要条件:
-
有序集合(sortedset):压缩列表、跳表
- 数据会附带得分,可按照得分值、得分区间获取数据
- 压缩列表2个必要条件:
- 所有数据的大小都要小于 64 字节;
- 元素个数要小于 128 个。
-
持久化
- 第一种:是清除原有的存储结构,只将数据存储到磁盘中。还原数据到内存需要重新数据组织数据结构。Redis 采用的就是这种持久化思路。
- 第二种:方式是保留原来的存储格式,将数据按照原有的格式存储在磁盘中