前言
我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快。但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些?为什么现在看Redis要比Memcached更火一些?
这篇文章,我们就从各个方面来对比这两个内存数据库的差异,方便你在使用时,做出最符合业务需要的选择。
要分析它们的区别,主要从以下几个方面对比:
- 线程模型
- 数据结构
- 淘汰策略
- 管道与事物
- 持久化
- 高可用
- 集群化
用了5年的MacBook Pro 13寸,以零故障的记录光荣退役了。不得不说,前几年的MacBook品控做的是真好,整机非常耐用。
但后来的MacBook由于在硬件层面做了很多调整,之后的机器或多或少都出现过各种问题,身边的同事和朋友都遇到过一些,例如键盘故障、触控板问题,当然苹果售后也很给力,只要检查出故障就会马上换新,甚至连主板都直接换掉。
不过这次,我也终于入手了最新款的MacBook,更换的原因是因为之前的电脑性能实在跟不上了,常年在公司办公,已经变得越来越慢,Chrome打开的网页一多就能感觉到明显的卡顿情况。
这次入手的这款MacBook Pro是16寸的,配置为i9 CPU + 64G内存 + 1T固态硬盘 + 5300M独立显卡,除了硬盘和显卡之外,其他项选择的都是顶配。
有朋友觉得内存没必要选这么大的,我之前的13寸MacBook Pro只有8G内存,小的可怜,这次直接一步到位,再也不会受到内存瓶颈的影响。另外这台新电脑也计划准备陪我再战4-5年,选这个配置也足够为我未来工作和学习的变化提供足够的支撑。
拿到手里第一个感觉真的是:大!视觉冲击很棒!13寸的用了太久,这次尝试体验一下16寸的,新鲜感十足!
上篇文章讲了CPU在内存中读取数据时,为了提高读取速度,在中间增加了一层缓存,即高速缓存Cache。
这篇文章我们的角度下放,重点来看一下程序在运行过程中,内存是如何管理的。
计算机出现的早期,其工作内容比较简单,同一时间只做一个计算任务,然后输出结果。
但随着人类需求的提高,人们希望计算机能同时计算多个任务,提高计算机的使用率。逐渐地,多任务计算机出现,但要想同时运行多个任务,那各任务之间如何分配和使用计算机资源呢?
为了解决这个问题,人类发明出操作系统,所有的计算机资源交由操作系统统一管理,各程序需要使用资源要向操作系统提出申请,操作系统按照某种规则统一分配和管理,同时保证资源的合理分配。
内存是一段连续的地址空间,如果多个程序同时运行,对于内存的时候一不小心会不会侵入了别的程序,导致运行结果产生错误?那么如何合理地分配和保护内存资源,变得十分重要。
我们都知道,一段程序要想运行必须加载到内存,然后CPU从内存获取指令和数据进行逻辑运算和处理,但如果一段程序运行时需要的内存非常大,超过了计算机的物理内存,这种程序还能否运行呢?
我们整理一下,针对内存资源遇到的问题:
基于这2个问题,我们来看一下,计算机是如何解决这些问题的,这其中涉及硬件与操作系统共同的协作。
从这篇文章开始,我们开始讲解存储器相关的知识。存储器在计算机中处于非常重要的位置,其中内存最为重要,其涉及到的内容主要包含高速缓存Cache和虚拟内存两大块,这篇文章先来看高速缓存Cache的基本原理。
存储器有很多种类,我们常见的有内存、磁盘,还有平时看不到的集成在CPU内部的寄存器、高速缓存等。
正常来说,存储器的容量和性能应该伴随着CPU的速度和性能提升而提升,以匹配CPU的数据处理。但随着时间的推移,CPU和存储器在性能上的发展差异越来越大,存储器在性能增长越来越跟不上CPU性能发展的需要。
那怎么办呢?
为了缩小存储器和CPU之间的性能差距,通常在计算机内部采用层次化的存储器体系结构,以此来发挥出存储器的综合性能。
之前的文章讲完了数字在计算机内部的表示方式,那英文、中文字符在计算机内部是如何表示的呢?这篇文章我们来看字符的表示方式。
西文字符主要由拉丁字母、数字、标点符号及一些特殊符号组成,它们统称为字符,所有字符的集合叫做字符集。
但字符不能直接在计算机内部处理,必须对字符进行数字化编码,转换成二进制0/1序列,因此构成了字符和数字化编码对应的代码表,简称码表,码表中的字符与代码一一对应。
世界各国都有自己的语言,即各国都有自己的字符,每个国家的字符组合起来也就产生了多种字符集。
由于计算机是美国人发明的,所以对于英文字符,美国人制定了一个字符和二进制对应的码表,这个码表就是ASCII码,即美国标准信息交换码(American Standard Code for Information Interchange)。
我们知道计算机中数字都是使用的二进制表示和运算,对于我们熟悉的十进制数字,可以通过数值进制公式进行转换后计算和显示。
但除了这种编码方式之外,计算机有时为了显示和计算方便,对十进制还定义了新的编码方式:ASCII码字符表示、BCD码表示。这篇文章我们来了解一下这2种编码方式的特点。
如果只是对十进制数进行打印或显示,那么可以把十进制数看成字符串,直接用ASCII码表示,09分别对应ASCII码的30H39H,这种表示方式,1位十进制用8位二进制数表示。
用ASCII码表示的十进制又分为前分隔数字串和后嵌入数字串。
前分隔数字串将符号位单独用一个字节表示,放在数字串之前。
正号(+)用ASCII码2B(H)表示,符号(-)用2D(H)表示。
例如十进制数+236用前分隔数字串表示为0010 1011 0011 0010 0011 0011 0011 0110
,对应的十六进制为2B 32 33 36
,在内存中占用4个字节。
十进制数-2369用前分隔数字串表示为0010 1101 0011 0010 0011 0011 0011 0110 0011 1001
,对应的十六进制为2D 32 33 36 39
,在内存中占用5个字节。
可见,十进制数每增加一位,就要多一个字节表示对应数字。
在上一篇文章中,我们主要介绍了在计算机中使用定点数表示数字的方式。
简单回顾一下,简单来说,用定点数表示数字时,会约定小数点的位置固定不变,整数部分和小数部分分别转换为二进制,就是定点数的结果。
但用定点数表示小数时,存在数值范围、精度范围有限的缺点,所以在计算机中,我们一般使用「浮点数」来表示小数。
这篇文章,我们就来详细看一下浮点数到底是如何表示小数的,以及浮点数的的范围和精度有多大。
首先,我们需要理解什么是浮点数?
之前我们学习了定点数,其中「定点」指的是约定小数点位置固定不变。那浮点数的「浮点」就是指,其小数点的位置是可以是漂浮不定的。
这怎么理解呢?
其实,浮点数是采用科学计数法的方式来表示的,例如十进制小数 8.345,用科学计数法表示,可以有多种方式:
1 | 8.345 = 8.345 * 10^0 |
看到了吗?用这种科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。
使用同样的规则,对于二进制数,我们也可以用科学计数法表示,也就是说把基数 10 换成 2 即可。
在现实生活中,我们经常使用整数和小数,不知道你有没有思考过,这些数字在计算机中是如何存储的?
我们学习计算机知识时,经常听到「定点数」和「浮点数」,它们之间有什么区别?
平时说到整数,我们就说它是一个定点数,说到小数,就说它是一个浮点数,这种说法是正确的吗?
这篇文章,我们先来看一下,「定点数」究竟与整数和小数有什么关系。
要想理解什么是「定点数」,首先,我们需要理解「定点」究竟是什么意思?
我们都知道,数字既包括整数,又包括小数,而小数的精度范围要比整数大得多,所以如果我们想在计算机中,既能表示整数,也能表示小数,关键就在于这个小数点如何表示?
于是人们想出一种方法,即约定计算机中小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用二进制表示,然后组合起来就可以把这个数字在计算机中存储起来,这种表示方式叫做「定点」表示法,用这种方法表示的数字叫做「定点数」。
也就是说「定」是指固定的意思,「点」是指小数点,小数点位置固定即定点数名字的由来。
既然定点数只是表示数字的一种方式,那试想,它可以表示整数吗?可以表示小数吗?
答案是肯定的。
定点数如果要表示整数或小数,分为以下三种情况:
对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同的,只需要把整数部分、小数部分,按照十进制转二进制的规则,分别转换即可。
而对于整数 + 小数的情况,用定点表示时,需要约定小数点的位置,才能在计算机中表示。