梁老师小课堂|谈谈本地缓存

88e304219c346871cc5eb3eb7db49fbd.jpeg

本地缓存指的是单机实例的JVM内存数据。多个实例共享着同一个分布式缓存,组成了多级缓存架构。这种多级缓存的特点是,最外层读取速度快但是空间小,越内层速度慢但是空间大,甚至最最内层还可以使用磁盘作为最后一道保障。

那为什么要使用本地缓存呢?

这是根据时间局部性和空间局部性进行设计的一种方案。原理说的是,刚刚被访问的数据很有可能在不久的将来成为热点数据,如果能在离用户近离后端存储远的地方直接取出这些数据,用户请求响应会更快,也不会对后端存储造成太大压力,两全其美。

存储热点数据是本地缓存的一种场景,有时还会用来应对缓存穿透,甚至还会保留上游接口结果作为容灾数据。这里说的缓存穿透,指的是大批量数据在分布式缓存中没有,数据库也没有,这样本地缓存得存储一个空值来减轻数据库的压力。不管怎么用,我们不能存储大量的本地缓存,否则单机实例容易发生内存溢出。也就意味着本地缓存命中率是重点指标,命中率不高的话就白折腾了。

既然本地缓存空间有限,只好及时置换,把最近不常访问的数据给删掉,腾出空间给真正有意义的数据。我们可以通过链表来达到这个目的,最近访问过或者更新过的数据就放到链表头部,那么尾部就是可以删除的数据。

不过,这种算法有缺陷,容易对热点数据造成污染。一个数据被访问一次后,有可能就被打入冷宫了,给予头部这种地位过于乐观了。所以我们得优化下,可以改进成分段式的,新访问或者新更新过的数据放到中间,而不是头部。

缓存置换策略,除了优化后的最近不常访问算法,还可以结合其他算法。不难发现,有些缓存数据是空值的,有些是短暂存活的。那么我们是不是可以优先置换这些空值和快要过期的数据呢?比如,维护一个空值队列和快要过期数据的队列,当需要置换时就优先从他们当中选择。这个技巧正是Redis缓存所使用的过期策略之一,它使用一个独立的字典保存设置了过期时间的key,定期部分扫描然后删除到期的数据。

讲了两个关于本地缓存的置换算法,其实都是在讨论一个点,就是如何提高缓存命中率,让本地缓存发挥出其功效。想要其功效最大化,还得要留意一些关键指标,进行巡检和灵魂拷问,比如能存储多大的量、过期时间是多少、命中率怎么样、是否可以及时对热点数据进行预热等等。

以上就是今天的全部内容,我带你简单回顾一下吧。我首先介绍了什么是本地缓存,接着介绍了本地缓存的原理和作用,本地缓存的关键其实是如何提高命中率,也就是尽量存储有价值数据,剔除无效数据,对此我给出了两个置换算法,最后还补充了一些使用上的巡检建议。希望本文能帮助到你,下期见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值