你真的了解缓存吗?(1)

缓存技术对于作为技术同学来说,大家应该都很熟悉,无论是前端开发使用的客户端缓存,还是后端开发使用的各种缓存组件,如redis,memcached等,而且这些技术广泛应用在我们日常开发工作中。

虽然缓存经常使用,但是你有没有思考过:我们的系统真的需要使用缓存吗?这个问题很多老铁都有自己的答案。不过我还是想从另一个角度来讨论一下这个问题。

系统真的需要引入缓存吗

缓存和其他技术中间件一样,都是为了解决系统中某个场景下的某个问题或者某些问题,使用缓存可以有效的提升系统查询性能。但是,凡事都是双刃剑,有好处自然也会有不足。

为系统引入缓存可能会带来如下问题:

1.引入缓存会增加系统的复杂度,引入缓存后,缓存组件的可用性会影响到系统整体的可用性,除此之外,对于缓存中数据的有效期,数据更新,缓存数据和被缓存数据源中数据的一致性等一系列问题,都会因为引入缓存而产生。

2.缓存作为被缓存数据源的"代理",会处理被缓存数据源的请求,那么当被缓存数据源出现异常时,由于缓存这个代理的存在,我们可能无法及时发现,异常问题的排查也变得更加困难。

其实上述问题,本身都是和业务无关的,由于缓存的引入,需要我们在业务层面去感知并做相应的容错处理。

说了这么多,并不是建议大家不要用缓存,而是想告诉大家在引入缓存前,一定要想清楚,当前的系统是否真的有必要引入缓存。

缓存到底是为了解决什么问题

虽然是用缓存会给业务系统带来以上问题,但是在一些场景下,缓存给系统带来的收益会大于引入的复杂度,这也是缓存广泛使用的原因。

缓存带来的收益在作者看来,主要有两个:

1.缓解cpu压力

对于一些需要耗费大量cpu资源计算的结果数据,可以使用缓存组件进行存储,当再次请求时,只需要从缓存中读取即可,极大的节省了cpu的算力。

2.缓解io压力

对于一些更加耗费io资源的数据,比如:网络,磁盘等比较慢的介质中的数据,可以将这些数据存储到内存缓存等比较快的介质中,可以提升数据访问的响应性能。

有经验的老铁可能会发现,上面所说的两个收益都是用空间换时间的使用场景,这也是为什么我们使用缓存会提升性能的原因。

选择一款缓存组件时,应该注意什么

了解了引入缓存可能带来的问题,以及缓存给系统带来的收益,如果综合评估下来,业务系统的确需要引入缓存,那么在选择一款缓存组件时,我们应该关注什么呢?作者这里总结了如下四点:

吞吐量

目前常用的衡量吞吐量的指标是OPS(Operations pre Second)值,也就是每秒的操作数,主要用来衡量缓存在并发环境下的读写性能,也就是缓存本身的工作效率。

吞吐量反映了一个缓存组件的技术水平,我们都知道,在并发环境下,为了保证数据的准确性,我们需要对被共享的数据添加"安全措施",比如常用的保证线程安全的手段:加锁。但是锁又会限制并发处理。所以,如何在保证线程安全的情况下,又要让并发处理性能很高,的确对技术要求比较高。

命中率

缓存的命中率即成功从缓存中返回结果次数与总请求次数的比值,它反映了引入缓存的价值高低,命中率越低,引入缓存的收益越小,价值越低。

缓存的命中率通常和淘汰策略有关,因为有限的存储空间,决定了任何缓存的容量都不可能是无限的,所以缓存需要在消耗空间与节约时间之间取得平衡,这就要求缓存必须能够自动、或者由人工淘汰掉缓存中的低价值数据。

一个不好的淘汰策略会直接影响缓存的命中率,举一个极端的例子:你每次访问的数据都是刚刚过期,那么缓存中的数据就都是低价值数据,这样的话,使用的缓存的价值就比较低。

缓存常用的淘汰策略有以下几种:

FIFO(First In First Out)

即优先淘汰最早进入被缓存的数据。FIFO 的实现十分简单,但一般来说,它并不是优秀的淘汰策略,因为越是频繁被用到的数据,往往越会早早地被存入缓存之中。所以如果采用这种淘汰策略,很可能会大幅降低缓存的命中率。

LRU(Least Recent Used)

即优先淘汰最久未被使用访问过的数据。LRU 通常会采用 HashMap 加 LinkedList 的双重结构(如 LinkedHashMap)来实现。也就是,它以 HashMap 来提供访问接口,保证常量时间复杂度的读取性能;以 LinkedList 的链表元素顺序来表示数据的时间顺序,在每次缓存命中时,把返回对象调整到 LinkedList 开头,每次缓存淘汰时从链表末端开始清理数据。

LFU(Least Frequently Used)

即优先淘汰最不经常使用的数据。LFU 会给每个数据添加一个访问计数器,每访问一次就加 1,当需要淘汰数据的时候,就清理计数器数值最小的那批数据。

扩展功能

缓存除了基本读写功能外,还提供了一些额外的管理功能,比如最大容量、失效时间、失效事件、命中率统计,等等

分布式支持

缓存可以分为“进程内缓存”和“分布式缓存”两大类,前者只为节点本身提供服务,无网络访问操作,速度快但缓存的数据不能在各个服务节点中共享。后者则相反。

总结

以上介绍了引入缓存带来的复杂度和收益,以及选择一款缓存组件时,需要关注的缓存属性。在下一篇文章中,我们会介绍在大数据量情况下分布式缓存的使用和使用过程中的注意事项,欢迎持续关注。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值