本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:[email protected].将会删除相关内容
知识点汇总
缓存是高并发场景下,提升热点数据访问性能的手段
知识点详解
MC的内存结构
Redis
功能
bitmap
支持按位存取信息,可用于实现bloomfilter
hyperLogLog
提供不精确的去重统计功能,适合用作大规模数据的去重统计
geospatial
可用于保存地理位置,并作位置距离计算或根据半径计算位置等
Sub/Pub
订阅发布功能,可用于简单的消息队列
pipeline
可批量执行一组指令,一次性返回全部结果,另一种方式是使用脚本
事务功能是串行执行,但失败不会回滚
持久化
- RDB
- 将数据集以快照形式写入磁盘,通过fork子进程执行,采用二进制压缩存储
- redis数据保存在单一文件中,适合用作灾害备份,但是在快照写入磁盘之前宕机会丢失数据,保存快照时会时服务停顿
- AOF
- 以文本日志的形式,记录redis的每一个操作
- 有灵活以保持同步(每秒,每次操作,不同步)
- 磁盘文件与RDB方式比大,效率低于RDB
淘汰策略
voltile-
对设置的生存时间的key进行lru,最小生存时间,随机剔除
allkeys-
则是对所有key
no-eviction
则是不进行剔除,读取正常,写入则会报异常
Redis数据结构
list
由linkedlist
和ziplist
实现ziplist
存储在连续位置上,存储效率高,不利于修改操作,适用于数据较少的情况linkedlist
再插入节点上复杂度低,但内存开销大,节点地址不连续,容易产生内存碎片- 3.2后增加了
quicklist
,其本身是双向无环链表,每个节点是ziplist
hash
由ziplist
和hashtable
实现- 当
hash
中的K/V字符串长度小于64B且hash长度小于512时使用ziplist
,超过时使用hashtable
- 当
set
由hashtable
和intset
- 当set中的值都为数值且set长度小于512时使用
intset
,超过则使用hashtable
- 当set中的值都为数值且set长度小于512时使用
zset
由ziplist
和skiplist
实现- 当
zset
中元素长度小于64B且zset
长度小于128时使用ziplist
,超过时会使用skiplist
- 当
redis内存分配采用jemalloc,将内存划分为small,large,huge三个范围,并在其中划分了不同大小的内存块,存储数据时选择大小合适的内存块进行存储,有利于减小内存碎片
缓存常见问题
缓存问题 | 产生原因 | 解决方案 |
---|---|---|
缓存方式 | 数据变更,缓存时效性 | 同步更新,失效更新,异步更新,定时更新 |
缓存不一致 | 同步更新失败,异步更新 | 增加重试,补偿任务,最终一致 |
缓存穿透 | 恶意攻击 | 空对象缓存,bloomfilter过滤器 |
缓存击穿 | 热点key失效 | 互斥更新,随机退避,差异失效时间 |
缓存雪崩 | 缓存宕机 | 快速失败熔断,主从模式,集群模式 |
面试考察点
- 了解缓存的使用场景,不同类型缓存的使用方式
- 对db热点数据进行缓存能减轻db压力,对热点服务进行缓存能提高服务并发性能
- 单纯的K/V缓存场景可以使用MC,需要缓存特殊数据结构时可以使用Redis
- 如,缓存视频播放列表可以使用redis的list缓存,计算排行榜数据时可以使用zset
- 掌握MC和Redis的常用命令
- 了解MC和Redis在内存中的存储结构
- 了解MC和Redis得数据失效方式和提出策略
- 如主动触发的定期删除,延迟触发的延期删除
- 了解Redis的持久化,主从同步与cluster部署的原理
- 如RDB与AOF的实现方式与区别
加分项
- 结合实际应用场景来介绍缓存的使用
- 如调用后端服务接口获取信息时,可使用本地+远程的多级缓存
- 有过分布式缓存设计和应用经验
- 了解缓存使用中可能出现的问题
- 知道Redis的典型应用场景
- 知道Redis的新特新
- 5.0stream相较Sub/Pub功能可将未消费的信息进行缓存类似(kafka)
真题汇总
- Redis和Memcache有什么区别,该如何选择?
- 你用到那些Redis的数据结构,在什么场景下?
- Redis有哪些持久化方式,有什么区别?
- Redis的失效机制是怎样的,Redis有哪些淘汰策略?
- 如何保证Redi的高并发和高可用?
- 高并发:主从读写分离,多从库,多端口实例以及cluster集群部署
- 高可用:sentinel保证主库宕机时,重新选住并完成从库的变更
- 如何使用Redis实现延时队列,如何使用Redis实现分布式锁?
- 可使用sortedset实现延迟队列,使用时间戳做score,使用zrange by score命令获取指定延迟时间之前的数据.
- 可是使用setnx设置key,返回1则获取锁成功,返回0则获取锁失败