当前位置:首页 >> 设计

Redis 磁盘优化神技,小磁盘保存大数据

来源:设计   2025年05月08日 09:42

}

// 杂凑冲突拉不止的数据形态

struct dictEntry *next;

} dictEntry;

key 相反查找对的双键的堆栈,key 都是 string 一般来说。 value 是个 union(的联盟)当它的绝对值是 uint64_t、int64_t 或 double 一般来说时,就不如此一来需额外的驱动器,这有利于提高机密文件系统残骸。(为了浪费机密文件系统操碎了心)当然,val 也可以是 void 堆栈,相反绝对值的堆栈,以便能驱动器任何一般来说的数据。 next 相反另一个 dictEntry 形态, 多个 dictEntry 可以通过 next 堆栈串连并成数据形态, 从这里可以显不止, ht_table 只用单链URL法来处理方式双键碰撞:当多个有所不同的双键拥有不同的杂凑绝对值时,杂凑详见用一位数据形态将这些双键连接上来。

杂凑桶并很难复原绝对值本身,而是相反基本绝对值的堆栈,从而意味着了杂凑桶能存有所不同数据一般来说的消费。

而杂凑桶里,查找对的绝对值都是由一个称做 redisObject 的单纯定义,GCCURL:。

typedef struct redisObject unsigned type:4;

unsigned encoding:4;

unsigned lru:LRU_BITS;

int refcount;

void *ptr;

} robj;

type:历史记录了单纯的一般来说,string、set、hash 、Lis、Sorted Set 等,根据该一般来说才可以确定是哪种数据一般来说,只用什么样的 API 并转换。 encoding:UTF-形式,声称 ptr 相反的数据一般来说基本数据形态,即这个单纯只用了什么数据形态作为里下层意味着复原数据。同一个单纯只用有所不同UTF-意味着机密文件系统改作存在明显差异,外部UTF-对机密文件系统冗余相当最重要。 lru:LRU_BITS:LRU 解决方案下单纯之后一次被不止访的小时,如果是 LFU 解决方案,那么低 8 位声称不止访频率,高 16 位声称不止访小时。 refcount :声称提到计数,由于 C 语法并不具备机密文件系统重复使用机制,所以 Redis 在自己的单纯系统里添加了这个属性,当一个单纯的提到计数为 0 时,则声称该单纯仍未不被任何单纯提到,则可以顺利完成垃圾重复使用了。 ptr 堆栈:相反单纯的里下层意味着数据形态,相反绝对值的堆栈。

如左由此可知是由 redisDb、dict、dictEntry、redisObejct 彼此间由此可知:

redis驱动器形态

「码哥」如此一来唠叨几句,void *key 和 void *value 堆栈相反的是 redisObject,Redis 里每个单纯都是用 redisObject 声称。

知道了 Redis 驱动器定律以及有所不同数据一般来说的驱动器数据形态后,我们继续看如何做稳定性冗余。

1. 查找对冗余

当我们制订 set key value 的军令,*key堆栈相反 SDS URL复原 key,而 value 的绝对值复原在 *ptr 堆栈相反的数据形态,耗损的机密文件系统:key + value。

第一个冗余神技:减低 Redis 机密文件系统只用的最毫不留情的形式就是减半双键(key)与绝对值(value)的宽度。

在《Redis 过强,不懂只用准则就糟蹋了》里我说过关于查找对的只用准则,对于 key 的定名为只用「金融业务基本功能名:详见名:数据唯一id」这样的形式易于定位问题。

比如:users:firends:996 声称其他用户系统里,id = 996 的好朋友数据。我们可以称做为:u:fs:996

对于 key 的冗余:只用单词称做形式冗余机密文件系统改作。

对于 value 的冗余那就够多了:

调制但会的数据:不必大而全的一股脑将所有数据复原,自已办法去丢一些但会的属性,比如缓存登录其他用户的数据,有时候需用驱动器里文名、性别、账号等。 精简数据:比如其他用户的就会员一般来说:0 声称「移情」、1 声称 「VIP」、2声称「VVIP」。而不是驱动器 VIP 这个URL。 数据传输:对数据的内容顺利完成传输,比如只用 GZIP、Snappy。 只用稳定性好,机密文件系统改作小的绑定形式。比如 Ja 可选的绑定不管是平均速度还是传输比都不行,我们可以同样 protostuff,kryo等形式。如左由此可知 Ja 少见的绑定物件紧致传输比:绑定物件传输比 ❝ 靓仔们,我们有时候只用 json 作为URL驱动器在 Redis,用 json 驱动器与二进制数据驱动器有什么优不同之处呢? json 文档的缺点:易于调试和跨语法;不同之处是:同样的数据相比二进制数据形态改作的紧致够大。 一定要 json 文档的话,那就先通过传输算法传输 json,如此一来把传输后的数据存入 Redis。比如 GZIP 传输后的 json 可减低约 60% 的紧致。 2. 小数据等价UTF-冗余

key 单纯都是 string 一般来说,value 单纯主要有五种基本数据一般来说:String、List、Set、Zset、Hash。

数据一般来说与里下层数据形态的彼此间如下请注意:

UTF-与数据形态

除此外说明下在最新的版(非稳定新版本,小时 2022-7-3),ziplist 传输列详见由 quicklist 正因如此(3.2 新版本引进),而双向数据形态由 listpack 正因如此。

另外,同一数据一般来说就会根据双键的数量和绝对值的体积也有有所不同的里下层UTF-一般来说意味着。

在 Redis 2.2 新版本不久,驱动器等价数据(Hash、List、Set、SortedSet)在做到某些状况下就会使用机密文件系统传输技术来意味着只用够少的机密文件系统驱动器够多的数据。

当这些等价里的数据原素数量极小某个绝对值且原素的绝对值改作的二进制体积极小某个绝对值的时候,驱动器的数据就会用相当浪费机密文件系统的形式顺利完成UTF-,理论上至少浪费 10 倍以上机密文件系统(平均浪费 5 倍以上)。

比如 Hash 一般来说;还有的数据不是很多,虽然杂凑详见的小时迭代是 O(1),ziplist 的小时迭代是 O(n),但是只用 ziplist 复原数据的话就会浪费了机密文件系统,并且在少量数据状况下稳定性并不就会减低很多。

所以我们需必需地控制等价原素数量和每个原素的机密文件系统体积,这样能受制于紧凑型UTF-提高机密文件系统改作。

并且,这些UTF-对其他用户和 api 是无感知的,当等价数据大约处理方式流程的备有的小得多绝对值, Redis 就会备用并转并成较长时间UTF-。

数据一般来说对应的UTF-规则如下请注意

String URL int:有理数且大写字母宽度极小 20,这样一来复原在 *ptr 里。 embstr:构筑一块倒数调配的机密文件系统(URL宽度极小等于 44 二进制)。 raw:特性URL(极小 44 二进制的URL,同时URL极小 512 MB)。 List 列详见 ziplist:原素位数极小hash-max-ziplist-entries备有,同时所有的原素的绝对值体积都极小 hash-max-ziplist-value备有。ziplist linkedlist:3.0 新版本前当列详见一般来说难以做到 ziplist 的前提条件时,Redis就会只用 linkedlist 作为列详见的外部意味着。 quicklist:Redis 3.2 引进,并作为 List 数据一般来说的里下层意味着,不如此一来只用双端数据形态 linkedlist 和 ziplist 意味着。 Set 等价 intset 有理数等价:原素都是有理数,且原素位数极小 set-max-intset-entries备有 hashtable 杂凑详见:等价一般来说难以做到intset的前提条件时就就会只用hashtable UTF-。 Hash 杂凑详见 ziplist:原素位数极小 hash-max-ziplist-entries备有,同时若有一个 value 的改作二进制体积都极小hash-max-ziplist-value 。 hashtable:hash 一般来说难以做到 intset 的前提条件时就就会只用hashtable。 Sorted Set 有序等价 ziplist:原素位数极小 zset-max-ziplist-entries 同时每个原素的value极小在在在在zset-max-ziplist-value在在备有。 skiplist:当ziplist前提条件不做到时,有序等价就会只用skiplist作为外部意味着。

表列出是 Redis redis.conf 处理方式流程匹配UTF-阈绝对值备有:

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

set-max-intset-entries 512

左由此可知是 reidsObject 单纯的 type 和 encoding 对应彼此间由此可知:

type 与UTF-

码哥,为啥对一种数据一般来说意味着多种有所不同UTF-形式?

主要理由是自已通过有所不同UTF-意味着稳定性和紧致的平衡状态。

比如当我们的驱动器只有100个原素的列详见,当只用双向数据形态数据形态时,需维护大量的外部codice_。

比如每个原素需:前置堆栈,后置堆栈,数据堆栈等,造并成紧致浪费。

如果使用倒数机密文件系统形态的传输列详见(ziplist),将就会浪费大量机密文件系统,而由于数据宽度更大,定址并转换小时迭代即使为O(n) 稳定性也相差不大,因为 n 绝对值小 与 O(1) 并明显差别。

数据UTF-冗余技巧

ziplist 驱动器 list 时每个原素就会作为一个 entry,驱动器 hash 时 key 和 value 就会作为紧邻的两个 entry。

驱动器 zset 时 member 和 score 就会作为紧邻的两个entry,当不做到上述前提条件时,ziplist 就会系统升级为 linkedlist, hashtable 或 skiplist UTF-。

由于目前几乎Redis运并转的新版本都是在3.2以上,所以 List 一般来说的UTF-都是quicklist。

quicklist 是 ziplist 和 linkedlist 的混合体,它将 linkedlist 按段重复,每一段只用 ziplist 来紧凑驱动器,多个 ziplist 之间只用双向堆栈串接上来。

同样了综合平衡状态紧致残骸和算数稳定性两个等价所以只用了新的UTF- quicklist。

ziplist 的不足

每次改写都也许触发 realloc 和 memcopy, 也许致使连锁够新的(数据也许需挪动)。

因此改写并转换的稳定性较低,在 ziplist 的原素很多时这个问题够加突不止。

冗余手段:

key 尽量控制在 44 二进制以内,走 embstr UTF-。 等价一般来说的 value 单纯的原素位数不必太多太大,受制于 ziplist UTF-意味着机密文件系统传输。 3. 单纯对等池

有理数我们偶尔在工作里只用,Redis 在重启的时候匹配生并成一个 0 ~9999 的有理数单纯对等池用于单纯复用,提高机密文件系统改作。

比如制订set 码哥 18; set 余文乐 18; key 等于 「码哥」 和「余文乐」的 value 都相反同一个单纯。

如果 value 可以只用有理数声称的话必需只用有理数,这样即使大量查找对的 value 大量复原了 0~9999 范围内的有理数,在范例里,其实只有一份数据。

靓仔们,有两个牛池湾需同样,它就会致使单纯对等池失效。

Redis 里增设了 maxmemory 受限小得多机密文件系统改作体积且启用了 LRU 解决方案(allkeys-lru 或 volatile-lru 解决方案)。 ❝ 码哥,为啥呀? 因为 LRU 需历史记录每个查找对的不止访小时,都对等一个有理数 单纯,LRU 解决方案就难以顺利完成统计分析了。 等价一般来说的UTF-使用 ziplist UTF-,并且等价内容是有理数,也不能对等一个有理数单纯。 ❝ 这又是为啥呢? 只用了 ziplist 紧凑型机密文件系统形态驱动器数据,推断有理数单纯究竟对等的稳定性极低。 4.只用 Bit 比特位或 byte 级别并转换

比如在一些「二绝对值稳定状态统计分析」的布景下只用 Bitmap 意味着,对于首页 UV 只用 HyperLogLog 来意味着,大大提高机密文件系统改作。

码哥,什么是二绝对值稳定状态统计分析呀?

也就是等价里的原素的绝对值只有 0 和 1 两种,在除此外传真和其他用户究竟登岸的布景里,需用历史记录除此外(1)或 并未除此外(0),已登录(1)或并未登岸(0)。

假如我们在推断其他用户究竟登岸的布景里只用 Redis 的 String 一般来说意味着(key -> userId,value -> 0 声称下线,1 - 登岸),假如驱动器 100 万个其他用户的登岸稳定状态,如果以URL的形式驱动器,就需驱动器 100 万个URL,机密文件系统开销太大。

String 一般来说除了历史记录实际上数据外,还需额外的机密文件系统历史记录数据宽度、紧致只用等数据。

Bitmap 的里下层数据形态用的是 String 一般来说的 SDS 数据形态来复原位数据形态,Redis 把每个二进制数据形态的 8 个 bit 位来顺利完成上来,每个 bit 位 声称一个原素的二绝对值稳定状态(不是 0 就是 1)。

可以将 Bitmap 便是是一个 bit 为单位的数据形态,数据形态的每个区块并不需要驱动器 0 或者 1,数据形态的z在 Bitmap 里称做 offset 绝对绝对值。

为了直观展示,我们可以理解并成 buf 数据形态的每个二进制用悄悄声称,每悄悄有 8 个 bit 位,8 个格子分别声称这个二进制里的 8 个 bit 位,如左由此可知请注意:

8 个 bit 都由一个 Byte,所以 Bitmap 就会极大地浪费驱动器紧致。 这就是 Bitmap 的优势。

关于 Bitmap 的详细可否,大家可移步 -> 《Redis 实战篇:巧用 Bitmap 意味着亿级数据统计分析》。

5. 妙用 Hash 一般来说冗余

必需把数据抽象到一个杂凑详见里。

一般来说系统里有一个其他用户单纯,我们不需为一个其他用户的里文名、姓名、Gmail、URL等单独增设一个 key,而是将这个数据存放在一个杂凑详见里。

如下请注意:

hset users:茂名:999 姓名 码哥

hset users:茂名:999 年龄 18

hset users:茂名:999 爱好 女

为啥只用 String 一般来说,为每个属性增设一个 key 就会改作大量机密文件系统呢?

因为 Redis 的数据一般来说有很多,有所不同数据一般来说都有些不同的元数据要历史记录(比如之后一次不止访的小时、被提到的数等)。

所以,Redis 就会用一个 RedisObject 形态体来统一历史记录这些元数据,用 *prt 堆栈相反实际上数据。

当我们为每个属性都创建 key,就就会创建大量的 redisObejct 单纯改作机密文件系统。

如下请注意 redisObject 机密文件系统改作:

redisObejct

用 Hash 一般来说的话,每个其他用户需用增设一个 key。

6. 机密文件系统残骸冗余

Redis 拘押的机密文件系统紧致也许并不是倒数的,这些不倒数的机密文件系统紧致很有也许受制于一种荒废的稳定状态。

虽然有那时候紧致,Redis 却难以用来复原数据,不仅就会提高 Redis 能够实际上复原的数据量,还就会减低 Redis 运并转机器的并效率回报率。

比如, Redis 驱动器一个整形大写字母等价需一块改作 32 二进制的倒数机密文件系统紧致,举例来说虽然有 64 二进制的那时候,但是他们都是不倒数的,致使难以复原。

机密文件系统残骸是如何形并成呢?

两个层面理由致使:

并转换系统机密文件系统调配机制:机密文件系统调配解决方案决定了难以做到按需调配。因为可执行是按照固定体积来调配机密文件系统。 查找对被改写和删除,从而致使机密文件系统紧致的扩容和拘押。

残骸冗余可以减低机密文件系统只用率,减低不止访稳定性,在4.0表列出新版本,我们并不需要只用重启回复:重启加载 RDB 或者通过高只用于其预设意味着数据的再一的加载提高残骸。

在4.0以上新版本,Redis提供了备用和手动的残骸整理机制,定律大致是把数据拷贝到新的的机密文件系统紧致,然后把老的紧致拘押丢,这个是有一定的稳定性能量耗损的。

因为 Redis 是单线程,在数据拷贝时,Redis 并不需要等着,这就致使 Redis 难以处理方式请求,稳定性就就会减低。

手动整理残骸

制订 memory purge军令即可。

备用整理机密文件系统残骸

只用 config set activedefrag yes 解释器或者在 redis.conf 备有 activedefrag yes 将 activedefrag 备有并成 yes 声称重启备用排查机制。

这个备有还够,至于啥时候排查还需看下面的两个备有:

active-defrag-ignore-bytes 200mb:机密文件系统残骸的体积达到 200MB,开始排查。 active-defrag-threshold-lower 6:声称机密文件系统残骸紧致%并转换系统调配给 Redis 的总紧致数量达到 6% 时,开始排查。

只有做到这两个前提条件, Redis 才就会制订机密文件系统残骸备用排查。

除此之外,Redis 为了防范排查残骸对 Redis 较长时间处理方式解释器造并成影响,有两个模板用于控制排查并转换改作 CPU 的小时数量上下限。

active-defrag-cycle-min 15:备用排查全过程所用 CPU 小时的数量不低于 15%,保证排查能有效展开。 active-defrag-cycle-max 50:声称备用排查全过程所用 CPU 小时的数量不能极小 50%,一旦大约,就停止排查,从而避免在排查时,大量的机密文件系统拷贝阻塞 Redis制订军令。 7. 只用 32 位的 Redis

只用32位的redis,对于每一个key,将只用够少的机密文件系统,因为32位流程,堆栈改作的二进制数够少。

但是32的Redis整个范例只用的机密文件系统将被受限在4G表列出。我们可以通过 cluster 模式将多个小机密文件系统节点构并成一个集群,从而复原够多的数据。

另外小机密文件系统的节点 fork 生并成 rdb 的平均速度也够快。

RDB和AOF机密文件是不区分32位和64位的(之外二进制顺序),所以你可以只用64位的Redis 回复32位的RDB备份机密文件,相反亦然。

注释[1][2]《Redis 控制技术与实战》[3]

成都妇科检查费用
杭州看白癜风到哪家医院好
郑州不孕不育专科医院哪个好
天津看白癜风哪家比较好
信阳看妇科哪家医院比较好
复方鱼腥草合剂和蓝芩口服液哪里不同
肠炎宁对新冠病毒腹泻有效吗
新冠腹泻吃肠炎宁管用吗
受凉感冒咳嗽怎么快速止咳化痰
家用血糖仪哪个好
友情链接