Redis相关面试问题
1、请简单介绍一下Redis?
基于c语言的key、values型的非关系型数据库
2、Redis支持的数据类型有哪些?
字符串 哈希 list set zset
3、你们项目中使用的什么客户端工具操作的Redis?
4、Redis数据丢失怎么解决?
Redis 持久化、搭建集群、数据备份和恢复、合理的设置过期时间
5、Redis的持久化方式有哪些、谈谈它们的区别?
RDB和AOF
一个是数据快照一个写命令
6、你在项目中哪些地方用到了Redis,具体怎么用的?
热点数据、经常访问的数据
7、你还知道Redis的其他使用场景吗?
- 缓存:Redis最常用的场景之一是用作缓存。它可以将频繁读取但是不经常改变的数据存储在内存中,提高应用程序的性能和响应速度。
- 消息队列:Redis支持发布-订阅模式和列表操作,可以用作轻量级的消息队列。
- 计数器和计时器:Redis支持原子操作,可以用作计数器和计时器。
- 分布式锁:Redis可以用于实现分布式锁,控制对共享资源的访问,以避免竞争条件。
- 数据库:Redis支持持久化,并且支持多种数据结构,可以作为NoSQL数据库使用。
- 实时排行榜:Redis支持有序集合,可以用于实时排行榜的实现。
- 地理位置应用:Redis支持地理位置数据类型,可以用于实现地理位置应用,如附近的人功能。
- 分布式会话:将用户会话数据存储在Redis中,以实现分布式系统的无状态性。
8、了解Redis的删除策略吗,默认使用的什么删除策略?
Redis默认使用的是“惰性删除”(Lazy deletion)策略,即当一个键过期时,不会立即从内存中删除,而是在下次访问该键时检查是否过期,如果过期则删除。这种策略可以避免因为删除过期键造成的额外开销,提高性能。但是,如果过期键一直没有被访问,那么就会一直占用内存,造成内存浪费。为了避免这种情况,Redis也提供了主动删除过期键的策略。可以通过在配置文件中设置maxmemory-policy选项来选择删除策略。
9、Redis有哪几种数据淘汰策略?
- noeviction:不进行数据淘汰,当内存不足时,写入操作会返回错误。
- volatile-lru:从已设置过期时间的数据集(即带有 TTL 的 key)中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置过期时间的数据集(即带有 TTL 的 key)中挑选即将过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集(即带有 TTL 的 key)中随机选择数据淘汰。
- allkeys-lru:从所有数据集(即包括带有 TTL 的 key 和不带 TTL 的 key)中挑选最近最少使用的数据淘汰。
10、Redis服务器如果内存不足了怎么办?
增加服务器内存、使用数据淘汰策略、使用 Redis 持久化功能、使用 Redis 集群
11、Redis 常见的性能问题都有哪些、如何解决?
内存使用过高、持久化性能问题、并发操作过多、过多的 key 操作
12、Redis的有哪些集群模式?
主从集群、哨兵集群、分片集群
13、你们项目中采用那种集群模式,使用了几台服务器?
主从集群、哨兵集群、分片集群 6台服务器
14、什么是缓存击穿、怎么解决缓存击穿问题?
缓存击穿指的是当某个 key 在缓存中不存在,但是在数据库中存在,同时有大量并发请求同时请求该 key 时,会导致大量的请求直接穿透缓存,直接查询数据库,导致数据库压力过大,缓存失去了存在的意义。
办法
- 设置热点数据永不过期:将一些热点数据设置为永不过期,这样即使缓存失效,也不会导致请求直接穿透缓存,而是会在缓存中重新加载数据。
- 在缓存中添加空值占位符:在缓存中添加一个空值占位符,表示该 key 对应的数据不存在,这样在数据库中查不到数据的请求也不会直接穿透缓存。
- 使用分布式锁:使用分布式锁,避免多个线程同时查询数据库。当多个线程同时查询同一个 key 时,只有一个线程会查询数据库,其他线程则等待该线程查询完毕后从缓存中获取数据。
- 使用布隆过滤器:使用布隆过滤器判断请求的 key 是否存在于缓存中,避免一些不存在的 key 过多的访问数据库,减轻数据库的负载。
- 使用互斥锁+异步刷新:使用互斥锁,避免多个线程同时查询数据库,同时使用异步刷新,将数据库查询的结果先放入缓存中,然后再将缓存中的数据异步刷新。
15、什么是缓存穿透、怎么解决缓存穿透问题?
缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,每次请求都会穿透到数据库层,导致数据库压力过大,影响系统性能。
缓存穿透问题可以通过以下几种方式来解决:
- 数据预热:在系统启动或者数据发生变化时,将常用数据提前加载到缓存中,这样可以避免大量的请求直接穿透到数据库。
- 缓存空对象:对于数据库中不存在的数据,可以在缓存中设置一个空对象,这样可以防止对于同一个不存在的 key 不断请求数据库,从而减轻数据库的压力。
- 布隆过滤器:使用布隆过滤器来判断请求的 key 是否存在于缓存中,如果不存在,直接返回结果,避免访问数据库,减轻数据库的负载。
- 使用互斥锁+双重检测:使用互斥锁避免多个线程同时查询数据库,同时使用双重检测来避免缓存穿透问题,即在加锁前先在缓存中查找一遍数据,如果不存在,则加锁查询数据库,查询到数据后再放入缓存中。
16、什么是缓存雪崩、怎么解决缓存雪崩问题?
缓存雪崩是指由于缓存中的大量数据同时失效,导致一大批请求直接穿透到数据库,导致数据库瞬间压力过大,甚至崩溃,导致系统不可用的情况。
缓存雪崩问题可以通过以下几种方式来解决:
- 缓存数据过期时间随机化:将缓存数据的过期时间随机化,避免同时失效,分散缓存的更新时间,减少缓存失效的风险。
- 使用分布式缓存:使用多台缓存服务器,避免单点故障和缓存失效的风险,提高缓存的可用性。
- 多级缓存架构:将缓存按照热度和访问频率分级,将访问频率高的数据放到更快的缓存中,访问频率低的数据放到更慢的缓存中,避免大量数据同时失效。
- 数据预热:在系统启动或者数据发生变化时,将常用数据提前加载到缓存中,这样可以避免大量的请求直接穿透到数据库。
- 限流措施:对于请求过多的情况,可以使用限流措施来限制请求量,避免系统崩溃。
17、什么是全量复制和增量复制?
- 全量复制:在刚开始进行主从复制时,主节点将自己的所有数据全部发送给从节点,从节点接收到数据后进行一次性加载,达到和主节点数据完全一致的目的。全量复制的优点是同步快,但缺点是对于数据量比较大的主节点来说,复制的过程会比较慢,同时全量复制会消耗大量的网络带宽和系统资源。
- 增量复制:在完成了全量复制后,主节点将自己新写入的数据以增量的方式同步到从节点,从节点接收到数据后进行增量加载,达到和主节点数据一致的目的。增量复制的优点是同步快,网络带宽和系统资源消耗少,但缺点是如果主节点挂掉一段时间,从节点会因为没有数据同步而与主节点数据不一致。