转载请注明出处哈:http://carlosfu.iteye.com/blog/2269678
一、缓存的成本和收益是什么:
既然要讨论是否真的需要缓存这个问题,就要知道缓存带来的成本与收益(好处、坏处)是什么?
收益 | 成本 | |
缓存 + 后端存储(资源) |
1. 加速读写 2. 降低后端负载 |
1. 数据不一致性 2. 代码维护成本 3. 架构复杂度
|
上面的表格应该清楚的表达了使用缓存后的收益和成本分别是什么。下面将进行详细的解析
二、缓存成本与收益详解:
1. 收益是很明显的,通常来说一个设计还不错的缓存系统,能够帮助你的业务实现加速读写,同时帮助降低了后端负载。
(1) 加速读写:通常来说加速是明显的,因为缓存通常都是全内存的系统,而后端(可能是mysql、甚至是别人的HTTP, RPC接口)都有速度慢和抗压能力差的特性,通过缓存的使用可以有效的提高用户的访问速度同时优化了用户的体验。
(2) 降低后端负载:通过缓存的添加,如果程序没有什么问题,在命中率还可以的情况下,可以帮助后端减少访问量和复杂计算(join、或者无法在优化的sql等),在很大程度降低了后端的负载。
2. 成本:
(1) 数据不一致性:无论你的设计做的多么好,缓存数据与权威数据源(可以理解成真实或者后端数据源)一定存在着一定时间窗口的数据不一致性,这个时间窗口的大小可大可小,具体多大还要看一下你的业务允许多大时间窗口的不一致性。
(2) 代码维护成本:加入缓存后,代码就会在原数据源基础上加入缓存的相关代码,例如原来只是一些sql, 现在要加入k-v缓存,必然增加了代码的维护成本。
(3) 架构复杂度:加入缓存后,例如加入了redis-cluster,一般来说缓存不会像Mysql有专门的DBA,很有可能没有专职的管理人员,所以也增加了架构的复杂度和维护成本。
三、如何选择?
如果当前系统的访问速度和访问量能够满足现有的要求,就不必增加缓存,其实像mysql并没有那么差,一台运行良好的Mysql,扛个QPS=1000没什么问题。
如果要加入选择了缓存,一定要能给出足够的理由,不是为了简单的show技术和想当然,最好的方法就是用数据说话:加速比有多少、后端负载降低了多少。
四、什么样的场景需要缓存?
在公司里,据我观察,无论怎么更新架构,使用各种新技术,但是80%的项目还是离不开SQL的,下面我们以SQL作为后端数据源、以Redis作为缓存层,说一下哪些场景是需要缓存的。
1、复杂开销大的计算、降低后端负载
以Mysql为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加
缓存,大量流量将在这些复杂计算的执行。
2. 加速请求响应
即使单条后端数据足够快(例如select * from table where id=?),那么依然可以利用redis/memcache将这些操作进行merge做优化(例如:cache(select * from table where id in(id1,id10....idK))),从而优化整个IO链的相应时间。
附图一张:
相关推荐
本篇文章将深入探讨MySQL Connector/J 8.0.22及其在Java开发中的应用。 首先,MySQL Connector/J是MySQL官方提供的开源JDBC驱动,它完全符合JDBC 4.2规范,支持Java 8及更高版本。这个版本8.0.22包含了针对MySQL ...
本篇文章将深入探讨`hibernate-distribution-3.6.6.Final.tar.gz`压缩包中的内容,帮助读者理解其核心概念、主要功能以及使用方法。 首先,让我们来看看`hibernate-distribution-3.6.6.Final.tar.gz`这个文件名。`...
另一个文件"gradle-6.7.1-all-博客需要.zip"可能是博主为特定博客文章定制的,可能包含特定的构建脚本或项目示例,用于展示Gradle的某些特定功能或最佳实践。 Gradle 6.7.1的一些关键特性包括: 1. 性能优化:...
2. **会话接口**:Session是Hibernate的主要工作接口,用于执行CRUD(创建、读取、更新和删除)操作,同时提供事务管理和缓存管理功能。 3. **查询语言HQL**:Hibernate Query Language(HQL)是一种面向对象的查询...
MySQL 5.7.36是该系列的一个重要版本,提供了许多性能优化、安全性增强和功能改进。在本篇文章中,我们将深入探讨MySQL 5.7.36的安装过程以及相关的重要知识点。 首先,我们来看"mysql-5.7.36-1.el7.x86_64.rpm-...
本篇文章将深入探讨Hibernate 4.3.5.Final这一稳定最终版本的关键特性、改进以及其在实际项目中的应用。 一、Hibernate 4.3.5.Final概述 Hibernate 4.3.5.Final是Hibernate ORM框架的一个重要版本,它在前一版本的...
文章中提及的面试者programmerone对缓存的理解非常浅显,仅限于知道使用hashtable实现简单的缓存机制,而没有深入了解缓存的工作原理、缓存算法的选择标准和缓存框架的使用。面试官提出的问题主要集中在缓存的基本...
本篇文章将深入探讨Gradle 5.1.1版本在Android构建中的关键特性和应用。 Gradle是一个基于Apache Ant和Maven概念的项目自动化构建工具,以其灵活的插件系统和强大的Groovy语法而受到广泛欢迎。Gradle 5.1.1是Gradle...
在本篇文章中,我们将深入探讨"aspectwerkz-extensions-2.0.jar.zip"这一特定版本的扩展库,以及它所包含的核心组件——"aspectwerkz-extensions-2.0.jar"。 首先,让我们理解"aspectwerkz-extensions-2.0.jar"的...
本篇文章将围绕"Ardor3D-core-0.7.jar.zip"这一核心库进行详细讲解。 Ardor3D的核心库"ardor3d-core-0.7.jar"包含了项目的基础组件和核心功能。这个版本号为0.7的库,是Ardor3D发展过程中的一个里程碑,它提供了一...
**Python库 django_tagulous-0.11.1-py2.py3-none-any.whl** 在Python开发领域,Django Tagulous是一个强大的标签系统库,适用于Django框架。这个资源,"django_tagulous-0.11.1-py2.py3-none-any.whl",是一个预...
9. **性能优化**:缓存策略(如Redis或Memcached)、CDN(内容分发网络)使用、图片优化、懒加载等都是提高系统性能的关键技术。 10. **版本控制**:开发过程中,版本控制工具如Git必不可少,它帮助团队协作,记录...
本篇文章将深入探讨WordPress 5.4这一版本,旨在为用户提供全面而详细的知识点解析,帮助你更好地理解和运用这一官方原版的软件。 1. **WordPress 5.4 版本概述** WordPress 5.4,代号“Adderley”,是WordPress...
通过分析返回的结果,你可以决定是否需要清除部分缓存以释放内存,或者保持现状以利用缓存带来的性能提升。 除了fincore,util-linux还包含许多其他实用工具,每个都有其独特的功能。例如,mkfs系列工具用于创建...
2. **强大的内容管理**:它允许用户轻松创建、编辑和管理文章、页面和多媒体内容。 3. **用户管理**:内置的用户注册、权限管理和登录功能,支持不同角色的访问控制。 4. **模板系统**:提供多种预设模板,也可...
本篇文章将深入探讨如何使用Gradle来构建针对Spring 2.x版本的项目,并指导如何进行本地调试,同时分析给定压缩包中不同Gradle版本的选择。 1. **Gradle简介**:Gradle是一种基于Groovy语言的构建自动化工具,它...
【标题】中的“管理系统系列--基于node.js开发的一套CMS后台管理系统”揭示了这是一个使用Node.js编程语言构建的内容管理系统(CMS)的后端部分。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,以其异步、非...
本篇文章将详细介绍如何在Java环境中,利用"geoip2-2.15.0-with-dependencies.zip"这个离线依赖包,来读取并解析GeoLite2-City.mmdb数据库,从而获取全球IP的地理信息。 首先,我们需要了解GeoIP2库。GeoIP2是由...
**Python库uproot_methods-0.2.3-py2.py3-none-any.whl详解** 在Python编程领域,库是开发者的重要工具,它们提供了一系列预定义的函数和类,简化了复杂的任务处理。本篇文章将深入探讨名为"uproot_methods"的...
此阶段可能涉及到API Level的选择,因为2011年的安卓系统版本可能还是Android 2.x系列。 - **编程语言**:主要使用Java进行开发,这是当时安卓官方推荐的语言。Kotlin虽在后来逐渐流行,但在2011年尚未被广泛采用。...