文章目录
1、什么是Redis?
- Redis是一个基于C语言开发的NoSql数据库(BSD许可)。
- 与传统数据库不同的是,Redis的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广泛应用于分布式缓存方向。
- 并且,Redis存储的K-V键值对数据。
2、Redis的常见面试题
(1)Redis为什么快
答案:
- Redis基于内存,内存的访问速度是磁盘的上千倍;
- Redis基于Reactor模式设计开发类一套高效的事件处理模型,主要是单线程事件循环和IO多路复用(Redis线程)
- Redis内置类多种优化过的数据类型/结构实现,性能非常高。
(2)为什么要用Redis(缓存)
答案:
- 高性能:
第一次读取数据库中的数据时,是从硬盘中读取的。但是,如果,用户访问的数据属于高频数据并且不会经常改变的话,那我们就可以把该用户访问的数据存在缓存中,保证用户下一个再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存。所以相当快。
- 高并发:
Redis缓存很容易达到10w+。甚至更高。----直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以把数据库的部分数据转移缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。这样,我们就提高了系统整体的并发。
(3)Redis功能有哪些
答案: Redis的主要功能包括:
缓存:Redis支持将数据存储在内存中,因此可以快速读取和写入数据。通过将常用的数据存储在Redis缓存中,可以大大提高应用程序的性能和响应速度。
会话管理:Redis可以用于存储和管理用户会话信息,例如用户登录状态、购物车内容等。与传统的基于Cookie的会话管理相比,使用Redis可以提供更高的性能和可扩展性。
消息队列:Redis提供了一种发布/订阅模型,可以用于构建高性能的消息队列系统。应用程序可以将消息发布到Redis中,其他订阅者可以实时获取这些消息进行处理。
实时分析:Redis支持一些高级数据结构,如有序集合和位图,可以用于实时分析和统计。这些数据结构可以帮助应用程序快速计算排行榜、计数器和用户行为等指标。
数据持久化:Redis提供了数据持久化的功能,可以将内存中的数据定期或根据配置写入磁盘。这样即使Redis服务器重启,也能够恢复之前存储的数据。
(4)请梳理Redis的三种持久化机制
RDB持久化:
- 持久化步骤:RDB持久化是通过将Redis在内存中的数据定期保存到磁盘上的RDB文件中来实现的。在指定的时间间隔内,Redis会fork出一个子进程来处理持久化操作,将内存中的数据快照写入RDB文件,完成后替换原有的RDB文件。
- 优点:RDB持久化对于数据的完整性和一致性较好,适用于大规模的数据恢复。
- 缺点:RDB持久化在数据恢复时会丢失最后一次快照后的修改操作,因此可能造成数据的部分丢失。
AOF持久化:
- 持久化步骤:AOF持久化是通过将Redis的写命令以追加的方式写入到AOF文件中来实现的。Redis在执行每个写命令时,都会将该命令追加到AOF文件的末尾,保证了操作的顺序性。在重启时,Redis会重新执行AOF文件中的命令来恢复数据。
- 优点:AOF持久化保证了每个写操作的完整性,不会丢失数据,适用于要求数据不丢失的场景。
- 缺点:AOF持久化的文件体积通常比RDB持久化的文件体积大,恢复速度也相对较慢。
混合持久化:
- 持久化步骤:混合持久化是将RDB持久化和AOF持久化结合起来使用。Redis会先执行RDB持久化,然后在RDB文件加载时,再根据AOF文件中的命令进行重放,以此来实现数据的恢复。
- 优点:混合持久化结合了RDB和AOF的优点,既可保证数据的完整性,又可提高恢复的速度。
- 缺点:混合持久化的实现相对复杂,需要同时维护RDB和AOF两种持久化机制。
(5)Redis的五种基本数据类型
String(字符串):
- 数据类型:字符串
- 常用命令:SET、GET、INCR、DECR等
- 应用场景:缓存、计数器、分布式锁等
Hash(哈希):
- 数据类型:键值对的集合
- 常用命令:HSET、HGET、HGETALL、HDEL等
- 应用场景:存储对象、用户信息、配置信息等
List(列表):
- 数据类型:有序的字符串列表
- 常用命令:LPUSH、RPUSH、LPOP、RPOP等
- 应用场景:消息队列、任务队列、最新消息列表等
Set(集合):
- 数据类型:无序且唯一的字符串集合
- 常用命令:SADD、SREM、SMEMBERS、SINTER等
- 应用场景:好友关系、标签集合、点赞用户等
Sorted Set(有序集合):
- 数据类型:有序且唯一的字符串集合,每个元素关联一个分数
- 常用命令:ZADD、ZREM、ZRANGE、ZSCORE等
- 应用场景:排行榜、按权重排序的数据、范围查询等
(6)Redis的三种特殊数据类型
- Bitmap(位图):用于存储位的数据类型,支持位操作
- HyperLogLog(基数估算):用于进行基数统计的数据类型
- Geospatial(地理位置):用于存储地理位置信息的数据类型,支持地理位置计算
(7)Redis 3种常用的缓存读写策略
Cache Aside Pattern(旁路缓存模式):
- 写操作:先更新数据库,然后直接删除缓存。
- 读操作:先从缓存中读取数据,如果缓存中存在则直接返回,如果缓存中不存在,则从数据库中读取数据返回,并将数据放入缓存中。
Read/Write Through Pattern(读写穿透):
- 写操作(Write Through):先查找缓存,如果缓存中不存在则直接更新数据库。如果缓存中存在,则先更新缓存,然后缓存服务自己负责将数据同步更新到数据库。
- 读操作(Read Through):先从缓存中读取数据,如果缓存中存在则直接返回。如果缓存中不存在,则先从数据库加载数据,并将数据写入缓存后再返回响应。
Write Behind Pattern(异步缓存写入):
- Write Behind Pattern 和 Read/Write Through Pattern 类似,都是由缓存服务负责缓存和数据库的读写。
- 不同之处在于,Write Behind Pattern 只更新缓存而不直接更新数据库,而是采用异步批量方式来更新数据库。
- 这种方式可能会面临数据一致性的挑战,例如在缓存数据异步更新到数据库之前,缓存服务可能会出现故障。
(8)三种策略各自的优缺点
Cache Aside Pattern(旁路缓存模式):
- 优点:
- 提高读取性能:可以直接从缓存中读取数据,减少了对数据库的访问次数。
- 简单易实现:只需要在读取和更新数据时进行相应的操作即可。
- 缺点:
- 数据一致性问题:在更新数据库后需要手动删除缓存,可能出现缓存和数据库数据不一致的情况。
- 额外的开销:需要维护缓存和数据库之间的同步逻辑。
Read/Write Through Pattern(读写穿透):
- 优点:
- 数据一致性:通过同步更新缓存和数据库,保证了数据的一致性。
- 减少数据库压力:可以直接从缓存中读取数据,减少了对数据库的访问次数。
- 缺点:
- 性能瓶颈:由于每次更新都需要同步更新缓存和数据库,可能会影响性能。
- 实现复杂度高:需要实现缓存和数据库的同步逻辑。
Write Behind Pattern(异步缓存写入):
- 优点:
- 提高写入性能:通过异步批量更新数据库,减少了每次写入的开销。
- 减少数据库压力:只需要更新缓存,减少了对数据库的直接写入次数。
- 缺点:
- 数据一致性问题:异步更新数据库可能导致缓存和数据库数据不一致。
- 实现复杂度高:需要实现异步更新数据库的逻辑,处理数据一致性问题。