- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Redis面试题及答案
1.Redis为什么这么快?别只说“基于内存”,讲点具体的
答案:首先肯定内存存储是基础,但关键在这几点:
IO模型优化:用了“IO多路复用”,一个线程就能处理多个客户端连接,不用频繁创建销毁线程,减少上下文切换开销;
数据结构高效:底层不是简单的数组/链表,比如String用动态字符串(SDS),省空间还能预分配;Hash用哈希表+跳表(大key时),查询快;Zset直接用跳表,范围查询比平衡树高效;
少计算开销:Redis是单线程(核心操作),不用处理线程安全问题,避免锁竞争;而且指令都是轻量级的,没有复杂的计算逻辑。
2.Redis有哪些数据结构?实际项目里你用它们存过什么?
答案:常用的有5种,结合场景说更清楚:
String:存简单键值,比如用户token(key=token:123,value=xxx)、商品库存(key=stock:1001,value=500);
Hash:存对象类数据,比如用户信息(key=user:101,field=name/age/phone,value=对应值),比用多个String省内存,还能单独修改某个字段;
List:做消息队列(简单场景)、历史记录,比如用户最新浏览商品(lpush加元素,lrange取前10条);
Set:去重、交集并集,比如用户关注的标签(key=tag:user101,value=Java/Redis),查两个用户共同标签用sinter;
Zset:带排序的场景,比如排行榜(key=rank:article,score=阅读量,value=文章ID),zrevrange直接取Top10。
3.Redis持久化有哪两种方式?你们项目里选的哪种?为什么?
答案:两种核心方式RDB和AOF,实际选法看业务对数据安全性的要求:
RDB:按指定时间间隔把内存数据快照存磁盘(比如save601000:60秒内改1000次就存),优点是文件小、恢复快;缺点是快照间隔内宕机,数据会丢(比如间隔5分钟,丢5分钟数据);
AOF:记录每一条写指令(比如set、hset),Append到文件里,宕机后重放指令恢复数据;优点是数据丢得少(默认每秒刷盘),缺点是文件大、恢复慢;
我们项目是“RDB+AOF混合模式”:平时用AOF保证数据安全(丢最多1秒数据),定期(比如凌晨3点)生成RDB快照,万一AOF文件损坏,用RDB恢复基础数据,兼顾安全和恢复速度。
4.缓存常见的“穿透、击穿、雪崩”怎么解决?你实际处理过哪种?
答案:这三个问题本质都是缓存没命中,导致请求打数据库,得针对性处理:
缓存穿透(查不存在的key,缓存和DB都没数据):
方案1:存“空值”,比如查用户ID=9999(不存在),缓存里存key=user:9999,value=null,过期时间设短点(比如5分钟);
方案2:用布隆过滤器,把所有存在的key提前存过滤器里,请求先过过滤器,不存在直接返回,不用查缓存和DB;
我们项目用的布隆过滤器,因为空值多了会占缓存空间,过滤器更省内存。
缓存击穿(热点key突然过期,大量请求打DB):
方案1:热点key永不过期(业务允许的话),比如首页Banner图的key,手动更新缓存,不设过期时间;
方案2:互斥锁,缓存没命中时,只让一个线程去查DB,其他线程等结果,查完更新缓存再返回;
我们之前首页商品详情页用了互斥锁,避免DB被打崩。
缓存雪崩(大量key同时过期,或缓存集群宕机):
方案1:过期时间加随机值,比如原本都设1小时,改成3600±300秒,避免同时过期;
方案2:多缓存集群,主缓存宕了,用备用缓存(比如本地缓存+Caffeine)临时顶一下;
我们主要用了随机过期时间,再加了缓存监控,宕机前能提前预警。
5.Redis主从复制怎么工作的?同步数据时会影响主库吗?
答案:主从复制分“全量同步”和“增量同步”,过程挺轻量的,一般不影响主库:
全量同步(第一次连接/主库runid变了):
从库发psync命令,主库执行bgsave生成RDB文件,同时把期间的写指令存到“复制缓冲区”;
主库把RDB发给从库,从库加载RDB恢复数据;
主库再把复制缓冲区的指令发给从库,从库执行,至此同步完成;
增量同步(后续正常同步):
主库每执行一条写指令,就会把指令发给从库,从库实时执行,保持数据一致;
影响方面:主库生成RDB用的是bgsave(后台进程),不阻塞主库处理请求;复制缓
文档评论(0)