作为程序员,对于底层原理真的有那么重要吗?
mhr18 2024-12-09 12:17 17 浏览 0 评论
前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家。
背景
在业务中使用到了 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服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
?Redis 的 string 类型和 hash ziplist 的底层数据结构不同导致了存储大小的差异,我才发现,原来是这么回事!
这下我直呼好家伙。
?string 类型,常常被当作 Redis 中的万金油,但是它有一个明显的短板,就是它保存数据时所消耗的内存空间最多。
对于不了解 Redis 底层原理的人,很容易误以为最简单的类型,理应消耗最少的资源。但实际情况不是这样的。
Redis string 底层结构,使用了额外的数据结构来保存数据,从而造成了额外的开销,类似这样:
?这让我想起了之前的一个业务问题,一个老服务修改了一个功能上线了之后,测试同学反映,压测耗时直线飙升。
大家都觉得很奇怪,这个老服务的耗时一直都很稳定,而且,这次修改也只是正常的业务逻辑,大家又百思不得其解,花了一天的时间排查摸底。
最后我们发现,罪魁祸首居然是线上日志数据太满了,导致机器内存瞬间上升,直接影响到了压测耗时的统计。
后来,我发现,当时这个服务编译的有个选项,开启 log=debug 模式,如果当时能提前了解这个的背后原理,估计就可能避免这个坑了。
内心的疑问
互联网行业,更新迭代非常快,今天学了这个,明天可能又要学那个,在不断持续学习的过程中,相信你心里有时会反问自己,底层原理有那么重要吗?会用不就行了吗?
这个时候,可能会有另一个声音在你耳边响起,万丈高楼平地起,计算机基础知识就像程序员金字塔的地基,理解了计算机系统的底层原理,在写程序的道路上才能越走越远啊。
话是这么说没错,但这真的够吗?
更深处的原因在于:
- 经常用一些不知其所以然的技术,我会感到不安;
- 在这个数据爆炸的年代,很多系统对于项目性能的优化有很高的要求。那么如何调优成为了程序员不可避免的问题;
- 再就是如果你对计算机系统的底层原理不太了解,可能你平时写的程序都是错误的。
比如我们一直以为两个正数的和或者积一定为正,但是用二进制补码表示的正数和或者积却不一定;
程序员和编译器不能用(x-y<0)来代替(x<y),因为前者会产生溢出等等。
更进一步,互联网大厂面试,上来就问底层源码、JVM 的结构、TCP/IP 的三次握手、四次挥手,微信/拼多多用户的数据怎么满足高并发?等等。
像这些问题,如果我们不懂计算机底层知识肯定是不能过关的。
底层原理为何那么重要
开篇的例子引入,其实是想说,底层原理的学习非常重要,就好比数据结构和算法是程序员的内功一样。
最近下班在学习《MySQL实战 45讲》,作者分享了这段话,我觉得写得非常棒,在这里分享给大家。
我在带新人的时候,要求大家在写 SQL 语句的时候,心里是有数的,知道每个语句执行的结果,以及这些代码会消耗什么资源、如果慢了会慢在哪里、每个语句执行会占用哪些锁等等。
有的新人会问“为什么需要这么麻烦,我执行一下,看看结果对不对,对了就行,不对就改,是不是也可以?”我说不可以。因为如果这样,我们就会受到很多局限,即使我们定位自己是业务开发人员。
这里我说一个限制:
这会限制基于数据库的业务架构能力。一个语句可以试,一个五个语句的事务分析就要试很多次,一个复杂业务系统的数据库设计,是试不出来的。
原理可以帮我们剪枝,排除掉那些理论上明显错误的方案,这样才有精力真的去试那些有限的、可能正确的方案。
我们不需要 100% 精通 MySQL (我自己离这个目标也相去甚远),但是只要多知道一些原理,就能多剪一些枝,架构设计就能少一些错误选项的干扰,设计出来的项目架构正确的可能性更高。
我自己特别喜欢这个剪枝的过程和感觉,他表示我用以前学习的时间,来节省了现在工作的时间。
当然,“原理”是一个很大的概念,有的原理更接近实战,有的远一些。这个专栏我挑的是跟平时使用相关的原理,以便大家可以有机会边学边用。
一起加油吧
除了需要不断去探究底层原理,作为互联网技术从业者,我们还需要树立正确的计算机世界观:
这里分享浙大翁凯老师的一个原则:
学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的。
好了,说了这么多,其实是想告诉大家,做一只咸鱼很简单,如果你一辈子想做一个码农,就不用学原理。
其实不仅仅是技术,测试,运营,产品,掌握了背后的底层原理,相信你就和别人逐渐拉开差距了,因为你们已经站在不一样的维度上去看待事情了。
搞清楚背后的底层原理,我们就更容易做到触类旁通,举一反三。
如果做一只有梦想的咸鱼,有同样想法的人,又一直下不定决心去学习的人,我们可以一起,互相监督,互相学习交流。
参考资料
推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 立即学习
原文:底层原理有那么重要吗?
相关推荐
- Java面试题合集200道!
-
1.Java中操作字符串都有哪些类?它们之间有什么区别?String、StringBuffer、StringBuilder.String和StringBufer、StringBuilder的区别...
- JAVA分布式锁的原理,及多种分布式实现优劣对比分析
-
引题比如在同一个节点上,两个线程并发的操作A的账户,都是取钱,如果不加锁,A的账户可能会出现负数,正确的方式是对账户acount进行加锁,即使用synchronized关键字,对其进行加锁后,当有线程...
- 百度Linux C++后台开发面试题(个人整理)
-
1、C/C++程序的内存分区其实C和C++的内存分区还是有一定区别的,但此处不作区分:1)、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中...
- 什么是云计算?看这篇就够了(建议收藏)
-
一、什么是云?云,又称云端,指无数的大型机房或者大型数据中心。二、为什么需要云?1)从用户的角度来讲:传统应用的需求日益复杂,比如需要支持更多的用户,需要更强的计算能力等,为满足这些日益增长的需求,企...
- 写PHP框架需要具备那些知识?
-
如果没用过框架,讨论各个框架的内容都没有可讨论性,想自己写个框架涉及到的内容很多,个人觉得自己写一个框架对自己的逻辑思维,开发架构以及这门语言都有质的提升。可以参照其他框架的源代码,仅仅是看他们的思路...
- 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理
-
我们平时开发中好像很少使用到BlockingQueue(阻塞队列),比如我们想要存储一组数据的时候会使用ArrayList,想要存储键值对数据会使用HashMap,在什么场景下需要用到Blocking...
- Java性能优化指南—缓存那些事
-
由于笔者自身水平有限,如果有不对或者任何建议欢迎批评和指正本文预计阅读时间10分钟,分为前言、填坑两部分,主要包含缓存的基本使用到高级应用场景的介绍一、前言在处理高并发请求时,缓存几乎是无往不利的利器...
- 卓象科技:Nosql的介绍以及和关系型数据库的区别
-
Nosql介绍NoSQL(NotOnlySQL),泛指非关系型数据库。Nosql的全称是NotOnlySql,这个概念很早就有人提出,在09年的时候比较火。Nosql指的是非关系型数...
- 腾讯一面凉经(一面竟然就问了2小时,什么情况?)
-
这次一面感觉是在打心理战,哥们自己的心里防线基本是被击溃,面到怀疑人生的程度,所以过程感觉不是太好,很多题哥们自己也感觉没答好,要么答得“缺胳膊少腿”,要么就是“画蛇添足”。先是聊项目,从项目的架构设...
- 我凭借这份pdf,最终拿到了阿里,腾讯,京东等八家大厂offer
-
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习我是如何笑对金九银十,拿到阿里,腾讯等八家大厂的offer的呢,今天分享我的秘密武器,美团大神整理的Java核心知识点,面试时面试官...
- 高并发 异步解耦利器:RocketMQ究竟强在哪里?
-
本文带大家从以下几个方面详细了解RocketMQ:RocketMQ如何保证消息存储的可靠性?RocketMQ如何保证消息队列服务的高可用?如何构建一个高可用的RocketMQ双主双从最小集群?Rock...
- 阿里最新Java架构师成长笔记开源
-
下面先给大家上一个总的目录大纲,基础的东西就不进行过多的赘述,我们将会从JVM说起,同时由于每篇的内容过多,我们也只说重点,太过基础的内容谁都会,我就不多敲字浪费大家的时间了!JVM多线程与高并发Sp...
- 程序员失业2个月找不到工作,狂刷了5遍这份pdf终获字节跳动offer
-
写在前面1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道...
- Spring AI 模块架构与功能解析
-
SpringAI是Spring生态系统中的一个新兴模块,专注于简化人工智能和机器学习技术在Spring应用程序中的集成。本文将详细介绍SpringAI的核心组件、功能模块及其之间的关...
- Nginx从入门到精通,超详细整理,含项目实战案例|运维必学
-
Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名。Nginx可以做静态HT...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)