[Redis实验室1]Redis源码分析100W数据的内存占用及优化实验内容源自极客时间Redis核心技

业务假设,需要保存100w个K-V值。其中K是一个long类型,V是一个String类型。

defwrite100wkv_with_pipline():print("beginwrite100w")pip=client.pipeline(transaction=False)before=getRedisUsedMemory()forkinrange(0,1000000):pip.set(k,'v'+str(k))pip.execute()after=getRedisUsedMemory()print("endwrite100w,using:"+str(after-before))在这个过程中,必须开启pipeline去进行通信。

beginwrite100wbefore:used_memory_human:1.87Mbefore:used_memory_human:70.90Mendwrite100w,using:72380608100w行的k-v数据,使用了约70m的存储空间。

我尝试实用keys对Redis的keys进行一次遍历,结果需要查询9s。

....999998)"301947"999999)"869004"1000000)"524681"(9.03s)2.2Redis的String存储原理分析按照上述统计,一个KV大概所消耗的内存为72字节。那存储的部分都是哪些内容呢?

Redis在存储String的时候,使用的是动态字符串SDS结构,一个对象大概需要如下三个部分:

除了SDS的空间使用外,还需要占用一个RedisObject对象。

//redis源码:server.h:620typedefstructredisObject{unsignedtype:4; 4个bitunsignedencoding:4; 4个bitunsignedlru:LRU_BITS;/*lrutime(relativetoserver.lruclock)*/24个bitintrefcount;32bitvoid*ptr; 64bit}robj这个对象已经需要占用16字节。示意图如下

一方面,当保存的是Long类型整数时,RedisObject中的指针就直接赋值为整数数据了,这样就不用额外的指针再指向整数了,节省了指针的空间开销。另一方面,当保存的是字符串数据,并且字符串小于等于44字节时,RedisObject中的元数据、指针和SDS是一块连续的内存区域,这样就可以避免内存碎片。

小结一下,我们已经计算来SDS(动态字符串)+redisObject两个对象的数据,先假设大约为40Byte,我们剩下计算32bit的数据。

Redis本质上也是一个大的Hash表,也就是说每增加一个对象,就需要增加一个如红箭头标记的一个对象。Redis源码将其命名为:dictEntry

typedefstructdictEntry{void*key;void*val;structdictEntry*next;}dictEntry从源码上看,一个有三个指针,因为使用的是jemalloc内存分配库,所以其会分配32字节,而不是24字节。

至此,就可以比较完整地统计好数据存储的位置了。

从此可见,有效的KV信息其实并不长,假如是两个Long类型的数据,有效的信息只有16字节。Redis设计来一种新的底层存储结构,压缩列表(ziplist),本质上就是将随机指针地址转换为连续地址,通过偏移量进行识别,完成存储。随机寻址和连续寻址也是计算机中最底层的两种技术选型。

使用连续寻址,就可以将多个KV,共同存储在一个dictEntry上。

假如存储的数据就是K-V值,K做一次拆分。譬如每1000个为个Hash集合,采用Hash数据进行存储。本质上,这是一个分治思想,分级存储。

defwrite100wkv_with_pipline_hash():print("beginwrite100winhashway")pip=client.pipeline(transaction=False)before=getRedisUsedMemory()forkinrange(0,1000000):pip.hset(int(k/1000),k%1000,'v'+str(k))pip.execute()after=getRedisUsedMemory()print("endwrite100w,using:"+str(after-before)beginwrite100winhashwayused_memory_human:865.74Kused_memory_human:53.82Mendwrite100w,using:55544192在默认配置下,hash存储这批数据,需要53M,比72M优化来一部分。由于切分过程中,可以保证每个Hash的KV数量为1000,且KV值大小是一致的。所以可以增加以下配置,保证Hash一直使用ziplist做底层数据存储结构。

#表示用压缩列表保存时哈希集合中的最大元素个数。hash-max-ziplist-entries1000#表示用压缩列表保存时哈希集合中单个元素的最大长度hash-max-ziplist-value64这两个配置可以保证本次存储一致保持在ziplist存储。这样空间利用率是最高效的。存储如下,大概比第一版的存储节省5倍的空间。

beginwrite100winhashwayused_memory_human:865.13Kused_memory_human:14.37Mendwrite100w,using:141853443.实验结论3.1Redis的新认知这是第一次针对Redis实践。结合Redis的源码,分析了Redis的数据对象存储情况。Redis的难点并不在业务,而是在于高效,Redis的接口是简单的。

这次实验说明了,假如认真对业务分析,再结合Redis的数据结构和参数进行定制,是可以获得量级优化的。

THE END
1.对PHP源码的测试php源码检测从2月24号左右,开始从源码阅读并且二改,由于中途网站需要备案就隔了一个星期多没搞了,直到今早起来看到信息,备案通过了,吃完饭就开始改,终于在下午全部测试完成! 我看了一下原作者用的是MDUI+腾讯云的服务器,MDUI是0.4.2版本,现在MDUI更新到了1.0.1了,不过不影响基本的功能,于是开始搭建并且测试功能。 https://blog.csdn.net/qq_53325717/article/details/129324105
2.怎么测试php源码?Worktile社区1. 单元测试框架:选择适合的单元测试框架,比如PHPUnit,来编写和运行PHP源码的单元测试。使用单元测试框架可以对PHP代码的功能进行测试,确保代码行为符合预期。 四、功能测试1. 编写测试用例:根据PHP源码的功能特点,编写相应的功能测试用例。测试用例应该覆盖尽可能多的场景,以验证PHP源码的正确性。 五、性能测试1. https://worktile.com/kb/ask/102968.html
3.网页测试Java代码测试网页源码mob6454cc623087的技术博客网页测试Java代码 测试网页源码 网站有错误代码?不兼容?有时候就在状态栏显示错误,代码很长挨个看实在头疼。于是百度一下,狂搜网页错误在线检测工具,结果还真发现了不少,把用过的工具进行了整理,分网页代码测试、网页兼容性、网速测试、seo优化四大类收集了30多个可以在线测试网页的工具,推荐也收藏一下,以后备用。https://blog.51cto.com/u_16099170/9146276
4.个人源码测试数据可视化中心 将文件拖到此处,或点击上传 只能上传csv文件,且不超过500MBhttp://www.china1.fun/
5.php最新版微测试源码v1.02源码下载适用范围: 微应用平台源码APP微博应用程序,微趣源码,微趣应用平台,微测试源码 运行环境: PHP、MYsql 其他说明:最新微应用平台源码,无后台(后台也没用),不用数据库,支持腾讯QQ空间,支持关注认证空间,共60多个测试~~ 之前我们也首发了2012微趣应用平台/微趣源码/APP微博应用程序/微应用平台源码,是微博登录的,这次发布https://www.jb51.net/codes/89769.html
6.最新周易测算系统源码完美运行(无需授权)新版测算系统海外多语言源码 2024-09-18 PHP姓名配对测试源码 2024-07-16 最新周易测算系统源码完美运行(无需授权) 2024-07-03 最新测算塔罗源码/算命源码(可以运营) 2023-08-12 星座运势在线查看网站开源源码 2023-03-29 2022在线算命网站源码(周易测算h5源码) 2022-09-22 (最新开运网)算命网/周公八字婚姻预测https://www.huizhanii.com/34714.html
7.搬运FAQ丨《数码宝贝:源码》链接测试须知数码宝贝源码吧各位被选召者们好,《数码宝贝:源码》「链接测试」将于12月12日10:00正式启动!为了帮助大家更好地了解本次测试,请仔细阅读以下【测试须知】。Q:本次测试的具体信息A:测试时间为12月12日10:00至12月19日22:00,测试期间不开放充值服务,测试结束后所有游戏数据将被清除。Q:如何获得本次测试的资格?A:12月12日https://tieba.baidu.com/p/9322273574
8.搜狐视频解析源码测试时间:2024.09.18搜狐视频解析源码【测试时间:2024.09.18】 此内容为付费资源,请付费后查看 ¥588 VIP¥538SVIP¥388 立即购买 您当前未登录!建议登陆后购买,可保存购买订单,凭订单享受售后更新服务 付费资源介绍 搜狐视频解析源码,PHP代码,支持mp4和m3u8解析,mp4可免VIP账号cookie,高清画质;m3u8会员视频需配置VIP账号cookie,支持多账号https://www.leafone.cn/315.html
9.数码宝贝源码链接测试资格怎么获取链接测试资格获取方法数码宝贝源码是一款童年经典的养成冒险回合制游戏,游戏采取了次世代PBR写实风格数码宝贝和奇幻数码世界风格,给玩家们带来全新的玩法体验,游戏在今日上线了链接测试的活动,玩家们对这个测试资格的获取方法也是比较关注的,下面就让小编给大家带来《数码宝贝源码》链接测试资格获取方法,一起来看看吧。 https://shouyou.3dmgame.com/gl/541580.html
10.单元测试Parasoft中国官网验证目标代码中无错误,并且遵循相关安全标准。而在测试驱动开发(TDD)环境中,代码功能和质量保持不变,所以不用担心需要对已有代码的更改。https://www.parasoftchina.cn/solutions/unit-testing/
11.我个人的LinuxTCPserver和client测试源码,C语言(2)(★firecat简介:我个人的Linux TCP server和client测试源码,C语言(2)(★firecat推荐★) 二、echo源码2如下,main.c #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/epoll.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/rehttps://developer.aliyun.com/article/803527
12.通达信几天几板行情排序指标副图源码测试图通达信公式指标引用到GPJYVALUE交易类数据,需要下载专业财务数据才能使用 去除ST和停牌:=NOT(NAMELIKE('S') OR NAMELIKE('*S')) AND VOL1; ZDF:=IF(INBLOCK('创业板'), 0.2, IF(INBLOCK('科创板'),0.2,IF(INBLOCK('ST板块'), http://www.gszx.com.cn/html/tongdaxingongshi/gs280602.html
13.AI面相测试源码AI面相手相大师小程序源码最新版AI面相测试源码安装前准备的资料1、微信公众号(认证服务号)2、服务器3、备案域名解析4、申请支付5、AI人脸识别接口自行申请 AI面相测试源码安装环境Linuxphp 5.6+mysql 5.6 AI智能面相——2019现象级、刷屏级全网爆红产品AI人工智能算法PK传统线上风水吸金行业 https://www.songma.com/product/view138762.html
14.干货!手把手教小白批量制造测试数据!(附源码)(附源码) 造数据核心思想 在性能测试的工作中,我们经常会遇到造数据的需求,这个工作可以让开发同学来配合,但这必定还要看开发同学的脸色行事!遇到nice的开发同学自然工作顺利,但是遇到配合度不高的开发同学,往往需要协调领导来促成此事,这就比较麻烦了!本文就通过循环批量插入数据的实例来模拟造数据这个场景,提供的都https://www.jianshu.com/p/d96aafc102fe
15.「翔博精选指标」金手指(通达信公式主图源码测试图)箱底箱本指标有未来函数 发现未来函数DVOL! 发现未来函数DCLOSE! 发现未来函数TROUGH! 发现未来函数PEAK! {金手指} MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); MA3:MA(CLOSE,25); MA4:MA(CL 本指标有未来函数 发现未来函数DVOL! 发现未来函数DCLOSE! 发现未来函数TROUGH! http://www.xiangbosoft.com/shenghuo/9592.html
16.同花顺GS趋势策略副图指标多指标组合趋势买卖策略源码测试图授权方式:指标源码 公式分类:同花顺公式 指标类型:副图 运行环境:同花顺软件 所需积分:0 相关Tags: 同花顺GS趋势策略副图指标 多指标组合趋势买卖策略 源码 测试图介绍 好股网(www.goodgupiao.com)提示:您正在下载的是:同花顺GS趋势策略副图指标 多指标组合趋势买卖策略 源码 测试图 https://www.goodgupiao.com/gupiaogongshi/65601.html
17.PHP开发的DJ音乐网整站源码PC+WAP亲测完美运行3000多数据带8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别! 站长QQ:1754646538 站长邮箱:1754646538@qq.com dj源码音乐网 YUANLEISVIP 全网VIP视频解析网站源码 带后台 可自定义广告【免费分享】 https://www.yuanlei.net/157131.html
18.2021年1月16日随着我国软件产业与信息化建设的深入发展,软件安全测试技术逐渐成为软件企业生存和信息化项目建设好坏的关键,提升我国软件测试能力,已成为保障软件质量的必要手段。培养测试高级人才、提供高效、优质的软件质量测试服务是当前共同的目标。 为进一步帮助各单位相关人员深入了解软件安全测试技术及渗透测试技巧,提升各相关单位的应https://www.cesi.cn/202101/7184.html