Redis是一种基于内存的高性能键值数据库,它可以存储不同类型的数据,如字符串、列表、集合、散列、有序集合等。Redis的数据存储和读取机制是它的核心特性之一,本文将对其进行详细的介绍。
数据存储
Redis的数据存储分为两个层面:内存层面和持久化层面。
内存层面
Redis的所有数据都是存储在内存中的,这使得它具有极高的读写速度。Redis使用不同的数据结构来实现不同类型的键值对,例如:
1.字符串类型使用简单动态字符串(SDS)结构,它是一种可以动态扩展和缩小的字符串结构,避免了频繁的内存分配和释放。
2.列表类型使用双向链表或压缩列表(ziplist)结构,前者适用于元素较多或元素较大的情况,后者适用于元素较少或元素较小的情况,压缩列表可以节省内存空间。
3.集合类型使用哈希表或整数集合(intset)结构,前者适用于元素较多或元素不是整数的情况,后者适用于元素较少且都是整数的情况,整数集合可以提高查找效率。
4.散列类型使用压缩列表或哈希表结构,前者适用于字段较少或字段值较小的情况,后者适用于字段较多或字段值较大的情况。
5.有序集合类型使用压缩列表或跳跃表(skiplist)和哈希表结构,前者适用于元素较少或元素分值较小的情况,后者适用于元素较多或元素分值较大的情况,跳跃表可以实现快速地按分值范围查找元素。
Redis根据不同类型的键值对选择合适的数据结构来存储数据,并且可以根据数据变化动态地切换数据结构,以达到最优的内存利用率和性能。
持久化层面
虽然Redis是基于内存的数据库,但它也提供了两种持久化机制来保证数据在断电或重启后不会丢失,分别是快照(snapshotting)和追加文件(append-only file, AOF)。
快照是指将Redis在内存中的数据保存到磁盘上的一个二进制文件中,这个文件可以在需要时恢复数据到内存中。快照有两种触发方式:
1.定时触发:根据配置文件中设定的时间间隔和写操作次数来定期执行快照操作。
2.手动触发:通过执行SAVE或BGSAVE命令来执行快照操作。其中SAVE命令会阻塞Redis服务器直到快照完成,而BGSAVE命令会创建一个子进程来执行快照操作,不影响主进程。
快照的优点是可以将数据保存到一个紧凑的文件中,方便备份和传输,而且恢复数据的速度较快。缺点是如果在两次快照之间发生故障,会丢失这段时间内的数据,而且快照操作可能会影响Redis的性能。
#追加文件