走进缓存的世界(一) - 开篇

系列文章

  • 走进缓存的世界(一) - 开篇
  • 走进缓存的世界(二) - 缓存设计
  • 走进缓存的世界(三) - Memcache

 

概述

对于程序员来说多多少少都懂一点算法,算法是什么?算法是“时间”与“空间”的互换策略。

我们常常研究一个算法的时间复杂度和空间复杂度,如果我们有绝对足够的时间和空间,那么算法就不需要了,可惜这种条件是不存在的,只是在某些情况下我们会协调两者从而达到性能上的平衡。

缓存是一种“用空间换时间”的策略,通俗的讲,缓存就是把一些数据暂时存储起来,避免了某些重复的耗时操作,减少时间开销的一种方法。

商业世界中常说的一句话是“现金为王”。在技术世界里,与之相近的一个说法是“缓存为王”。

从底层到上层主要涉及:数据库模型设计,SQL优化,使用缓存等。从图中的优化模式来看,其中数据库模型设计的合理程度奠定了应用系统优化的基石,如果模型设计得不合理,随着业务发展,后续的优化将会变得很困难。另一方SQL优化也是数据库优化的一个重要方面,慢SQL和top SQL往往是系统性能杀手,它们是导致系统故障的重要潜在危险。

缓存在构建高性能服务器中有着举足轻重的作用,很多时候sql优化, 算法优化所带来的效果可能远远不如缓存带来的优化效果。但是缓存的使用并不是零成本的,任何缓存的增加,都会带来两大问题:

  • 数据不一致
  • 系统复杂度大幅度增加

如何解决呢?首先考虑去掉缓存。不要为了缓存而缓存,缓存不必要时,应该果断去掉,从而降低系统出错的可能性和系统复杂度。有些对数据实时性,准确性要求极高的系统,不能使用缓存。其次是分析需求,不同的业务会有不同的缓存策略,仔细分析变化与不变的数据,将不变的数据长时间缓存,变化的数据根据数据的业务要求动态调整缓存时间和存储方式。最后就是增加开发人员自身的能力,后面会详细提及各种问题的处理方法。

什么样的缓存才是好缓存

什么样的员工是好员工?最直接最本质的回答:能办事、且办事靠谱就是好员工,答案并不是聪明、勤奋、社交好等等,这些只是成为一个靠谱员工的充要条件。

什么样的缓存才是好缓存呢?答案是:命中率高的缓存。

在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上一般会小很多,缓存数量比命中率低的缓存数量也少很多,寻址速度肯定也比较快,所以命中率高的缓存是好缓存。

缓存的设计需要考虑缓存的占用空间和命中率。我们当然希望缓存占用空间小,命中率高。命中率高是缓存设计的重要考察因素, 是提高系统性能的关键。占用空间越小,需要的成本越低。低成本,高效能的缓存设计是我们追求的目标。这没有固定的设计方法和公式,需要根据不同的业务灵活调整,但是,关于缓存在业务开发中的设计方法,有一些比较常用的思路与模式,借鉴这些模式,我们可以复用或创新,解决新的业务中所出现的问题。

缓存的命中率

一个实体丢到缓存中后,在被缓存期间,如果一次都没有使用过,这个缓存实体的命中率就是0。这个实体被请求的次数越多,缓存命中率越高。

上面说的是缓存中一个实体的命中率。对于缓存整体来说,命中率=命中数/总查找数。

对于缓存来说:通常最常使用的个体占总体的很小一部分,最不常使用的占整体的很大一部分.。

所以我们经常会看到类似这样的数据:

缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。

现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。

但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要而且是必须的。

如何提高缓存命中率

纯技术的角度来说,我们只有记录了用户单位时间的请求数,并依照它来把最常使用的数据缓存起来,从而提高缓存命中率。

但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天也就几次访问,不应该缓存到内存中。

我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。

一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。

要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,绝大多数访问压力是搜索引擎导入的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了,这种缓存方法,命中率会非常低。

说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点:

  • 小型网站可以全部缓存,压力也不会很大,可以忽略缓存命中率问题
  • 大型服务无法全部缓存,时候就需要架构师设计出对该业务逻辑适用的缓存方法,尽可能提高缓存命中率
  • 提高命中率的方法大多是跟业务逻辑捆绑的,需要跟具体问题具体分析
  • 对于不能被内存缓存的数据,最简单的提高性能方法就是使用文件缓存
  • 文件缓存可以整个内容缓存成一个静态文件,也可以是整个页面的一个区域被缓存成一个文件,也可以是把一个实体序列化成XML文件进行缓存

过期策略

缓存是临时的存储,所以缓存的生命周期是有限的。它依次可能会经历如下活动:

  • 进入缓存
  • 正常使用期
  • 更新缓存
  • 离开缓存

最常见的几种过期策略如下:

多长时间没有被请求,则过期,最典型的就是ASP的Section 功能。

依赖于文件变更的缓存,一旦文件被修改,则过期,典型的是WEB站点的Web.config,一旦这个文件变更,不但缓存重起,IIS进程也会进行一次释放工作。

在此基础上,引申出很多依赖关系的缓存过期策略,比如依赖于数据库的缓存过期策略。

当然,业务逻辑里可能会有更复杂的过期策略,比如CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

an 转换器_400V耐压场效应管替代IRF730B型号参数,使用在DC-DC电源转换器。_场效应管吧...

DC-DC电源转化器的应用场景逐渐广泛,那么适用于DC-DC电源模块的场效应管需求也随之越来越高,这时候电源转化器厂的电子工程师就要留意了,国内是否有优质的场效应管能替代IRF730B型号呢,其实是有的,FHP840其实是可以跟I…

spring MVC中页面添加锚点

2019独角兽企业重金招聘Python工程师标准>>> 需要添加锚点的代码&#xff1a; <li><a href"main/index#page1">推荐车型</a></li> <li><a href"main/index#page2">热门车型</a></li>需要跳转的…

steam一键授权工具_半个东的时间让你省了一个亿 Steam免费游戏一键领取

总所周知Steam上有很多的免费游戏&#xff0c;但是有哪些游戏是免费的呢&#xff1f;这个一时半会儿也总结不出来&#xff0c;而且还得需要大量的时间添加到自己的游戏库&#xff0c;今天这个教程就教大家如何一键添加Steam上大量免费游戏&#xff0c;需要的小伙伴赶紧收藏哦。…

YModem协议

源&#xff1a;YModem协议 YModem协议&#xff1a; YModem协议是由XModem协议演变而来的&#xff0c;每包数据可以达到1024字节&#xff0c;是一个非常高效的文件传输协议。 下面先看下YModem协议传输的完整的握手过程&#xff1a;先看下图 SENDER:发送方。 RECEIVER:接收方。 …

gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习

说明 编译器是翻译代码为计算机语言的一个工具&#xff0c;我们平时写的代码如果想在某个特定的计算机上执行&#xff08;计算机的cpu构架不同&#xff09;&#xff0c;就需要编译器来对代码进行编译汇编链接&#xff0c;而汇编和链接的过程对于每个不同的平台上过程都不一样。…

视觉在无人驾驶中的应用及分类_机器视觉在智能化生产中的广泛应用

什么是机器视觉&#xff1f;顾名思义&#xff0c;简单来说&#xff0c;机器视觉就是用机器代替人眼来测量和判断。机器视觉系统是指通过机器视觉产品将被摄取目标转换成图像信号&#xff0c;传送给专用的图像处理系统&#xff0c;根据像素分布和亮度、颜色等信息&#xff0c;转…

Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程。在该例程序中&#xff0c;使用"Ctrlc"结束通信后&#xff0c;服务器是无法立即重启的&#xff0c;如果尝试重启服务器&#xff0c;将被告知&#xff1a; bind: Address already in use 原因在…

work2的code和问题

//常量 package cn.itcast.work2; public class Constant { //constant 常量   public static void main(String[] args) { /* * 字符串常量 用双引号括起来的内容 * 整数常量 所有整数 * 小数常量 所有小数 * 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单…

Linux-(C/C++)生成并使用静态库/动态库

静态库/动态库概要 在Windows下静态库的后缀为&#xff1a;.lib、动态库后缀为&#xff1a;.dll&#xff1b;而在Linux下静态库的后缀为&#xff1a;.a、动态库的后缀为&#xff1a;.so。 那么什么是静态库呢&#xff1f; 首先我们来看看程序编译的大体流程&#xff1a;预处理…

windows下最好的围棋_学围棋能使学习成绩提高吗?

孩子几岁开始学习围棋最合适&#xff1f;当然要4岁开始学围棋。一是因为&#xff1a;4岁是幼儿形状知觉形成的关键期&#xff0c;围棋千变万化的棋形(见文后图)是最有利于促进与锻炼孩子形状知觉的形成。二是因为&#xff1a;人的大脑在3周岁后基本已经发育了60%&#xff0c;到…

C#与C/C++的交互zz

C#与C交互&#xff0c;总体来说可以有两种方法&#xff1a; 利用C/CLI作为代理中间层 利用PInvoke实现直接调用 第一种方法&#xff1a;实现起来比较简单直观&#xff0c;并且可以实现C#调用C所写的类&#xff0c;但是问题是MONO构架不支持C/CLI功能&#xff0c;因此无法实现脱…

curl查看swift状态命令_HTTP 请求与响应包括哪些,如何用Chrome查看 HTTP 请求与响应内容和curl 命令的使用...

1.HTTP的请求和响应其实就是通过电脑上的软件来进行的&#xff0c;客户端请求的内容发送到服务器上&#xff0c;服务器收到请求后就会响应客户端的请求&#xff0c;如图&#xff1a;HTTP请求的内容及格式&#xff1a;请求最多包含四部分&#xff0c;最少包含三部分。&#xff0…

Pytorch的BatchNorm层使用中容易出现的问题

前言 本文主要介绍在pytorch中的Batch Normalization的使用以及在其中容易出现的各种小问题&#xff0c;本来此文应该归属于[1]中的&#xff0c;但是考虑到此文的篇幅可能会比较大&#xff0c;因此独立成篇&#xff0c;希望能够帮助到各位读者。如有谬误&#xff0c;请联系指出…

android 比较靠谱的图片压缩

2019独角兽企业重金招聘Python工程师标准>>> 第一&#xff1a;我们先看下质量压缩方法&#xff1a; private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, …

常用公差配合表图_ER弹簧夹头配套BT刀柄常用规格型号表

ER弹簧夹头具有定心精度高&#xff0c;夹紧力均匀的特点&#xff0c;广泛用于机械类零件的精加工和半精加工&#xff0c;通常与BT刀柄匹配使用。BT刀柄是是机械主轴与刀具和其它附件工具连接件&#xff0c;BT为日本标准(MAS403)&#xff0c;现在也是普遍使用的一种标准。传统刀…

Linux下python安装升级详细步骤 | Python2 升级 Python3

Linux下python升级步骤 Python2 ->Python3 多数情况下&#xff0c;系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是&#xff0c;现在多数情况下建议使用3.x 那么如何升级呢&#xff1f; 下面老徐详细讲解升级步骤&#xff1b; 首先下载源tar包 可利用linux自带下…

华为手机连电脑_手机、电脑无网高速互传!华为神技逆天

Huawei Share是华为的一项自研多终端传输技术&#xff0c;可以在没有网络状态下实现手机与手机、电脑等多终端设备间快速稳定的文件分享&#xff0c;尤其是在办公场景下&#xff0c;可以极大提升办公效率。华为表示&#xff0c;未来Huawei Share将应用于更多全场景跨设备无缝分…

excel统计行数_值得收藏的6个Excel函数公式(有讲解)

收藏的Excel函数大全公式再多&#xff0c;几天不用也会忘记。怎么才能不忘&#xff1f;你需要了解公式的运行原理。小编今天不再推送一大堆函数公式&#xff0c;而是根据提问最多的问题&#xff0c;精选出6个实用的&#xff0c;然后详细的解释给大家。1、计算两个时间差TEXT(B2…

Studio One正版多少钱 Studio One正版怎么购买

随着版权意识的增强&#xff0c;打击盗版的力度越来越大&#xff0c;现在网络上的盗版资源越来越少&#xff0c;资源少很难找是一方面&#xff0c;另一方面使用盗版软件不仅很多功能不能使用&#xff0c;而且很多盗版软件都被植入各种木马病毒&#xff0c;从而带来各种各样的风…

DNS简述

常见DNS记录SOA&#xff1a;域权威开始NS&#xff1a;权威域名服务器A&#xff1a;主机地址CNAME&#xff1a;别名对应的正规名称MX&#xff1a;邮件传递服务器PTR&#xff1a;域名指针 (用于反向 DNS)查询过程浏览器缓存->hosts->LDNS->LDNS缓存->ISP->ISP缓存…