vlambda博客
学习文章列表

挖掘Redis中埋藏的宝藏--性能调优(一)

概述




Redis作为一个Key-Value型的内存数据库,自身功能和机制并不算特别复杂。在实际应用当中,我个人理解,Redis的调优主要会集中在三个方面:


1、Redis自身参数优化;

2、根据Redis特性制定使用时的细节规则;

3、在Redis所属系统的架构上,通过外部类对Redis进行额外的功能实现。


因此,这次我也会从这三个方面对Redis调优方式进行整理。



Redis实际应用中的机制整理





除开在前一篇文章事务机制,在Redis实用和调优中经常涉及到的机制还包括了:


1、Redis的持久化机制


Redis有两种持久化机制,一个是RDB,一个是AOF。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。


RDB方式

RDB方式的持久化是通过快照的方式完成的。当符合某种规则时,会将内存中的数据全量生成一份副本存储到硬盘上,这个过程称作”快照”,Redis会在以下几种情况下对数据进行快照:


1、根据配置规则进行自动快照;

2、用户执行SAVE, BGSAVE命令;

3、执行FLUSHALL命令;

4、执行复制(replication)时。


除了让Redis自动进行快照外,当我们需要重启,迁移,备份Redis时,我们也可以手动执行SAVE或BGSAVE命令主动进行快照操作。


AOF方式

在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis的性能,但是大部分情况下这个影响是可以接受的,另外,使用较快的硬盘能提高AOF的性能。


默认情况下,Redis没有开启AOF(append only file)持久化功能,可以通过在配置文件中作如下配置启用:

appendonly yes

开启之后,Redis每执行一条写命令就会将该命令写入硬盘中的AOF文件。AOF文件保存路径和RDB文件路径是一致的,都是通过dir参数配置 , 默 认 文 件 名 是 :appendonly.aof , 可 以 通 过 配 置appendonlyfilename参数修改,例如:

appendonlyfilename appendonly.aof



2、Redis的复制机制


Redis允许使用SLAVEOF让一个服务器去复制另一个服务器,被复制的服务器为主服务器,发起复制动作的服务器是从服务器。


Redis的复制功能分为


(1)同步 

(2)命令传播两个操作:


同步操作用于将从服务器的状态更新至主服务器当前所处的数据库状态;命令传播用于在主服务器的状态被修改,导致主从服务器的数据库状态出现不一致的时候,让主从服务器的数据库重新回到一致状态。


Redis2.8以后使用PSYNC命令代替SYNC命令来执行复制时的同步操作。关于PSYNC相关可以参考上文中提到的链接。



3、Redis的哨兵机制


当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。


哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。


这里的哨兵有两个作用:


1、通过发送命令,让Redis服务器返回消息来监控其运行状态,包括主服务器和从服务器。


2、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。


然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。


用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。



4、Redis的过期策略


Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间,Expires也被称为过期字段。


一般来说,Redis主要包括2种过期的方式,一个是设置过期时间,另一个是字符串独有的SETEX命令。


设置过期时间包括四种命令:

EXPIRE key seconds //将key的生存时间设置为ttl秒

PEXPIRE key milliseconds //将key的生成时间设置为ttl毫秒

EXPIREAT key timestamp //将key的过期时间设置为timestamp所代表的的秒数的时间戳

PEXPIREAT key milliseconds-timestamp //将key的过期时间设置为timestamp所代表的的毫秒数的时间戳

而SETEX命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。


在过期策略方面,Redis采用了三种过期策略:


1、定时删除

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。


优点:保证内存被尽快释放。

缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重。


2、惰性删除

key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。


优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)。

缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)。


3、定期删除

每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作。


优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点;定期删除过期key--处理"惰性删除"的缺点。

缺点:在内存友好方面,不如"定时删除";在CPU时间友好方面,不如"惰性删除"。

难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)


看完上面三种策略后可以得出以下结论:


定时删除和定期删除为主动删除:Redis会定期主动淘汰一批已过去的key;


惰性删除为被动删除:用到的时候才会去检验key是不是已过期,过期就删除;


惰性删除为redis服务器内置策略。




作者介绍


骆骁潇,2014年毕业于东北大学软件学院,目前任职于北银金融科技有限责任公司大数据开发部。主要擅长应用中间件与大数据平台开发相关技术。




下期介绍

挖掘Redis中埋藏的宝藏—性能调优(二)

Redis的参数优化


招聘启事



北银金融科技有限责任公司根植于北京银行,是一家致力于大数据、人工智能、云计算、区块链、物联网等新技术创新与金融科技应用的科技企业,公司充分发挥北京银行企业文化和技术积淀先天优势,通过对技术、场景、生态的完美融合,输出科技创新产品和技术服务。


现诚邀优秀人才加盟,共享金融科技时代硕果


扫描此二维码

期待您的加入