写点什么

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

  • 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:324571
用户头像

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

关注

评论

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

成熟的知识管理,应具备哪些条件?

小炮

java培训 | Java设计模式之装饰者设计模式

@零度

JAVA开发

NodeJS 防止xss攻击

德育处主任

Node 6月月更

5 个关于 NFT 的技术漏洞

devpoint

区块链 以太坊 NFT 6月月更

DevEco Device Tool 助力OpenHarmony设备开发

OpenHarmony开发者

OpenHarmony

并购增资或将有望启动东软越通新动能?

E科讯

【云舟说直播间】-数字安全专场明天下午正式上线

云计算

开发增效利器—2022年VsCode插件分享

中原银行

ide vscode 插件 中原银行 降本增效

攻防演练合集 | 3个阶段,4大要点,蓝队防守全流程纲要解读

青藤云安全

网络安全 网络攻防 安全服务 攻防演练

不止于观测|阿里云可观测套件正式发布

阿里巴巴云原生

阿里云 云原生 可观测 套件

如何使用 Django Forms 创建表单?

海拥(haiyong.site)

Python django 6月月更

Vone新闻 | 旺链科技赋能众享链网自组织管理,打造企业级联盟DAO

旺链科技

区块链 产业区块链 DAO 自组织协作

使用Mycat进行MySQL单库分表

迷彩

架构 运维 mycat 分布式数据库中间件 6月月更

quarkus+saas多租户动态数据源切换实现简单完美

weir威尔

SaaS 多租户 Quarkus 动态数据源

消息队列的丢失、重复与积压问题

Damon

6月月更

《Java编程思想》作者Bruce Eckel新作,到底做了哪些升级?

图灵教育

Java

java程序员培训 | Java设计模式之桥接模式

@零度

设计模式 JAVA开发

想学习eTS开发?教你开发一款IQ-EQ测试应用

HarmonyOS开发者

HarmonyOS

得物多活架构设计之路由服务设计

得物技术

架构 高可用 架构设计 双活 路由

实战监听Eureka client的缓存更新

程序员欣宸

Java SpringCloud 6月月更

Angular 服务器端渲染应用一个常见的内存泄漏问题

汪子熙

typescript 前端开发 angular Spartacus 6月月更

大数据培训 | Flink如何监控恶意登录

@零度

大数据

Linux开发_摄像头编程(实现拍照、网页监控功能)

DS小龙哥

6月月更

Rancher 2.6 全新 Monitoring 快速入门

Rancher

Kubernetes k8s rancher

“芯”有灵“蜥”,万人在线!龙蜥社区走进 Intel MeetUp 精彩回顾

OpenAnolis小助手

开源 直播 Meetup 龙蜥社区 走进 Intel

如何用 Redis 实现一个分布式锁

Ayue、

redis 分布式锁

直播带货app源码搭建中,直播CDN的原理是什么?

开源直播系统源码

软件开发 直播带货 直播系统 app源码

坚持五件事,带你走出迷茫困境!

博文视点Broadview

运行时应用自我保护(RASP):应用安全的自我修养

SEAL安全

RASP

大一学生课设c——服装管理系统

工程师日月

6月月更

Kafka ETL 之后,我们将如何定义新一代实时数据集成解决方案?

tapdata

kafka ETL 数据集成 实时数据 DaaS

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