面试为啥都问Redis缓存?赶紧补一下


面试为啥都问Redis缓存?赶紧补一下

文章插图
大家好,我是哪吒 。
我第一次接触缓存的时候,是用map做的,当时做一个实时数据同步的功能 。
需求看似简单,一取一传
  • 当时是通过websocket获取服务端数据 。
  • 然后根据数据类别,将数据缓存到本地map中 。
  • 做了一个定时任务,通过ftp上传给第三方服务器 。
当有并发时,map是不行的,数据会错乱,使用ConcurrentHashMap可以解决并发数据错乱问题 。
  • 现场网络很不稳定,FTP时好时坏 。
  • 做的是一个安全问题的实时监控系统,第三方数据要求还很严格,必须100%准确 。
这矛盾怎么解决,无解了 。
起初,是通过重启的方式解决的,哈哈,重启解决一切烦恼 。
  • 添加一个心跳功能,实时监控FTP服务的状态 。
  • 如果断了7秒以上,就采取报警功能,我记得设置的是火警的音乐,提示现场人员排查FTP网络 。
  • 如果断了1分钟以上,就将软件自动重启 。
但是,又出现了一个新的问题,数据丢了 。因为用的是ConcurrentHashMap缓存数据,也就是本地缓存,你重启了,数据不就没了吗?兄弟 。
到后来,才发现,当时做的真的是稀烂,本地缓存应该具有很多功能,当时这些,压根就没有 。
  • 超过最大限制有对应淘汰策略如LRU、LFU 。
  • 过期时间淘汰如定时、懒式、定期 。
  • 持久化 。
  • 统计监控 。
下面从缓存、本地缓存、redis缓存、Redis缓存策略几个维度,全方位、系统的学习一下缓存到底是个啥?
一、缓存缓存就是把访问量较高的热点数据从传统的关系型数据库中加载到内存中,当用户再次访问热点数据时,是从内存中加载,减少了对数据库的访问量,解决了高并发场景下容易造成数据库宕机的问题 。
缓存有哪些分类:
  1. 操作系统磁盘缓存,减少磁盘机械操作 。
  2. 数据库缓存,减少文件系统 I/O 。
  3. 应用程序缓存,减少对数据库的查询 。
  4. Web 服务器缓存,减少应用程序服务器请求 。
  5. 客户端浏览器缓存,减少对网站的访问 。
本地缓存:在客户端本地的物理内存中划出一部分空间,来缓存客户端回写到服务器的数据 。当本地回写缓存达到缓存阈值时,将数据写入到服务器中 。
二、分析一下本地缓存的优势数据缓存带来了诸多优势,其中两个核心优点是:
  • 降低数据库压力:通过将常用的数据存储在快速访问的内存中,缓存有效地减轻了对后端数据库的压力 。这意味着数据库可以更专注地处理复杂的查询和更新操作,而不必频繁地处理重复的读取请求 。
  • 提高响应速度:将数据存储在缓存中,使得系统能够更迅速地响应用户的请求 。相比每次都从数据库中获取数据,缓存可以在毫秒级别内提供所需信息,从而极大地改善用户体验 。

面试为啥都问Redis缓存?赶紧补一下

文章插图
三、本地缓存解决方案?上面介绍了ConcurrentHashMap,这里不再赘述 。
1、基于Guava Cache实现本地缓存Guava是google团队开源的一款 JAVA 核心增强库,包含集合、并发、缓存、IO、反射等工具箱性能和稳定性上都有保障应用十分广泛 。
Guava Cache支持很多特性:
  • 支持最大容量限制 。
  • 支持两种过期删除策略插入时间和访问时间 。
  • 支持简单的统计功能 。
  • 基于LRU算法实现 。
2、基于Caffeine实现本地缓存Caffeine是基于java8实现的新一代缓存工具,缓存性能接近理论最优,可以看作是Guava Cache的增强版,功能上两者类似 。
不同的是Caffeine采用了一种结合LRU、LFU优点的算法W-TinyLFU在性能上有明显的优越性 。


推荐阅读