写点什么

十个常见的缓存使用误区及建议

  • 2014-09-09
  • 本文字数:1374 字

    阅读完需:约 5 分钟

Omar Al Zabir 的《Ten Caching Mistakes that Break your App》这篇文章已经发表好多年了,但是它仍然指导着大家如何合理、高效的使用缓存。在日常工作中,开发者经常利用缓存来优化站点或应用程序,然而在实际应用中,大家使用缓存时,总会存在或多或少的误区,反而影响了站点或应用程序的正常运行。近日, highscalability 上的一篇文章总结了十大使用缓存的误区和建议

现就对这十大缓存误区以及使用建议进行一个全面的梳理:

1、依赖默认的序列化方式

使用默认的序列化处理方式可能会消耗大量的 CPU 资源,尤其是处理复杂类型数据时。所以建议大家一定要根据所使用语言和环境的情况,采用最合理、有效的序列化和反序列化方式。

2、在单一缓存中存储大对象数据

由于序列化和反序列化需要一定的资源开销,当处于高并发高负载的情况下,对大对象数据的频繁读取有可能会使得服务器的 CPU 崩溃,所以建议大家把大对象数据分成为较小的子对象,然后再各自进行缓存。

3、在不同线程间使用缓存共享对象

在竞态条件 (Race conditions) 条件下,当写线程对缓存进行写入操作时,如果这是读线程刚好也要访问同一缓冲对象,就有可能读取脏数据,所以在实际开发中要根据实际情况采取外部锁机制,以保证缓存数据的正确读写。

4、认为存储数据操作后,数据即刻就能存储到缓存中

刚进行写入缓存操作的数据并不一定能够马上写入缓存,这是因为当缓存空间不足时,刚写入的缓存有可能被刷新掉。所以在编写程序时,应该首先对获得缓存的值作空值检测。

5、使用嵌套对象存储整个集合

如果将整个集合对象数据进行嵌套缓存的话,获得其中某个具体元素的性能将会严重受到影响,这是因为整个集合存储意味着对整个嵌套对象进行序列化。有鉴于此,建议单独对每个元素进行缓存,这样就可以做到对每个对象分别更新和读取,以减少序列化的影响。

6、对父子对象采取统一与单独混用的存储方式

有时候一个对象可能拥有两个或更多的父对象,同一对象存储在不同地方,这样就会造成缓存的浪费。为了不让同一对象存储于不同地方,这就需要根据统一对象本身的键进行缓存,这样父对象就能够根据需要访问子对象。

7、对配置信息进行缓存

缓存数据的访问是有代价的,所以要尽可能把影响减到最低,所以建议使用本地静态变量代替缓存对配置数据进行存储。

8、对实时对象进行缓存

如果对实时对象(例如:流、文件、注册信息或者网络情况)的引用进行缓存的话,当缓存数据被删除后,之前缓存的实时对象不被删除,这样会造成系统资源泄漏,所以不要对实时对象进行存储。

9、使用多个键存储同一对象

尽管使用多个键存储同一对象就使得使用一个键和索引号来进行访问时带来便利,但是当缓存是基于远程缓存的话,任何关于对象改变都是不可见的,这样会导致缓存数据同步问题的发生,所以不建议使用多个键存储同一对象。

10、在连续存储中进行更新或删除后不及时更新相应缓存对象

由于在一个远程缓存中,数据以拷贝方式存储,所以当更新对象时,缓存不会被同步更新。所以更新对象时,缓存必须被明确地进行更新。然而在基于内存的缓存中,当删除一个对象时,在缓存中不会被同步删除,所以建议通过程序确保缓存对象被正确删除。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-09-09 07:324583
用户头像

发布了 92 篇内容, 共 46.4 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

盐城销量比赛 -- YR Tech团队比赛攻略

阿里云天池

被怼了:acks=all消息也会丢失?

王磊

Java

OpenAI 重大人事变动,联创加入死敌;阿里视频框架 Tora 操控物体运动轨迹丨 RTE 开发者日报

声网

从0到1学会Jetty内存马注入

我再BUG界嘎嘎乱杀

黑客 网络安全 jetty 网安 内存马

电商平台服务器 IP 地址遭受攻击?

网络安全服务

服务器 电商平台 DDoS IP地址 DDoS 攻击

工单触发器如何助力企业提升效率?天润融通案例解析

天润融通

人工智能 天润融通

汇聚行业实践,树立应用典范——《Serverless应用实践案例集》重磅发布

华为云PaaS服务小智

Serverless 华为云

ppt目录页怎么做?2款自动生成PPT目录的AI工具推荐!

彭宏豪95

效率工具 职场 PPT 办公软件 AI生成PPT

企业级敏捷框架:业务驱动型敏捷与产品需求团队

俞凡

团队管理 敏捷

国内差旅报销系统排名:2024年最主流7大选择

易成研发中心

项目管理 报销管理系统

探索 Amazon Q Developer 那些有趣的功能

亚马逊云科技 (Amazon Web Services)

如何在C++、PHP、GO中使用AI生成PPT API接口

幂简集成

API AI API

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

SelectDB

数据库 数据仓库 Doris 大数据 开源 实时分析

一文带你玩转全新采集配置 CRD:AliyunPipelineConfig

阿里巴巴云原生

阿里云 云原生 iLogtail

Omnissa Horizon 8 2406 (8.13) 发布下载 - 虚拟桌面基础架构 (VDI) 和应用软件

sysin

vSphere vmware esxi horizon

在项目中到底应不应该用jwt?

左诗右码

Go

1688商品详情API返回值:商品库存管理的智能化

技术冰糖葫芦

api 货币化 API 接口 API 文档 API 测试

人工智能助力芯片半导体发展,开拓芯片设计技术新趋势

Altair RapidMiner

人工智能 芯片 半导体 altair

《Linux/UNIX系统编程手册》PDF

程序员李木子

专业IT需求管理:2024年10大工具全指南

爱吃小舅的鱼

需求管理 软件需求管理 需求管理工具

深度解读KubeEdge架构设计与边缘AI实践探索

EquatorCoco

人工智能 边缘AI

OpenAI 收购 Rockset:大模型如何使用 OLAP 赋能实时洞察业务场景

腾讯云大数据

大模型 rag

如何在生成式AI里使用 Ray Data 进行大规模 RAG 应用的 Embedding Inference

Zilliz

人工智能 非结构化数据 向量数据库 LLM 大语言模型

69 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)

肖哥弹架构

spring springmvc springboot 注解

【每日涨知识】CPU中有没有对数指令?如何用程序去计算?

极客罗杰

TeleVis:基于 NLP 的新闻舆情可视化项目

阿里云天池

鸿蒙智行享界S9发布上市|小艺一语直达奢享空间

Geek_2d6073

Koupleless 可演进架构的设计与实践|当我们谈降本时,我们谈些什么

SOFAStack

开源 微服务 应用 架构治理 应用构建

Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解

SelectDB

数据库 数据仓库 OLAP Doris 分区策略

lastTab—Chrome 拓展开发实践

FunTester

网安科班精选!爱荷华大学教授的网络安全零基础入门教程!

我再BUG界嘎嘎乱杀

黑客 网络安全 信息安全 网络攻防 网安

十个常见的缓存使用误区及建议_语言 & 开发_李士窑_InfoQ精选文章