勾哥:昨天发了一篇翻译,英语水平一般般的我抠了半天字眼,一个 word 一个 word 翻译过来,竟然被举报了?!

哈?举报的那位兄弟你是盐吃多么

今天更新一篇缓存的常见问题,对很多开发老哥都能有帮助,尽量没搞难度特别大,写的简单的很!有意见可以正常反馈~

(女神带我避开杠精!)

~~~以下正文~~~

对使用缓存时常遇到几个问题,整理出了一个表格。

1. 缓存更新方式

第一个问题是缓存更新方式,这是决定在使用缓存时就该考虑的问题。

缓存的数据在数据源发生变更时需要对缓存进行更新,数据源可能是 DB,也可能是远程服务。

更新的方式可以是主动更新。

数据源是 DB 时,可以在更新完 DB 后就直接更新缓存。

当数据源不是 DB 而是其他远程服务,可能无法及时主动感知数据变更,这种情况下一般会选择对缓存数据设置失效期,也就是数据不一致的最大容忍时间。

这种场景下,可以选择失效更新,key 不存在或失效时先请求数据源获取最新数据,然后再次缓存,并更新失效期。

但这样做有个问题,如果依赖的远程服务在更新时出现异常,则会导致数据不可用。

改进的办法是异步更新,就是当失效时先不清除数据,继续使用旧的数据,然后由异步线程去执行更新任务。这样就避免了失效瞬间的空窗期。

另外还有一种纯异步更新方式,定时对数据进行分批更新。实际使用时可以根据业务场景选择更新方式。

2. 数据不一致

第二个问题是数据不一致的问题,可以说只要使用缓存,就要考虑如何面对这个问题。

缓存不一致产生的原因一般是主动更新失败,例如更新 DB 后,更新 Redis 因为网络原因请求超时;或者是异步更新失败导致。

解决的办法——

  • 如果服务对耗时不是特别敏感可以增加重试。
  • 如果服务对耗时敏感可以通过异步补偿任务来处理失败的更新。
  • 或者短期的数据不一致不会影响业务,那么只要下次更新时可以成功,能保证最终一致性就可以。

3. 缓存穿透

第三个问题是缓存穿透。

产生这个问题的原因可能是外部的恶意攻击,例如,对用户信息进行了缓存,但恶意攻击者使用不存在的用户 ID 频繁请求接口,导致查询缓存不命中,然后穿透 DB 查询依然不命中。这时会有大量请求穿透缓存访问到 DB。

解决的办法——

  • 对不存在的用户,在缓存中保存一个空对象进行标记,防止相同 ID 再次访问 DB,不过有时这个方法并不能很好解决问题,可能导致缓存中存储大量无用数据。
  • 使用 BloomFilter 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在。非常适合解决这类的问题。

4. 缓存击穿

第四个问题是缓存击穿,就是某个热点数据失效时,大量针对这个数据的请求会穿透到数据源。

解决这个问题有这些办法——

  • 可以使用互斥锁更新,保证同一个进程中针对同一个数据不会并发请求到 DB,减小 DB 压力。
  • 使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新。
  • 针对多个热点 key 同时失效的问题,可以在缓存时使用固定时间加上一个小的随机数,避免大量热点 key 同一时刻失效。

5. 缓存雪崩

第五个问题是缓存雪崩。产生的原因是缓存挂掉,这时所有的请求都会穿透到 DB。

解决方法——

  • 使用快速失败的熔断策略,减少 DB 瞬间压力。
  • 使用主从模式和集群模式来尽量保证缓存服务的高可用。
  • 实际场景中,这两种方法会结合使用。

考察点与加分项

这部分主要面试考察点是对缓存特性的理解,对 MC、Redis 的特点和使用方式的掌握。

1. 要知道缓存的使用场景,不同类型缓存的使用方式,例如:

  • 对 DB 热点数据进行缓存减少 DB 压力;对依赖的服务进行缓存,提高并发性能
  • 单纯 K-V 缓存的场景可以使用 MC,而需要缓存 list、set 等特殊数据格式,可以使用 Redis
  • 需要缓存一个用户最近播放视频的列表可以使用 Redis 的 list 来保存、需要计算排行榜数据时,可以使用 Redis 的 zset 结构来保存

2. 要了解 MC 和 Redis 的常用命令,例如:

  • 原子增减、对不同数据结构进行操作的命令等
  • 了解 MC 和 Redis 在内存中的存储结构,这对评估使用容量会很有帮助
  • 了解 MC 和 Redis 的数据失效方式和剔除策略,比如主动触发的定期剔除和被动触发延期剔除

3. 要理解 Redis 的持久化、主从同步与 Cluster 部署的原理,例如:

  • RDB 和 AOF 的实现方式与区别

如果想要在面试中获得更好的表现,还应了解下面这些加分项。

1. 要结合实际应用场景来介绍缓存的使用,例如:

  • 调用后端服务接口获取信息时,可以使用本地+远程的多级缓存
  • 对于动态排行榜类的场景可以考虑通过 Redis 的 sorted set 来实现等等

2. 最好有过分布式缓存设计和使用经验,例如:

  • 项目中在什么场景使用过 Redis,使用了什么数据结构,解决哪类的问题
  • 使用 MC 时根据预估值大小调整 McSlab 分配参数等等

3. 最好可以了解缓存使用中可能产生的问题,例如:

  • Redis 是单线程处理请求,应尽量避免耗时较高的单个请求任务,防止相互影响
  • Redis 服务应避免和其他 CPU 密集型的进程部署在同一机器
  • 禁用 Swap 内存交换,防止 Redis 的缓存数据交换到硬盘上,影响性能
  • MC 钙化问题等等

4. 要了解 Redis 的典型应用场景,例如:

  • 使用 Redis 来实现分布式锁
  • 使用 Bitmap 来实现 BloomFilter
  • 使用 HyperLogLog 来进行 UV 统计等等

5. 知道 Redis4.0、5.0 中的新特性,例如:

  • 支持多播的可持久化消息队列 Stream
  • 通过 Module 系统来进行定制功能扩展等等

本文首发在公号:勾勾的Java宇宙

欢迎大家来找勾哥交流探讨技术!

表格缓存问题_缓存常见问题,一网打尽哦!相关推荐

  1. @cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?

    现代的消息队列,都使用磁盘文件来存储消息.因为磁盘是一个持久化的存储,即使服务器掉电也不会丢失数据.绝大多数用于生产系统的服务器,都会使用多块儿磁盘组成磁盘阵列,这样不仅服务器掉电不会丢失数据,即使其 ...

  2. 浅谈SpaceBuilder系统的缓存机制_缓存思想

    在前面的文章中也提及到为了提高系统的性能,SpaceBuilder在内部做了大量的工作,而数据缓存就是其中非常高效的处理方式. 我们知道SpaceBuilder采用了多层架构的处理模式,数据通过业务实 ...

  3. unity 缓存服务器_缓存服务器

    设置 Asset Server 旧版 Asset Bundle 缓存服务器 重要信息:缓存服务器 (Cache Server) 仅支持资源导入管线 (Asset Import Pipeline) 版本 ...

  4. 小工匠聊架构 - 分布式缓存技术_缓存设计

    文章目录 总览 缓存的基本思想 缓存优势 缓存的代价 总览 首先,要熟练掌握缓存的基础知识,了解缓存常用的分类.读写模式,熟悉缓存的七大经典问题及解决应对之策,同时要从缓存组件的访问协议.Client ...

  5. 二级缓存失效_缓存核心技术:缓存穿透、缓存并发、缓存失效之思路变迁

    在用缓存的时候,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果 ...

  6. 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  7. ehcache缓存原理_贼厉害,手撸的 SpringBoot缓存系统,性能杠杠的!

    缓存是最直接有效提升系统性能的手段之一.个人认为用好用对缓存是优秀程序员的必备基本素质. 本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统. 一.通用缓存接口 1.缓 ...

  8. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  9. fifo算法_缓存算法FIFO、LFU、LRU

    阅读文本大概需要3分钟. 0x01:FIFO算法 FIFO(First in First out),先进先出.其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为 ...

最新文章

  1. VMware VSphere 虚拟化云计算学习配置笔记(一)
  2. 学习笔记(2)IPC机制
  3. ubuntu12.10 64位编译Android4.1
  4. VTK:投影点用法实战
  5. ASCII码八、十、十六进制对照表
  6. Maven_在Eclipse中执行Maven命令
  7. 【语义分割】PSPNet:Pyramid Scene Parsing Network
  8. ImageLoader实现图片异步加载
  9. java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序
  10. 最详细的R-CNN论文笔记
  11. 如何设置ListView控件中的列头的颜色!
  12. 了解Binder机制原理和底层实现
  13. 硅谷卖场里看家庭监控设备:Dropcam难撼传统DVR系统
  14. 程序员的思维修炼7——积累经验
  15. python执行shell脚本报错_详解python执行shell脚本创建用户及相关操作
  16. pytorch torchvision的版本对应关系 pytorch历史版本
  17. echarts 地图添加纹理图片
  18. windows如何导出组策略结果集 (RSOP)
  19. Revisiting Pixel-Wise Supervision for Face Anti-Spoofing
  20. Ubuntu 和 CentOS 根据命令查找软件包

热门文章

  1. 作业一 郝树伟 1101210664
  2. T6 s1 day19
  3. MySQL 查询表中某字段值重复的数据
  4. AviatorEvaluator表达式引擎
  5. 使用TFS+GIT实现分布式项目管理
  6. iOS基础 - 文本属性Attributes
  7. 简单的FTP应用程序
  8. 【数据结构与算法】之深入解析“路径交叉”的求解思路与算法示例
  9. App设计灵感之十二组精美的插画引导页设计案例
  10. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - A. 奖券数目