Redis使用哈希表(hash table)作为核心数据结构来存储键值对。对于字符串类型,直接存储值;对于哈希、列表、集合等,使用SDS(简单动态字符串)和ziplist、skiplist、intset等紧凑数据结构实现内存高效存储。持久化机制通过RDB快照(fork子进程生成内存快照)和AOF日志(追加写操作命令)两种方式实现,结合内存映射文件mmap优化I/O。
来源1
Redis 的数据存储主要基于哈希表(hash table)。Redis 中的所有数据都以键值对的形式存在,键是一个字符串(key),值可以是 Redis 定义的多种数据类型。Redis 的底层数据结构是字典(dict),字典是抽象数据结构,其底层实现是一个包含多个哈希表(hash table)的哈希表组。
来源2
Redis 是内存数据库,它将所有数据存储在内存中,每个数据都以键值对的形式存储。Redis 支持多种数据类型,包括 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合)、Bitmap(位图)、HyperLogLog 和 Geo 空间索引等。
来源3
Redis 的持久化有两种方式:RDB(Redis DataBase)和 AOF(Append Only File)。RDB 是将数据集以快照的形式保存到磁盘上,而 AOF 是对每次写操作进行记录。Redis 可以同时启用 RDB 和 AOF 两种持久化机制。
来源4
Redis 使用 SDS(Simple Dynamic Strings)来存储字符串数据。SDS 比传统的 C 字符串更高效,因为它记录了字符串的长度,并且预分配空间来减少内存分配次数。对于小集合,使用 ziplist 紧凑列表;对于有序集合,使用 skiplist 跳表和哈希表结合。
来源5
Redis 的键空间是一个巨大的哈希表,内部有一个哈希表数组,每个数组项是一个哈希表。渐进式 rehash 机制确保在扩展哈希表时不阻塞服务器。内存淘汰策略如 lru、lfu 等用于处理内存不足时的数据驱逐。
来源6
AOF 持久化会将每个写命令追加到 AOF 文件的末尾,通过 bgrewriteaof 命令定期重写 AOF 文件来减少体积。RDB 通过 bgsave 命令 fork 一个子进程生成快照,主进程继续处理请求。
FAQ
Q: Redis 的哈希表是怎么扩容的?
A: Redis 使用渐进式 rehash,当哈希表负载因子过高时,分配新哈希表,逐步迁移键值对,不阻塞操作。
Q: RDB 和 AOF 哪个更可靠?
A: AOF 更可靠,因为它记录所有写操作,可重放恢复数据,但文件较大;RDB 更快但可能丢失最后一次快照后的数据。
Q: Redis 字符串底层是什么?
A: 使用 SDS,带有长度前缀的动态字符串,支持二进制安全和高效拼接。
Q: 内存满了 Redis 怎么处理?
A: 通过 maxmemory-policy 配置淘汰策略,如 allkeys-lru 随机淘汰最近最少使用键。