Redis高频面试题
一、Redis有什么好处?
- 高性能:Redis是一个基于内存的数据存储系统,相比于传统的基于磁盘的数据库系统,它能够提供更高的读写性能。
- 支持丰富的数据类型:Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,这使得它可以用于多种不同的应用场景。
- 持久化:Redis支持持久化机制,可以将内存中的数据定期写入磁盘,以防止数据丢失。
- 高可用性:Redis支持主从复制和Sentinel系统,可以实现高可用性和故障恢复。
- 简单易用:Redis的命令简单易懂,学习曲线较低,使用方便。
- 丰富的功能:Redis提供了丰富的功能和特性,如事务、发布/订阅、Lua脚本等,可以满足各种需求。
二、Redis为什么那么快?
- 内存存储:Redis将数据存储在内存中,这使得读写速度非常快。同时,Redis也提供持久化机制,可以将内存数据异步地写入磁盘中,保证数据的安全性和可靠性。
- 非阻塞I/O多路复用机制:Redis使用非阻塞I/O模型,避免了线程上下文切换和系统调用带来的开销,从而大幅提高了并发吞吐量。
- 单线程架构:Redis采用单线程架构,避免了多线程间的同步和锁竞争等问题,简化了代码实现和维护。
- 数据结构优化:Redis内置了多种数据结构(如哈希表、有序集合等),并对其进行了优化,使得操作复杂度低,能够在很短的时间内完成大量的数据处理。
- 预分配内存:Redis在初始化时会预先分配一定量的内存空间,避免了频繁的内存分配和释放过程,提高了性能。
三、Redis与 Memcache区别?
Memcached只能存储KV、没有持久化机制,不支持主从复制,是多线程的。
四、Redis的数据结构
String
String的实现基于 SDS (简单动态字符串)。SDS特点:
(1)不用担心内存溢出问题,如果需要会对SDS进行扩容。
(2)获取字符串长度时间复杂度为O(1),因为定义了len属性。
(3)通过“空间预分配”和“惰性空间释放”,防止多次重分配内存。
(4)判断是否结束的标志为len属性,可以包含‘\0’(它同样以’\0’结尾时因为这样就可以使用C语言中函数库操作字符串的函数了)。
String存在三种编码
为什么要为不同的大小设计不同的编码?
embstr的使用只分配一次内存空间(因为RedisObject和SDS是连续的),而raw需要分配两次内存空间(分别为RedisObject和SDS分配空间)。
因此与raw相比,embstr的好处在于创建时少分配一次空间,删除时少释放一次空间,以及对象的鄋数据连在一起,寻找方便。
而embstr的坏处也很明显,如果字符串的长度增加需要重新分配内存时,整个Redis
Object和SDS都需要重新分配空间,因此Redis中的embstr实现为只读(这种编码的内容是不能修改的)。
int和embstr什么时候转化为raw?
1、int数据不再是整数——raw
2、int大小超过了long的范围(2^63-1)——embstr
3、embstr长度超过了44个字符串——raw
应用场景
分布式数据共享
分布式锁
分布式id
限流
Hash哈希
Hash存储原理:Redis中的Hash本身也是一个KV的结构。外层是一样的,内层是基于zipList(压缩列表)和hashTable(哈希表)。
ZipList存储结构