仲肥:何为Redis 4.0 ?

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 在2018数据库直播大讲堂峰会-Redis专场上,阿里云的仲肥对Redis4.0介绍。仲肥从何为Redis4.0着手,通过与以前Redis版本进行对比,全面详解了4.0无论是在计算速度还是进行删除操作时的计算量亦或者进行大数据树状复制结构时的可靠性方面所具有的优越性。

摘要:在2018数据库直播大讲堂峰会-Redis专场上,阿里云的仲肥对Redis4.0介绍。仲肥从何为Redis4.0着手,通过与以前Redis版本进行对比,全面详解了4.0无论是在计算速度还是进行删除操作时的计算量亦或者进行大数据树状复制结构时的可靠性方面所具有的优越性。
直播视频:https://yq.aliyun.com/video/play/1312
PDF下载:https://yq.aliyun.com/download/2455
以下为精彩视频整理:

何为Redis 4.0?

1

较传统的Redis在大Key删除时容易阻塞、热点Key、info信息不完善等问题,Redis4.0进行了相应的改进,提出了诸如lazy free、LFU&hotKeys、memory和PSYNC2等特性,很好的解决了传统上所面临的问题。

Lazyfree详解

在处理百万级别数据方面,传统领域主要有DEL和FLUSHALL两种方式,但是这两种方式都有耗时较长的缺点。而Lazyfree采用UNLINK的方式来代替DEL,采用FLUSHALL ASYNC的方式来代替FLUSHALL,从而使处理相同数据的耗时从传统的秒级、分钟级降低到目前的毫秒、微秒级别。

2

1.主动删除
Lazyfree主动删除主要有Unlink和FLUSHALL ASYNC两种方式。这两种方式都充分利用BIO线程,相应的删除工作也是在后台进行完成。Unlink的调用路径首先是经过Unlink Command入口,之后到异步删除(dbAsyncDelet)环节,最后在BIO任务中插入相应任务。FLUSHALL ASYNC的调用路径首先是经过(flushdbCommand),之后是emptyDbAsync环节,最后在BIO任务队列中插入相应任务。无论是Unlink还是FLUSHALL ASYNC,高耗时计算都是在BIO中进行,主线程主要负责创建任务。

2.被动删除
Redis的删除方式还包括过期删除(lazyfree-lazy-expire)、内存逐出删除(azyfree-lazy-eviction)隐式删除选项rename(lazyfree-lazy-server-del)和slave全量同步清空数据选项(slave-lazy-flush)被动删除机制,在进行相应删除操作只要进行对应的选择就会将删除工作交由BIO进行操作,降低了主线程消耗,避免阻塞。

如何分析热点Keys?

热点Keys是诸多行业都会遇到的问题,当某些数据访问量比较大时就会形成热点,在4.0之前Redis在热点Keys领域并没有提供一个很好分析方法,在提供的诸多方法中也是存在种种不足,目前Redis4.0提出了基于LFU(Least- Frequently- Used)的热点Keys的发现机制。

3

LFU用来记录单位时间内的访问频率,在实现上用高16位用来记录访问时间(单位为分钟),用低8位⽤用来记录访问频率。Redis在记录访问频率时并不是简单的通过线性增长方式,而是将counter做为一个基于概率的对数增长,8bits即可记录百万级的访问频率。此外,为了更加便于统计还在counter上设计了衰减机制,若在N分钟内Key没有进行访问就将其减N。

4

在经过counter的统计后,需要进一步对热点Key进行获取,在Redis4.0中通过OBJECT FREQ的命令进行获取工作。由于LFU是一个内存逐出策略,为保证热点Key获取的准确度,需要首先将maxmemory-policy设置为allkeys-lfu或者volatile-lfu,此外可以通过使用redis-cli的-hotkeys选项,分析哪些是热点key。

何为MEMORY命令?

在过去可以通过info memory命令获取Redis的内存使用情况,但是获取的信息具有局限性,不能全面掌握内存使用情况。4.0之后的MEMORY命令可以更好的了解Redis的运行情况,并通过对其输出数据的分析及早的发现Redis使用等方面存在的问题。

1.MEMORY USAGE命令

5

MEMORY USAGE命令是对一个Key内存使用情况的一个较精确评估,主要采用抽样的方式进行,随着采样值的增加,最终获取的结果也相对精确,但是所用时间也随之增加。

6

2.MEMORY STATS
MEMORY STATS输出含有多种形式,其中包括Redis的历史峰值、当前分配内存、启动后所用内存(Redis并不是一个预分配的架构,在内存使用方面其用多少内存就会进行多少内存的分配,为了在运行中节省内存,往往在启动时进行共享对象的分配)、主从同步、aof持久化以及db元信息的内存消耗。

7

3.MEMORY DOCTOR
在Redis使用过程中当内存碎片率高于1.4时就会显示出“Highfragmentation:....”的字段来提示使用者;当slave缓冲区的积压超过10M时,同样也会显示出“Big slave buffers:....”的字段;此外当normal客户端缓冲区积压超过200KB时,系统会显示出“Big client buffers:....”的提醒。在实际使用中当出现上述提醒时,往往需要使用者进行分析原因并及早的进行解决,以便于系统的稳定与运行的正常。在分析过程中要充分考虑是网络较差的原因导致传输较慢还是错误使用某一指令或者操作造成的积压。

4.0 在PSYNC2上与传统有何区别?

PSYNC2是4.0的一种全新的主从复制方式。在2.8版本时master与slave首先需要进行全量同步,在此基础上进行增量同步,如果在增量同步过程中出现断线的情况,只要能在master中找到偏移量还可以进行半同步的方式来避免全量同步的消耗。

8

在2.8版本中假若master后有两个slave分别为slave1和slave2,master主要包括server.run_id: master和server.master_repl_offset: master_offset两种字段。同样slave也存在相应的字段,其中slave1中的run_id是slave1的,而slave2中的run_id是slave2的,此外slave1和slave2的master->replrunid也不相同,slave1的是来自于master ,而slave2的来自与slave1。在构建复制链或者复制网时,假若中间slave1出现问题,需将slave2与master相连,由于slave2的replrunid(其为slave1的run_id)与master并不相同,所以不能进行相应的半同步。

9

4.0的PSYNC2解决了上述问题。

  1. 在建立主从复制关系时,master会将自己的replid传递给slave,slave会把自己的replid更新为master的,这样逐级传递下去,最终master、slave1、slave2的server.replid全部一样,都是master的replid。
  2. 主从复制建立完成之后,这条复制链上所有的数据都由master产生,也就是说master、slave1、slave2的offset也全都匹配得上。

通过前面2项可以看出,当有需要改变复制关系把slave2挂载到master上时,master和slave2具有相同的replid,并且offset也可以匹配得上,此时就可以直接进行增量同步,避免了全量同步的开销。此外在进行failover时或者主备切换时,PSYNC2也可以避免进行全量同步。

4.0目前已经更新改进到了4.0.6版本,与传统的Redis相比,Redis4.0在诸多方面都具有明显优势,无论是计算速度还是进行删除操作时的计算量亦或者进行大数据树状复制结构构建时的可靠性方面都有了明显的提升。Redis4.0在今后的使用过程中会应用到越来越多的领域,也会给使用者带去更多的使用体验。

本文由云栖志愿小组林一木整理,百见编辑。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 移动开发 NoSQL
Redis - 原理篇-2
Redis - 原理篇-2
67 0
Redis - 原理篇-2
|
6月前
|
存储 NoSQL Linux
Redis - 原理篇-1
Redis - 原理篇-1
35 0
|
8月前
|
存储 NoSQL 关系型数据库
谈谈你对Redis的理解
有位工作了10年的粉丝跟我说,去面试一家中小型公司,被要求解释什么是Redis?后面,这位粉丝来问我,说这个面试官是不是内虚?至于是不是这个原因我不做评论,但是,养成总结的习惯还是有必要的。
36 1
|
9月前
|
消息中间件 缓存 监控
使用 redis 的好处?
使用 redis 的好处?
35 0
|
9月前
|
存储 NoSQL 安全
一文搞懂 Redis 分布式锁
在实际的项目开发过程中,许多业务场景都使用基于 Redis 进行分布式锁的实现,但其中一些场景的实现过程中往往并没有充分考虑到分布式环境中可能出现的各种陷阱问题 ~
370 0
|
11月前
|
存储 缓存 监控
一文搞懂redis(下)
一文搞懂redis(下)
|
11月前
|
存储 SQL 消息中间件
一文搞懂redis(上)
一文搞懂redis(下)
|
存储 消息中间件 缓存
redis是干什么的?底层原理是什么?
redis是干什么的?底层原理是什么?
|
存储 消息中间件 NoSQL
【Redis的那些事 · 上篇】Redis的介绍、五种数据结构演示和分布式锁
Redis,全称是Remote Dictionary Service,翻译过来就是,远程字典服务。redis属于nosql非关系型数据库。Nosql常见的数据关系,基本上是以key-value键值对形式存在的。Key-value: 就像翻阅中文字典或者单词字典,通过指定的需要查询的字或者单词(key),可以查找到字典里面对应的详细内容和介绍(value)
147 0
【Redis的那些事 · 上篇】Redis的介绍、五种数据结构演示和分布式锁
|
存储 机器学习/深度学习 NoSQL
Redis常问, 从 redis优缺点开始 一环套一环
Redis常问, 从 redis优缺点开始 一环套一环
113 0