Redis是一种高性能的键值型数据库,它支持五种基本的数据类型:字符串、列表、集合、散列和有序集合。这些数据类型不仅提供了丰富的操作接口,而且也有各自的底层实现原理,了解这些原理有助于我们更好地使用和优化Redis。
字符串
字符串是Redis最简单也最常用的数据类型,它可以存储任何形式的数据,比如文本、数字、二进制等。字符串的最大长度是512MB。
字符串的底层实现是一个名为sdshdr的结构体,它包含了以下几个字段:
1.len:记录了字符串的长度
2.free:记录了字符串未使用的空间
3.buf:记录了字符串的内容
Redis会根据字符串的长度动态地分配内存空间,当字符串增长或缩短时,会相应地调整len和free的值,并保留一定的空余空间,以避免频繁地分配和释放内存。这种策略可以提高内存利用率和性能。
列表是Redis中用来存储多个有序元素的数据类型,它支持在两端进行插入和删除操作,也支持按索引或范围获取元素。列表中可以存储任意类型的元素,但通常都是字符串。
列表的底层实现有两种方式:压缩列表和双向链表。Redis会根据列表中元素的数量和大小自动地选择合适的方式。
压缩列表是一种紧凑的顺序存储结构,它由一个表头和多个节点组成。表头记录了压缩列表的总字节数、尾节点的偏移量和节点的数量。每个节点记录了前一个节点的长度、当前节点的长度、当前节点是否为字符串或整数、当前节点的内容。压缩列表适合存储少量且小型的元素,因为它可以节省内存空间,并且可以快速地遍历。
双向链表是一种常见的链式存储结构,它由多个节点组成。每个节点包含了一个指向前一个节点的指针、一个指向后一个节点的指针、一个指向当前元素的指针。双向链表适合存储大量且大型的元素,因为它可以灵活地分配内存空间,并且可以快速地在两端进行插入和删除操作。
集合是Redis中用来存储多个无序且不重复元素的数据类型,它支持添加、删除、判断是否存在等操作,也支持求交集、并集、差集等操作。集合中只能存储字符串类型的元素。
集合的底层实现有两种方式:整数集合和哈希表。Redis会根据集合中元素的数量和类型自动地选择合适的方式。
整数集合是一种紧凑的顺序存储结构,它由一个表头和多个整数值组成。表头记录了整数集合所使用的编码方式(int16、int32或int64)和元素的数量。整数值按照从小到大的顺序存储在连续的内存空间中。整数集合适合存储少量且都是整数的元素,因为它可以节省内存空间,并且可以快速地进行二分查找。
哈希表是一种常见的散列存储结构,它由一个数组和多个链表组成。