【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

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

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

关注

评论

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

架构训练营模块一作业

Lemon

架构训练营

研发管理和项目管理有哪些痛点?

万事ONES

研发管理 ONES 项目管理工具

如何用EasyRecovery 快速找回误删的截图

淋雨

EasyRecovery 文件恢复 硬盘数据恢复 固态硬盘数据恢复

DGTT挖矿智能合约系统软件开发案例

萌宠大陆APP开发|萌宠大陆系统软件开发

小马哥的Java项目训练营-毕业总结

姑射仙人

多媒体技术(一)之图形图像

轻口味

android 音视频 计算机图形学 图形图像处理

大数据成神之路面试合集&资源开放下载

王知无

大数据 面试

【Flutter 专题】93 图解 Dart 单线程实现异步处理之 Isolate (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

打造中国数字军人 数军科技携黑科技亮相军博会

科技热闻

基于Erlang语言的视频相似推荐(三十一)

数据与智能

erlang 实时计算 推荐系统

Rust从0到1-智能指针-Deref trait

rust 智能指针 smart pointer deref

无意中发现一个好用的前后端代码生成网

江湖一点雨

mybatis java代码 自动生成 vue自动生成 sql转实体

不藏了,这些Java反射用法总结都告诉你们

华为云开发者联盟

Java JVM 反射 java框架 MyBase

HVC矿机系统开发|HVC矿机软件APP开发

FIL挖矿怎么样?FIL挖矿靠谱吗?

高级码农设计的程序能解耦,是多么重要的一件事情!

小傅哥

spring 设计模式 小傅哥 观察者模式 系统解耦

TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

小林coding

计算机网络 HTTP TCP/IP

DolphinDB插件开发深度解析

DolphinDB

数据库 大数据 时序数据库 插件开发 DolphinDB

云图说|华为HiLens云上管理平台,花样管理多种端侧设备

华为云开发者联盟

AI 华为云 云图说 华为HiLens EI智能体

Vchat挖矿软件开发|Vchat挖矿系统APP开发

Redisson 分布式锁源码 06:公平锁排队加锁

程序员小航

Java redis 分布式锁 redisson

我给我讲GIT,并成功把我得罪了

加百利

git 7月日更

Pandas高级教程之:统计方法

程序那些事

Python 数据分析 pandas 程序那些事

【LeetCode】和相同的二元子数组Java题解

Albert

算法 LeetCode 7月日更

《大数据大创新:阿里巴巴云上数据中台之道》:解密阿里数据中台建设

云祁

大数据 读书笔记 数据中台 7月日更

Swarm节点系统开发|Swarm节点APP软件开发

计算机时间到底是怎么来的?程序员必看的时间知识!

Kaito

操作系统 计算机基础 时间 ntp

领哆哆APP开发|领哆哆软件系统开发

互联网公司的「敏捷开发」流程是怎么样的?每个职位的角色和分工是什么?

万事ONES

union 分页/group/join 复杂查询(.net core/framework)

Spook

sql ORM

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