Redis常用数据类型对应的数据结构
Redis数据库
- Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),也被叫作非关系型数据库。
- 常用的数据类型:
- 字符串、列表、字典、集合、有序集合。
列表(list)
- 支持存储一组数据。两种实现方法:
- 压缩列表(ziplist)
- 双向循环链表
- 压缩列表
- 数据量比较小的时候采用压缩列表的方式实现:
- 列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;
- 列表中数据个数少于 512 个。
- 非基础数据结构,类似数组,通过一片连续的内存空间,来存储数据,与数组不同的是,它允许存储的数据大小不同:
- 数据量比较小的时候采用压缩列表的方式实现:
- 双向循环链表
- 数据量比较大的时候使用(不满足压缩列表的两个条件时)
- redis的实现方式
- 额外定义一个 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;
字典(hash)
- 用来存储一组数据对。每个数据对又包含键值两部分。
- 两种实现方式:
- 刚刚讲到的压缩列表
- 散列表
- 散列表:
- 散列函数:MurmurHash2这种运行速度快、随机性好的哈希算法作为哈希函数。
- 哈希冲突: 使用链表法来解决。
- 动态扩容、缩容:
- 当装载因子大于 1 的时候,Redis 会触发扩容,将散列表扩大为原来大小的 2 倍左右。
- 当装载因子小于 0.1 的时候,Redis 就会触发缩容,缩小为字典中数据个数的大约 2 倍大小。
- 大量的数据搬移耗时问题:Redis 使用渐进式扩容缩容策略,将数据的搬移分批进行,避免了大量数据一次性搬移导致的服务停顿:
-
-
- 当装载因子触达阈值之后,只申请新空间,但并不将老的数据搬移到新散列表中。
当有新数据要插入时,将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。
-
- 每次插入一个数据到散列表,都重复上面的过程。经过多次插入操作之后,老的散列表中的数据就一点一点全部搬移到新散列表中了。
-
- 这样没有了集中的一次性数据搬移,插入操作就都变得很快了。
-
原文地址:https://www.cnblogs.com/wod-Y/p/12202315.html
时间: 2024-09-29 00:27:56