前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家。

​背景

在业务中使用到了 Redis 数据库来存储数据,但是在存储大数据量的 string 的时候,监控却发现内存增长异常。

string 类型,作为 Redis 中唯一的“键-单值”类型,操作简单,易于理解,按道理只是存一下字符型的数据,怎么会这么消耗内存,这是怎么回事呢?

怀着刨根问底的精神,我自己在我的 Mac 机器上动手实战了一番,写了一段 Python 代码,准备数据长度 7 位数,共 100 万条数据,开始跑数据。

​结果发现,使用 string 占用 70 MB,使用 hash ziplist 只占用 9 MB!效果非常明显。

测试结果:

begin write 100w
before: used_memory_human:1.87M
before: used_memory_human:70.90M
end write 100w, using: 72380608

这数据效果,没有对比就没有差距。

百思不得其解之际,上网搜了搜别人的回答,看了一些但感觉一直没有说到点子上,直到今天在零声教育的专栏上,学习了 Redis 的 string 底层源码。

【文章福利】另外小编还整理了一些C++后端底层原理开发面试题,教学视频,学习路线图免费分享,需要的可以自行添加:学习交流群点击加入~ 群文件共享

小编强力推荐C++后端底层原理开发免费学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​

​Redis 的 string 类型和 hash ziplist 的底层数据结构不同导致了存储大小的差异,我才发现,原来是这么回事!

这下我直呼好家伙。

string 类型,常常被当作 Redis 中的万金油,但是它有一个明显的短板,就是它保存数据时所消耗的内存空间最多。

对于不了解 Redis 底层原理的人,很容易误以为最简单的类型,理应消耗最少的资源。但实际情况不是这样的。

Redis string 底层结构,使用了额外的数据结构来保存数据,从而造成了额外的开销,类似这样:

​这让我想起了之前的一个业务问题,一个老服务修改了一个功能上线了之后,测试同学反映,压测耗时直线飙升。

大家都觉得很奇怪,这个老服务的耗时一直都很稳定,而且,这次修改也只是正常的业务逻辑,大家又百思不得其解,花了一天的时间排查摸底。

最后我们发现,罪魁祸首居然是线上日志数据太满了,导致机器内存瞬间上升,直接影响到了压测耗时的统计。

后来,我发现,当时这个服务编译的有个选项,开启 log=debug 模式,如果当时能提前了解这个的背后原理,估计就可能避免这个坑了。

内心的疑问

互联网行业,更新迭代非常快,今天学了这个,明天可能又要学那个,在不断持续学习的过程中,相信你心里有时会反问自己,底层原理有那么重要吗?会用不就行了吗?

这个时候,可能会有另一个声音在你耳边响起,万丈高楼平地起,计算机基础知识就像程序员金字塔的地基,理解了计算机系统的底层原理,在写程序的道路上才能越走越远啊。

话是这么说没错,但这真的够吗?

更深处的原因在于:

  • 经常用一些不知其所以然的技术,我会感到不安;

  • 在这个数据爆炸的年代,很多系统对于项目性能的优化有很高的要求。那么如何调优成为了程序员不可避免的问题;

  • 再就是如果你对计算机系统的底层原理不太了解,可能你平时写的程序都是错误的。

比如我们一直以为两个正数的和或者积一定为正,但是用二进制补码表示的正数和或者积却不一定;

程序员和编译器不能用(x-y<0)来代替(x<y),因为前者会产生溢出等等。

更进一步,互联网大厂面试,上来就问底层源码、JVM 的结构、TCP/IP 的三次握手、四次挥手,微信/拼多多用户的数据怎么满足高并发?等等。

像这些问题,如果我们不懂计算机底层知识肯定是不能过关的。

底层原理为何那么重要

开篇的例子引入,其实是想说,底层原理的学习非常重要,就好比数据结构和算法是程序员的内功一样。

最近下班在《MySQL实战 45讲》,作者分享了这段话,我觉得写得非常棒,在这里分享给大家。

我在带新人的时候,要求大家在写 SQL 语句的时候,心里是有数的,知道每个语句执行的结果,以及这些代码会消耗什么资源、如果慢了会慢在哪里、每个语句执行会占用哪些锁等等。

有的新人会问“为什么需要这么麻烦,我执行一下,看看结果对不对,对了就行,不对就改,是不是也可以?”我说不可以。因为如果这样,我们就会受到很多局限,即使我们定位自己是业务开发人员。

这里我说一个限制:

这会限制基于数据库的业务架构能力。一个语句可以试,一个五个语句的事务分析就要试很多次,一个复杂业务系统的数据库设计,是试不出来的。

原理可以帮我们剪枝,排除掉那些理论上明显错误的方案,这样才有精力真的去试那些有限的、可能正确的方案。

我们不需要 100% 精通 MySQL (我自己离这个目标也相去甚远),但是只要多知道一些原理,就能多剪一些枝,架构设计就能少一些错误选项的干扰,设计出来的项目架构正确的可能性更高。

我自己特别喜欢这个剪枝的过程和感觉,他表示我用以前学习的时间,来节省了现在工作的时间。

当然,“原理”是一个很大的概念,有的原理更接近实战,有的远一些。这个专栏我挑的是跟平时使用相关的原理,以便大家可以有机会边学边用。

一起加油吧

作为程序员,对于底层原理真的有那么重要吗?相关推荐

  1. 程序员到35岁真的会失业吗

    程序员到35岁真的会失业吗 "老程序员"这个称呼印证了行业的一道坎,35岁,不光是程序员,还有其他行业的从业者,都会遇到这个坎.批量的年轻人逐渐涌入,打击了一批还在碌碌无为的前辈, ...

  2. 38岁了,难道程序员35岁以后真的都要失业了吗?

    ‍ ‍刚打开头条,收到平台推送的一条邀请问道: 38岁了,难道程序员35岁以后真的都要失业了吗? 之前也回答过类似这样的问题,感觉之前的回答有些过于笼统,没有真正贴近实际案例. 以前我也时常在思考一个 ...

  3. 现实点!做程序员没有好学历真的会低人一等!

    晚上吃饭的时候,发现园区的栀子花已经开了,又是一年毕业季悄然来临,不禁感叹时间过的真快呀.算算日子,从毕业到现在已经5个年头了,这一路走来都是在从事Android开发相关工作,着实不易,想和大家分享我 ...

  4. 跳出误区:Java程序员进阶架构师真的没你想象的那么简单......

    小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL).所以,架构师在广大码农中的占比大概平均不到 10%.而架构师也可以分为初级.中级.高级三档,江湖上真正高水平的软件架构师就更少了. ...

  5. Java程序员面试,基础真的很重要

    基础这东西,各个公司都很看重,尤其是大公司,他们看中人的潜力,他们舍得花精力去培养,所以基础是重中之重.之前很多人问我,项目经历少怎么办,那就去打牢基础,当你的基础好的发指的时候,你的其他东西都不重要 ...

  6. 《程序员的底层思维》读书笔记

    人是能够习惯于任何环境的生物,之前你认为自己难以克服的困难,慢慢都会适应了. 维克多弗兰克<活出生命的意义> 文章目录 人是能够习惯于任何环境的生物,之前你认为自己难以克服的困难,慢慢都会 ...

  7. PMCAFF问答精选 | 程序员转型产品经理真的明智吗?

    出品|PMCAFF 本文来自@丁丁的咪咪在PMCAFF产品经理社区的提问,原标题是:写了几年代码,有没有好的方法让一个程序员变成产品经理? 以下是问题补充: 有时经常在迷茫,做了几年的程序员之后,不知 ...

  8. 程序员用软件测试原理解读蚂蚁集团上市受阻!

    作为一名软件测试工程师,找BUG.修补产品/平台系统漏洞是我们的长项. 而从此次蚂蚁上市受阻,并被纳入监管.合理引导.积极整改等一系列举措,又何尝不是一种对社会系统BUG和漏洞的防范修复呢? 归根究底 ...

  9. 程序员,你是真的该养生了

    冬天即将来临,泡一杯红枣加枸杞已经变成了抗寒养生的标配,但对于程序员来说,红枣枸杞并不能从根本上解决养生问题. 众所周知,程序员是个强度高,压力大的工作,加班熬夜是家常便饭.如果在平时不注重健身养身, ...

最新文章

  1. 基于python物流管理系统毕业设计-长白高校邦数据科学通识课【Python基础语法】答案...
  2. javascript 模式学习篇---基础
  3. 计算几何相关资料+题目推荐(不定期补充)
  4. 下载Centos7 64位镜像
  5. linux节点ssh免密码登录linux节点
  6. spring-cloud熔断和负载均衡
  7. HCIE Security 2020.12.04面试战报
  8. python xml 解析_python解析xml文件方式(解析、更新、写入)
  9. gstreamer实现sink插件的代码,及无法结束的问题
  10. oc传参数给js_一道面试题引发关于 js 隐式转换的思考
  11. 安卓饼状图设置软件_Android自定义控件实现饼状图
  12. 微软应用商店应用无法联网_微软,诺基亚应用商店-即将开业!
  13. linux命令配置永久ip地址,Linux命令行永久修改IP地址、网关和DNS。
  14. ubuntu18安装详细教程
  15. visual studio设置字体及护眼背景色
  16. sdlc esd oracle,SDLC-PCIE高速同步串口卡
  17. 23位华人学者入选!2022年ACM杰出会员名单公布!
  18. 企业微信又更新了!聊天敏感词、下载直播回放视频、聊天文件支持10GB...
  19. Redis 快速提高系统性能的银弹
  20. 就是计算机信息学竞赛,什么是信息学竞赛NOI?参加信息学竞赛有什么用?

热门文章

  1. linux硬盘分区有哪些目录,浅谈Linux的硬盘分区和目录结构
  2. 在读书郎G90s版本安装微信
  3. post请求爬取艺龙酒店的评论
  4. 记录使用bioconductor安装ChIPpeakAnno及ChIPseeker包遇到的bug
  5. org.springframework.mail.MailAuthenticationException: Authentication failed;解决方法
  6. 互联网档案计划(Internet Archive)
  7. Hibernate框架刘宝宝深度版
  8. 10月券商App行情刷新及交易体验评测报告
  9. h5页面转png图片_HTML、H5、web转图片image的几种方法总结
  10. 计算机应用word单元测试,[高职统考}计算机应用基础word2003单元测试题(3)