Kaito's Blog

致力成为一枚silver bullet.

0%

前言

我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快。但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些?为什么现在看Redis要比Memcached更火一些?

这篇文章,我们就从各个方面来对比这两个内存数据库的差异,方便你在使用时,做出最符合业务需要的选择。

要分析它们的区别,主要从以下几个方面对比:

  • 线程模型
  • 数据结构
  • 淘汰策略
  • 管道与事物
  • 持久化
  • 高可用
  • 集群化
阅读全文 »

最近在公司对redis做一些二次开发时,发现一个randomkey命令可能导致整个redis实例长时间阻塞的问题,redis版本为3.2.9,以此记录。

问题

由于我们公司使用的是redis集群版Codis,Codis内置的redis版本比较低,为3.2.9版本。

我们近期在做Codis双机房时,需要对redis增加一些功能以此支持双机房,在开发和测试中发现,执行randomkey命令有可能导致整个redis长时间阻塞的问题。

阅读全文 »

背景

用了5年的MacBook Pro 13寸,以零故障的记录光荣退役了。不得不说,前几年的MacBook品控做的是真好,整机非常耐用。

但后来的MacBook由于在硬件层面做了很多调整,之后的机器或多或少都出现过各种问题,身边的同事和朋友都遇到过一些,例如键盘故障、触控板问题,当然苹果售后也很给力,只要检查出故障就会马上换新,甚至连主板都直接换掉。

不过这次,我也终于入手了最新款的MacBook,更换的原因是因为之前的电脑性能实在跟不上了,常年在公司办公,已经变得越来越慢,Chrome打开的网页一多就能感觉到明显的卡顿情况。

这次入手的这款MacBook Pro是16寸的,配置为i9 CPU + 64G内存 + 1T固态硬盘 + 5300M独立显卡,除了硬盘和显卡之外,其他项选择的都是顶配。

有朋友觉得内存没必要选这么大的,我之前的13寸MacBook Pro只有8G内存,小的可怜,这次直接一步到位,再也不会受到内存瓶颈的影响。另外这台新电脑也计划准备陪我再战4-5年,选这个配置也足够为我未来工作和学习的变化提供足够的支撑。

拿到手里第一个感觉真的是:大!视觉冲击很棒!13寸的用了太久,这次尝试体验一下16寸的,新鲜感十足!

MacBook Pro 16寸

MacBook Pro 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种编码方式的特点。

ASCCI码字符表示

如果只是对十进制数进行打印或显示,那么可以把十进制数看成字符串,直接用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
2
3
4
8.345 = 8.345 * 10^0
8.345 = 83.45 * 10^-1
8.345 = 834.5 * 10^-2
...

看到了吗?用这种科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。

使用同样的规则,对于二进制数,我们也可以用科学计数法表示,也就是说把基数 10 换成 2 即可。

阅读全文 »

在现实生活中,我们经常使用整数和小数,不知道你有没有思考过,这些数字在计算机中是如何存储的?

我们学习计算机知识时,经常听到「定点数」和「浮点数」,它们之间有什么区别?

平时说到整数,我们就说它是一个定点数,说到小数,就说它是一个浮点数,这种说法是正确的吗?

这篇文章,我们先来看一下,「定点数」究竟与整数和小数有什么关系。

什么是定点数?

要想理解什么是「定点数」,首先,我们需要理解「定点」究竟是什么意思?

我们都知道,数字既包括整数,又包括小数,而小数的精度范围要比整数大得多,所以如果我们想在计算机中,既能表示整数,也能表示小数,关键就在于这个小数点如何表示?

于是人们想出一种方法,即约定计算机中小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用二进制表示,然后组合起来就可以把这个数字在计算机中存储起来,这种表示方式叫做「定点」表示法,用这种方法表示的数字叫做「定点数」。

也就是说「定」是指固定的意思,「点」是指小数点,小数点位置固定即定点数名字的由来。

定点数如何表示数字?

既然定点数只是表示数字的一种方式,那试想,它可以表示整数吗?可以表示小数吗?

答案是肯定的。

定点数如果要表示整数或小数,分为以下三种情况:

  1. 纯整数:例如整数100,小数点其实在最后一位,所以忽略不写
  2. 纯小数:例如:0.123,小数点固定在最高位
  3. 整数+小数:例如1.24、10.34,小数点在指定某个位置

对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同的,只需要把整数部分、小数部分,按照十进制转二进制的规则,分别转换即可。

而对于整数 + 小数的情况,用定点表示时,需要约定小数点的位置,才能在计算机中表示。

阅读全文 »

信息的二进制编码

在计算机内部,所有信息都是采用二进制进行编码和计算的,有没有想过,为什么采用这种方式?

其原因在于二进制只有两种状态,制造一个只有两个稳定状态的物理器件要比多个稳定状态的物理期间容易得多,使用高、低电位或脉冲有、无表示都很方便,能够很可靠的表示“0”和“1”。

如果都采用二进制计算,那么我们平时使用的数字、符号甚至图片和视频,都应该通过某种方式转换成二进制,
才能得以让计算机运算。这种转换方式称为“编码”。

我们人类角度看到的数据到计算机内部的数据转换如下:

这篇文章,我们先来分析数值型数据的进制与转换规则。

阅读全文 »