前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >梁老师小课堂|谈谈本地缓存

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

作者头像
公众号_松华说
发布2020-10-10 10:00:09
4490
发布2020-10-10 10:00:09
举报
文章被收录于专栏:松华说

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

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 松华说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档