Redis面试题

参考:

https://zhuanlan.zhihu.com/p/462619821

1. 谈下你对 Redis 的了解?

Redis(Remote Dictionary Server,远程字典服务)是一个基于内存的非关系型数据库,存储方式为key-value,减少磁盘I/O操作

2. Redis 一般都有哪些使用场景?

存储特点:

缓存:内存读取速度快(热点数据查询、短链接、新闻内容、商品内容等)

集群数据共享:session共享,解决不同机器用户登录的问题

key特点:

生成唯一主键:单线程,自增原子

时效性:可以指定过期时间

图片验证码

数据结构:

键唯一:客户id-购物车内容

list(双向链表)顺序存储:好友聊天顺序

list消息队列:发送邮件

set数据去重:网站统计ip

set数据取交集

set数据排序

不适用场景:

数据量太大或数据使用频率太低

3. Redis 有哪些常见的功能?

  1. 数据缓存功能
  2. 支持数据持久化
  3. 支持事务
  4. 分布式锁的功能

4. Redis 支持的数据类型有哪些?

string字符串

hash(键值对)

list双向链表(lpush+brpop)

set集合

sorted set有序集合

5. Redis 为什么这么快?

完全基于内存,绝大部分操作都是在内存中

数据结构简单,数据操作简单

采用单线程,避免上下文切换,避免多线程切换消耗CPU,不会产生死锁消耗性能

多路I/O复用模型,非阻塞IO

6. 什么是缓存预热?

系统上线后提前将数据加载到缓存系统,避免用户直接访问数据库,避免系统上线初期,高并发流量访问数据库造成压力

统计数据访问频率,对这些数据父类,根据级别优先加载频率高的数据

使用脚本程序固定触发数据预热过程

7. 什么是缓存降级?

服务器压力剧增时,为了保证核心功能正常运行,降低或直接关闭不重要的功能。

8. 什么是缓存熔断?

类似于降级(针对整体服务),只是熔断是针对一个服务,超负载时新的请求直接失败

9. 什么是缓存穿透?怎么解决?

查询的数据一定不存在,因此每次查询都没有写入缓存,因此每次查询都会请求数据库

解决方法:

缓存null,设置短时限(最高5分钟),有数据时需要更新null,以免查询数据不一致

10. 什么是缓存击穿?怎么解决?

某个时间点大量的key过期,导致大量请求访问数据库

解决方法:

key过期时间分开

11. 什么是缓存雪崩?该如何解决?

某一段时间内大量缓存失效,导致大量请求访问数据库

解决方法:

加锁排队,只允许一个线程查询数据和写缓存,其他线程等待

数据预热,通过缓存reload机制,在大并发之前手动加载key缓存,设置随机过期时间,让缓存失效的时间点均匀

二级缓存,cache1为原始缓存,过期时间短,cache2为拷贝缓存,过期时间长

12. 怎么保证缓存和数据库数据的一致性?

设置过期时间

数据库更新后删除缓存

13. Redis 持久化有几种方式?

RDB(内存快照,默认):redis某个时间点的数据快照,适合全量复制

存储的数据量大,I/O效率低,每次读写都是全部数据

宕机会丢失数据

AOF:以独立日志的方式记录每次写命令,重启时重新执行AOF文件恢复数据

AOF持久化策略是everysecond,每秒一次,出现问题最多丢失1秒数据

对数据敏感使用AOF

恢复到某一个时间点且要求恢复快,使用RDB

同时开启时,优先使用AOF

14. 在生成 RDB 期间,Redis 可以同时处理写请求么?

使用save会阻塞直到RDB完成

使用bgsave会在后台开启一个线程,不会阻塞

15. 为什么Redis是单线程的还需要事务功能?

redis服务端是单线程,但客户端是多线程,可能有多个,因此执行命令时可能出现竞态

16. Redis 怎么实现分布式锁?

通过setnx(如果不存在则设置成功)设置一个值作为公共锁

设置不成功则等待锁释放

成功就执行操作,最后del锁

时效锁:如果机器宕机导致锁没有释放,可以设置失效时间

17. Redis 淘汰策略有哪些?

Redis执行命令前会调用freeMemoryIfNeeded()检查内存是否充足,不足就清理一些不必要的数据(逐出算法)

  • 清理最近最少使用
  • 清理使用次数最少
  • 清理即将过期
  • 随机清理