深入相识一下Redis的内存模子!
假设有90000个键值对,每个key的长度是7个字节,每个value的长度也是7个字节(且key和value都不是整数);下面来估算这90000个键值对所占用的空间。在估算占有空间之前,起首可以鉴定字符串范例行使的编码方法:embstr。 90000个键值对占有的内存空间首要可以分为两部门:一部门是90000个dictEntry占有的空间;一部门是键值对所必要的bucket空间。 每个dictEntry占有的空间包罗:
bucket空间:bucket数组的巨细为大于90000的最小的2^n,是131072;每个bucket元素为8字节(由于64位体系中指针巨细为8字节)。 因此,可以估算出这90000个键值对占有的内存巨细为:90000*80 + 131072*8 = 8248576。 下面写个措施在redis中验证一下: 运行功效:8247552 理论值与功效值偏差在万分之1.2,对付计较必要几多内存来说,这个精度已经足够了。之以是会存在偏差,是由于在我们插入90000条数据之前redis已分派了必然的bucket空间,而这些bucket空间尚未行使。 作为比拟将key和value的长度由7字节增进到8字节,则对应的SDS变为17个字节,jemalloc会分派32个字节,因此每个dictEntry占用的字节数也由80字节变为112字节。此时估算这90000个键值对占有内存巨细为:90000*112 + 131072*8 = 11128576。 在redis中验证代码如下(只修改插入数据的代码): 运行功效:11128576;估算精确。 对付字符串范例之外的其他范例,对内存占用的估算要领是相同的,必要团结详细范例的编码方法来确定。 2、优化内存占用 相识redis的内存模子,对优化redis内存占用有很大辅佐。下面先容几种优化场景。 (1)操作jemalloc特征举办优化 上一末节所报告的90000个键值即是一个例子。因为jemalloc分派内存时数值是不持续的,因此key/value字符串变革一个字节,也许会引起占用内存很大的变换;在计划时可以操作这一点。 譬喻,假如key的长度假如是8个字节,则SDS为17字节,jemalloc分派32字节;此时将key长度缩减为7个字节,则SDS为16字节,jemalloc分派16字节;则每个key所占用的空间都可以缩小一半。 (2)行使整型/长整型 假如是整型/长整型,Redis会行使int范例(8字节)存储来取代字符串,可以节减更多空间。因此在可以行使长整型/整型取代字符串的场景下,只管行使长整型/整型。 (3)共享工具 操作共享工具,可以镌汰工具的建设(同时镌汰了redisObject的建设),节减内存空间。今朝redis中的共享工具只包罗10000个整数(0-9999);可以通过调解REDIS_SHARED_INTEGERS参数进步共享工具的个数;譬喻将REDIS_SHARED_INTEGERS调解到20000,则0-19999之间的工具都可以共享。 思量这样一种场景:论坛网站在redis中存储了每个帖子的赏识数,而这些赏识数绝大大都漫衍在0-20000之间,这时辰通过恰当增大REDIS_SHARED_INTEGERS参数,便可以操作共享工具节减内存空间。 (4)停止太过计划 然而必要留意的是,岂论是哪种优化场景,都要思量内存空间与计划伟大度的衡量;而计划伟大度会影响到代码的伟大度、可维护性。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |