Redis为何这么快——数据存储角度
副问题[/!--empirenews.page--]
【新产物上线啦】51CTO播客,随时随地,碎片化进修
本文内容思想导图如下: 一、简介和应用 Redis是一个由ANSI C说话编写,机能优越、支持收集、可耐久化的K-K内存数据库,并提供多种说话的API。它常用的范例首要是 String、List、Hash、Set、ZSet 这5种 Redis在互联网公司一样平常有以下应用:
再好比电商在大促销时,会用一些非凡的计划来担保体系不变,扣减库存可以思量如下计划: 上图中,直接在Redis中扣减库存,记录日记后通过Worker同步到数据库,在计划同步Worker时必要思量并发处理赏罚和一再处理赏罚的题目。 通过上面的应用场景可以看出Redis长短常高效和不变的,那Redis底层是怎样实现的呢? 二、Redis的工具redisObject 当我们执行set hello world呼吁时,会有以下数据模子:
redisObject工具很是重要,Redis工具的范例、内部编码、内存接纳、共享工具等成果,都必要redisObject支持。这样计划的甜头是,可以针对差异的行使场景,对5中常用范例配置多种差异的数据布局实现,从而优化工具在差异场景下的行使服从。 无论是dictEntry工具,照旧redisObject、SDS工具,都必要内存分派器(如jemalloc)分派内存举办存储。jemalloc作为Redis的默认内存分派器,在减小内存碎片方面做的相比拟力好。好比jemalloc在64位体系中,将内存空间分别为小、大、庞大三个范畴;每个范畴内又分别了很多小的内存块单元;当Redis存储数据时,会选择巨细最吻合的内存块举办存储。 前面说过,Redis每个工具由一个redisObject布局暗示,它的ptr指针指向底层实现的数据布局,而数据布局由encoding属性抉择。好比我们执行以下呼吁获得存储“hello”对应的编码: redis全部的数据布局范譬喻下(重要,后头会用): 三、String 字符串工具的底层实现可所以int、raw、embstr(上面的表对应著名称先容)。embstr编码是通过挪用一次内存分派函数来分派一块持续的空间,而raw必要挪用两次。 int编码字符串工具和embstr编码字符串工具在必然前提下会转化为raw编码字符串工具。embstr:<=39字节的字符串。int:8个字节的长整型。raw:大于39个字节的字符串。 简朴动态字符串(SDS),这种布局更像C++的String可能Java的ArrayList<Character>,长度动态可变:
常数伟大度获取字符串长度:由于SDS在len属性中记录了长度,以是获取一个SDS长度时刻伟大度仅为O(1)。 预空间分派:假如对一个SDS举办修改,分为一下两种环境:
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |