#1 Redis到底是单线程还是多线程?
Redis6.0版本之前的单线程指的是 网络I/O和键值对读写是由一个线程完成的。
Redis6.0引入的多线程指的是网络请求过程采用了多线程;而键值对读写命令仍然是单线程处理的,Redis依然是并发安全的。
即数据操作模块是单线程的,其它持久化、集群数据同步等,是由额外线程执行的。
#2 Redis中常用的数据类型有哪些?
- String(字符串):最基本的数据类型,可以存储字符串、整数或浮点数。
- Hash(哈希):存储键值对的无序散列表,适合存储对象。
- List(列表):按照插入顺序存储的字符串集合,可以进行插入、删除操作,支持从两端进行操作。
- Set(集合):无序且唯一的字符串集合,可以进行添加、删除、求交集、求并集等操作。
- Sorted Set(有序集合):与集合类似,但每个元素都有一个分数,按照分数排序,支持根据分数范围获取元素。
- Bitmaps(位图):用于存储二进制位的数据结构,支持对位的操作,如设置、获取、计数等。
- HyperLogLog(基数估算):用于进行非精确的基数计数,适用于统计客户端数量、页面访问量等。
- Geospatial(地理位置):支持存储地理位置信息,并进行地理位置相关的查询。
#3 Redis的持久化机制?
-
RDB(Redis Database)持久化:RDB持久化是将Redis的数据以快照的形式保存到磁盘上,主要通过fork()系统调用来生成子进程进行持久化操作。RDB持久化机制可以手动触发,也可以通过配置自动触发。在发生宕机或服务器重启时,可以通过加载RDB文件来恢复数据。
-
AOF(Append-Only File)持久化:AOF持久化是将Redis的操作命令追加到AOF文件的末尾,以文本格式保存在磁盘上。每当有写操作命令时,Redis会将命令以协议格式追加到AOF文件末尾。AOF文件记录了Redis服务器的完整操作日志,可以通过重新执行AOF文件中的命令来恢复数据。AOF持久化机制可以根据配置的策略选择刷新频率,如每个写操作、每秒刷新等。
#4 Redis的高可用有哪些?
-
Redis主从复制:通过配置Redis的主服务器和从服务器,将主服务器上的数据同步到从服务器,从服务器可以接收读取请求,提供读取负载均衡和故障转移的能力。如果主服务器发生故障,可以通过手动或自动将一个从服务器晋升为主服务器,保证系统的可用性。
-
Redis Sentinel(哨兵):Redis Sentinel是一组监控Redis服务器的独立进程,可以实现自动故障检测、故障切换和故障恢复。哨兵通过互相通信和监控来保证Redis的高可用性。当主服务器不可用时,哨兵会协调将一个从服务器晋升为新的主服务器,然后通知其他从服务器更新配置,从而实现故障转移和自动恢复。
-
Redis Cluster(集群):Redis Cluster将数据分片到多个主服务器上,每个主服务器负责一部分数据。通过分片和数据复制,实现数据的高可用和负载均衡。Redis Cluster可以自动将不可用的主服务器的槽迁移到其他可用的主服务器上,实现故障转移和自动恢复。
-
Redis持久化和数据备份:使用Redis的RDB持久化或者AOF持久化,将数据保存到磁盘上,以防止数据丢失。此外,还可以定期备份Redis数据文件,以确保数据的可靠性和安全性。
#5 Redis的底层数据额结构有哪些?
-
字符串(String):Redis的底层数据结构中最基本的类型是字符串。它被用于存储字符串、整数或浮点数。
-
字典(Dictionary):Redis使用字典作为哈希表的底层实现。字典在Redis中被广泛用于存储键值对,例如存储哈希(Hash)类型。
-
跳跃表(Skip List):Redis中的有序集合(Sorted Set)数据类型的底层实现是跳跃表。跳跃表是一种有序、可高效查找的数据结构。
-
链表(Linked List):Redis使用链表作为列表(List)数据类型的底层实现。链表在插入和删除元素时具有良好的性能。
-
整数数组(Intset):Redis使用整数数组作为无重复元素的集合(Set)的底层实现。整数数组对于存储较小范围的整数集合非常高效。
-
压缩列表(Ziplist):Redis使用压缩列表作为列表和哈希类型的底层实现,当元素数量较少或者元素较小时,压缩列表的空间效率更高。
-
跳跃表和字典的联合(Redis Cluster使用):Redis Cluster使用了一种特殊的数据结构,将跳跃表和字典进行联合,实现对大规模数据的分布式存储和索引。