拉勾网《32个Java面试必考点》学习笔记之十------缓存(Redis与Memcache)

本文为拉勾网《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数据结构

在这里插入图片描述

  • listlinkedlistziplist实现
    • ziplist存储在连续位置上,存储效率高,不利于修改操作,适用于数据较少的情况
    • linkedlist再插入节点上复杂度低,但内存开销大,节点地址不连续,容易产生内存碎片
    • 3.2后增加了quicklist,其本身是双向无环链表,每个节点是ziplist
  • hashziplisthashtable实现
    • hash中的K/V字符串长度小于64B且hash长度小于512时使用ziplist,超过时使用hashtable
  • sethashtableintset
    • 当set中的值都为数值且set长度小于512时使用intset,超过则使用hashtable
  • zsetziplistskiplist实现
    • 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则获取锁失败

猜你喜欢

转载自blog.csdn.net/werqerwer/article/details/88532950
今日推荐