爱笑的架构师

其他

面试官:说说Atomic原子类的实现原理

Atomic?Java从JDK1.5开始提供java.util.concurrent.atomic包,这里包含了多个原子操作类。原子操作类提供了一个简单、高效、安全的方式去更新一个变量。Atomic
2021年6月7日
其他

我也是从寒门走出来的

五一假期带着家人疯玩,白天太忙没有输出,只能晚上写点东西。这篇文章也是有感而发,坐在电脑前面慢慢敲下了这些文字。(注:文字太重要,无配图)我们是极其普通的一类人前段时间有位博士的论文致谢走红了,读完后有强烈的共鸣,文中主人公的故事深深感动了我,我想我们中的大多数应该是一类人,一类需要靠自己拼搏努力改变命运的人!平凡而坚毅的过去聊聊自己的过去。出生在农村,我看过很多学习上没办法突破,转而出路一般的同村同学,如果说农村孩子也有没读书但小有成就的,那在我初高中那个年纪在我的身边没有,也不过是近些年社会经济快速发展,给了更多的人更多的机会,但能一穷二白打拼出来的实属罕见。很多亲戚朋友都说我争气,考出来了。而他们不知道,我比他们以为的更深沉早熟。陪爸妈在土地里耙过、收割过的我亲身经历着农业为主的生活带给我的触动。太阳晒是常态,插秧移秧时腰背麻木到报废、收割水稻时胳膊上一剌一剌的血印子、赶着风雨收拢谷子时的慌张……我还清晰的记着,初中时偶尔考砸的想法,只有一个:就算我看向天际,再远再远的地方,可我能想到的出路还是只有读书读出去。跌跌撞撞的青春怎么会说逝去就逝去,总要给我留下刻骨铭心的记忆。我曾为了省一点电费,大夏天把水桶接满水放在走廊上晒热,晚上就可以洗热水澡了,既省钱还环保(自然是为了省钱啊)。我也曾为了攒点学费,买了个小炖锅,白水煮面条吃了好几个月,周末会给自己加点青菜和鸡蛋,毕竟生活再苦,也要学会给自己奖励。也曾在艰苦求学的路上,跟爸妈在电话说“我很好,还有生活费,学校菜很便宜,要不了那么多钱,上次给的太多都还没花完......”后来当我遇到的人更多时,我才知道自己是“富有的”,如果自己肯开口,爸妈肯定会给生活费,如果自己不想这么将就,爸妈也会支撑起我平凡而正常的生活,但偏偏过去的生活体验让我心疼爸妈,无法开口再要学费和生活费。我研究生遇到一位同学,他在研二时去某家通信公司实习,那个时候给的实习工资是3k,不包住宿,待遇真的很低,比我在武汉的一些公司实习工资还低。他跟我宿舍对门,还比较相熟,半年后合同期满回校,他跟我讲他存了一万的学费。这个钱存的有多不易,在一线城市生活过的人应该都清楚,可能还会震撼。你很难想象一个正常人,馒头就榨菜、老干妈.....坚持了几个月,节俭是他每一天的状态。但他也凭自己再没问家里要过一分钱,不是固执,只是我们和爸妈也是双向奔赴的爱啊。努力而自信的向阳而生我经历过的人生不长,但去过很多的地方,大山、大河、大海、都市、田园我都见过;结识过很多的朋友,程序猿的世界还是比较简单,打交道没有什么弯弯绕绕;写过很多的代码,当然也出现过几次BUG(不想承认我们程序猿是写bug的,明明是互联网的搬砖人)。而今,我不用在外漂泊,也不用再向爸妈要生活费,更不用再担心吃了上顿没下顿,真诚建议不要裸辞,万一碰上了疫情,亦或是万一没拿到目标公司的offer,那就会增加无形的压力。可能是自己口袋空怕了,所以更怕资产的负增长。我看过一个公式,收入-支出=储蓄,其实可以优化一样,因为这样储蓄是可变的,具体能余多少取决于支出,我比较倾向于收入-储蓄=支出,将每月需要留存的钱提前进行基金理财、活期理财,在可计划的支出额度内进行合理的消费,感觉自己棒棒哒。目前我的工作稳定,终于减轻了爸妈的压力。我爸还没坐过飞机,本来准备这个五一带爸妈去他们朝思暮想的长城、故宫看一看中国的壮阔历史。奈何这个五天假出行人流量太太太大了,我怕他们堵在长城上,上不去,也下来,饿着了晒着了都不舒服,希望今年带爸妈出去旅行的计划可以成行。爸妈给了我们来到这个世界的机会,成与败还需我们自身努力,哪怕再苦,只愿年过半百,不负来时的路。--
2021年5月3日
其他

『图解Java并发』面试必问的CAS原理你会了吗?

compareAndSe方法首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。自旋开销问题CAS
2021年4月26日
其他

面试官:说说什么是Java内存模型?

在面试中,面试官经常喜欢问:『说说什么是Java内存模型(JMM)?』面试者内心狂喜,这题刚背过:『Java内存主要分为五大块:堆、方法区、虚拟机栈、本地方法栈、PC寄存器,balabala……』面试官会心一笑,露出一道光芒:『好了,今天的面试先到这里了,回去等通知吧』一般听到等通知这句话,这场面试大概率就是凉凉了。为什么呢?因为面试者弄错了概念,面试官是想考察JMM,但是面试者一听到Java内存这几个关键字就开始背诵八股文了。Java内存模型(JMM)和
2021年4月19日
其他

10张图告诉你多线程那些破事

头发很多的程序员:『师父,这个批量处理接口太慢了,有什么办法可以优化?』架构师:『试试使用多线程优化』第二天头发很多的程序员:『师父,我已经使用了多线程,为什么接口还变慢了?』架构师:『去给我买杯咖啡,我写篇文章告诉你』……吭哧吭哧买咖啡去了在实际工作中,错误使用多线程非但不能提高效率还可能使程序崩溃。以在路上开车为例:在一个单向行驶的道路上,每辆汽车都遵守交通规则,这时候整体通行是正常的。『单向车道』意味着『一个线程』,『多辆车』意味着『多个job任务』。单线程顺利同行如果需要提升车辆的同行效率,一般的做法就是扩展车道,对应程序来说就是『加线程池』,增加线程数。这样在同一时间内,通行的车辆数远远大于单车道。多线程顺利同行然而成年人的世界没有那么完美,车道一旦多起来『加塞』的场景就会越来越多,出现碰撞后也会影响整条马路的通行效率。这么一对比下来『多车道』确实可能比『单车道』要慢。多线程故障防止汽车频繁变道加塞可以采取在车道间增加『护栏』,那在程序的世界该怎么做呢?程序世界中多线程遇到的问题归纳起来就是三类:『线程安全问题』、『活跃性问题』、『性能问题』,接下来会讲解这些问题,以及问题对应的解决手段。线程安全问题有时候我们会发现,明明在单线程环境中正常运行的代码,在多线程环境中可能会出现意料之外的结果,其实这就是大家常说的『线程不安全』。那到底什么是线程不安全呢?往下看。原子性举一个银行转账的例子,比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元,两个操作都成功才意味着一次转账最终成功。试想一下,如果这两个操作不具备原子性,从A的账户扣减了1000元之后,操作突然终止了,账户B没有增加1000元,那问题就大了。银行转账这个例子有两个步骤,出现了意外后导致转账失败,说明没有原子性。原子性:即一个操作或者多个操作
2021年4月13日
其他

武汉最最最牛逼的IT公司全在这了

最近大学里的一个同学突然辞职回武汉了。我忍不住问他『大家都往深圳跑,你怎么回来了呢?』他说:『感觉在深圳永远也买不起房子,再说了武汉现在互联网公司也蛮多的,不愁找工作。』他继续补充『最重要的是,还能随时回家』。听到这里我没往下问了。其实现在武汉已经不光是年轻人逃离北上广的着陆地,更成为了很多毕业生扎根的首选城市。很多朋友都在考虑回二线城市发展,但是又担心二线城市公司坑多,最近我花了一些时间,梳理了武汉几乎所有的IT互联网公司,希望能帮助大家排坑。一线机会多,二线也舒服,大家慎重选择😄大厂字节跳动武汉研发中心1、简介字节跳动推出了多款有影响力的产品,包括今日头条、抖音、西瓜视频等。据了解,字节跳动武汉分公司目前在职员工约3000人+(研发和非研发)。武汉研发中心是字节跳动中国继北京、深圳、上海后第4个研发中心,成立于2018年4月。除研发中心外,字节跳动在武汉还拥有教育、汽车、销售、客服等多个团队。字节跳动在武汉主要的团队是『效率工程团队(Efficiency
2021年3月27日
其他

『玩转Redis系列』雷架整理一套组合拳包通关

互联网用户是用脚投票的,如果一个系统的体验不好,用户大概率会转向同类产品,这就要求在设计软件系统架构时,不光要注重可靠性、可用性、安全性,更要注重用户的体验。用户的体验分很多种,比如说
2021年3月12日
其他

我们为什么要分库分表?

点击关注"爱笑的架构师"右上角"设为星标"好文章送达比别人快在文章开头先抛几个问题:(1)什么时候才需要分库分表呢?我们的评判标准是什么?(2)一张表存储了多少数据的时候,才需要考虑分库分表?(3)数据增长速度很快,每天产生多少数据,才需要考虑做分库分表?这些问题你都搞清楚了吗?相信看完这篇文章会有答案。为什么要分库分表?首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈。用大白话来说就是数据库快扛不住了。数据库出现性能瓶颈,对外表现有几个方面:大量请求阻塞在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。SQL
2021年1月25日
其他

牛逼!简单的代码提交能玩出这么多花样

点击关注"爱笑的架构师"右上角菜单"设为星标"你会吗?作为一个开发人员每天必不可少要提交代码,但是你真的懂代码提交吗?这篇文章带领大家熟悉一下常用的代码提交方式,大家可以根据自己所在公司的开发模式对号入座。代码提交方式可以用一个专业术语描述:代码工作流,在
2021年1月18日
其他

高并发场景下,到底先更新缓存还是先更新数据库?

点击关注"爱笑的架构师"右上角菜单"设为星标"你会吗?在大型系统中,为了减少数据库压力通常会引入缓存机制,一旦引入缓存又很容易造成缓存和数据库数据不一致,导致用户看到的是旧数据。为了减少数据不一致的情况,更新缓存和数据库的机制显得尤为重要,接下来带领大家踩踩坑。Cache
2021年1月12日
其他

5分钟带你快速了解ServiceMesh的前世今生

点击关注"爱笑的架构师"右上角"设为星标"好文章送达比别人快原始时代1969年11月,为了便于高校间共享资源,美国国防部高级研究计划管理局建立一个名为阿帕网络ARPAnet,起初只有四个节点。阿帕网起源一年后阿帕网的节点数量增至15个,此后平均每隔二十天就有一台大型计算机接入。随着网络在世界范围不断扩大,不同国家不同地区各自形成了一个网络,操着不同方言彼此间互不相通,诸侯割据格局已经形成。隔离的阿帕网这个时候机器与机器之间通信是靠彼此约定的方式进行。计算机靠方言通信机器需要自行处理网络通信过程中遇到的丢包、乱序、重试等问题。青铜时代为了解决各国家各地区网络不能互通的问题,1973年两位年轻的小伙子开始发力了,致力于研究一种通讯方法,能够解决不同机器型号的计算机互相通信,简单说就是用普通话替代方言,这就是大家熟知的“TCP/IP”协议。鲍勃·卡恩(左)与温顿·瑟夫(右)随着
2021年1月5日
其他

Docker不香吗?为什么还要用k8s

的人气迅速攀升,成为当时最火爆的开源技术之一。当前有30%以上的企业在其AWS环境中使用Docker,并且这个数字还在继续增长。Docker使用率越来越高Docker怎么用?其实大多数人谈论
2020年12月28日
其他

万字Java知识地图助你成为Offer收割机

非常经典,这本图解设计模式也是类似的风格。由于是翻译过来的,书中有些例子可能听起来比较奇怪,貌似翻译过来的技术书都有这个问题。《设计模式-可复用面向对象软件的基础》又是一本黑色大部头书,书的作者就是
2020年12月24日
自由知乎 自由微博
其他

寒门难出贵子,我当程序员让爸妈在老家长脸了

先点击关注"爱笑的架构师"右上角..."设为星标"好文章不错过全文7千字,预计耗时17分钟,手机充好电写公众号两个半月了,一直忙着积累技术、输出技术文章,经读者朋友们的提醒才发现似乎还没有好好介绍过自己,那就趁着2020年的尾声好好复盘一次,也算是给自己每个成长阶段一个交代吧。作为一名程序员,没有过多且复杂的过往,兜兜转转的经历都是围绕着编程这条主线,我想从事这一行业的朋友看完后会有很多相同的感受。过去不过去,未来不会来,看清自己才能走的更远!走进编程,初识
2020年12月16日
其他

经理让我复盘上次Redis缓存雪崩事故

点击关注"爱笑的架构师"右上角"设为星标"好文章不错过事故背景公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了。经理让我带同事们一起复盘这次线上事故。什么原因造成的?抢购活动计划是零点准时开始,22:00
2020年11月9日
其他

原来10张图就可以搞懂分布式链路追踪系统原理

点击关注"爱笑的架构师"右上角"设为星标"好文章不错过分布式系统为什么需要链路追踪?随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通信变为分布式消息,这些组件共同构成了繁杂的分布式网络。微服务架构(极简版)假如现在有一个系统部署了成千上万个服务,用户通过浏览器在主界面上下单一箱茅台酒,结果系统给用户提示:系统内部错误,相信用户是很崩溃的。运营人员将问题抛给开发人员定位,开发人员只知道有异常,但是这个异常具体是由哪个微服务引起的就需要逐个服务排查了。界面出现异常难以排查后台服务开发人员借助日志逐个排查的效率是非常低的,那有没有更好的解决方案了?答案是引入链路追踪系统。什么是链路追踪?分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。链路跟踪主要功能:故障快速定位:可以通过调用链结合业务日志快速定位错误信息。链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。链路追踪基本原理链路追踪系统(可能)最早是由Goggle公开发布的一篇论文《Dapper,
2020年11月6日
其他

13张图彻底搞懂分布式系统服务注册与发现原理

在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。引入服务注册与发现组件的原因先来看一个问题,假如现在我们要做一个商城项目,作为架构师的你应该怎样设计系统的架构?你心里肯定在想:这还不容易直接照搬淘宝的架构不就行了。但在现实的创业环境中一个项目可能是九死一生,如果一开始投入巨大的人力和财力,一旦项目失败损失就很大。作为一位有经验的架构师需要结合公司财力、人力投入预算等现状选择最适合眼下的架构才是王道。大型网站都是从小型网站发展而来,架构也是一样。任何一个大型网站的架构都不是从一开始就一层不变的,而是随着用户量和数据量的不断增加不断迭代演进的结果。在架构不断迭代演进的过程中我们会遇到很多问题,技术发展的本质就是不断发现问题再解决问题,解决问题又发现问题。单体架构在系统建立之初可能不会有特别多的用户,将所有的业务打成一个应用包放在tomcat容器中运行,与数据库共用一台服务器,这种架构一般称之为单体架构。单体架构-应用和数据库共同部署在初期这种架构的效率非常高,根据用户的反馈可以快速迭代上线。但是随着用户量增加,一台服务的内存和CPU吃紧,很容易造成瓶颈,新的问题来了怎么解决呢?应用与数据分离随着用户请求量增加,一台服务器的内存和CPU持续飙升,用户请求响应时间变慢。这时候可以考虑将应用与数据库拆开,各自使用一台服务器,你看问题又解决了吧。单体架构-应用和数据库分离突然有一天扫地阿姨不小心碰了电线,其中一台服务器掉电了,用户所有的请求都报错,随之而来的是一系列投诉电话。集群部署单实例很容易造成单点问题,比如遇到服务器故障或者服务能力瓶颈,那怎么办?聪明的你肯定想到了,用集群呀。应用集群部署集群部署是指将应用部署在多个服务器或者虚机上,用户通过服务均衡随机访问其中的一个实例,从而使多个实例的流量均衡,如果一个实例出现故障可以将其下线,其他实例不受影响仍然可以对外提供服务。随着用户数量快速增加,老板决定增加投入扩大团队规模。开发团队壮大后效率并没有得到显著的提高,以前小团队可以一周迭代上线一次,现在至少需要两到三周时间。业务逻辑越来越复杂,代码间耦合很严重,修改一行代码可能引入几个线上问题。架构师意识到需要进行架构重构。微服务架构当单体架构演进到一定阶段后开发测试的复杂性都会成本增加,团队规模的扩大也会使得各自工作耦合性更严重,牵一发而动全身就是这种场景。单体架构遇到瓶颈了,微服务架构就横空出世了。微服务就是将之前的单体服务按照业务维度进行拆分,拆分粒度可大可小,拆分时机可以分节奏进行。最佳实践是先将一些独立的功能从单体中剥离出来抽成一个或多个微服务,这样可以保障业务的连续性和稳定性。微服务架构如上图将一个商用应用拆分为六个独立微服务。六个微服务可以使用Docker容器化进行多实例部署。架构演化到这里遇到了一个难题,如果要查询用户所有的订单,用户服务可能会依赖订单服务,用户服务如何与订单服务交互呢?订单服务有多个实例该访问哪一个?通常有几种解决办法:(1)服务地址硬编码服务的地址写死在数据库或者配置文件,通过访问DNS域名进行寻址路由。服务元数据硬编码服务B的地址硬编码在数据库或者配置文件中,服务A首先需要拿到服务B的地址,然后通过DNS服务器解析获取其中一实例的真实地址,最后可以向服务B发起请求。如果遇到大促活动需要对服务实例扩容,大促完需要对服务实例进行下线,运维人员要做大量的手工操作,非常容易误操作。(2)服务动态注册与发现服务地址硬编码还有一个非常致命的问题,如果一台实例挂了,运维人员可能不能及时感知到,导致一部分用户的请求会异常。引入服务注册与发现组件可以很好解决上面遇到的问题,避免过多的人工操作。架构演进总结在单体架构中一个应用程序就是一个服务包,包内的模块通过函数方法相互调用,模型足够简单,根本没有服务注册和发现一说。在微服务架构中会将一个应用程序拆分为多个微服务,微服务会部署在不同的服务器、不同的容器、甚至多数据中心,微服务间要相互调用,服务注册和发现成为了一个不可或缺的组件。服务注册与发现基本原理服务注册与发现是分为注册和发现两个关键的步骤。服务注册:服务进程在注册中心注册自己的元数据信息。通常包括主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的信息。服务发现:客户端服务进程向注册中心发起查询,来获取服务的信息。服务发现的一个重要作用就是提供给客户端一个可用的服务列表。服务注册服务注册有两种形式:客户端注册和代理注册。客户端注册客户端注册是服务自己要负责注册与注销的工作。当服务启动后注册线程向注册中心注册,当服务下线时注销自己。客户端注册这种方式的缺点是注册注销逻辑与服务的业务逻辑耦合在一起,如果服务使用不同语言开发,那需要适配多套服务注册逻辑。代理注册代理注册由一个单独的代理服务负责注册与注销。当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作。代理注册这种方式的缺点是多引用了一个代理服务,并且代理服务要保持高可用状态。服务发现服务发现也分为客户端发现和代理发现。客户端发现客户端发现是指客户端负责向注册中心查询可用服务地址,获取到所有的可用实例地址列表后客户端根据负载均衡算法选择一个实例发起请求调用。客户端发现这种方式非常直接,客户端可以控制负载均衡算法。但是缺点也很明显,获取实例地址、负载均衡等逻辑与服务的业务逻辑耦合在一起,如果服务发现或者负载平衡有变化,那么所有的服务都要修改重新上线。代理发现代理发现是指新增一个路由服务负责服务发现获取可用的实例列表,服务消费者如果需要调用服务A的一个实例可以直接将请求发往路由服务,路由服务根据配置好的负载均衡算法从可用的实例列表中选择一个实例将请求转发过去即可,如果发现实例不可用,路由服务还可以自行重试,服务消费者完全不用感知。代理路由服务注册心跳机制如果服务有多个实例,其中一个实例出现宕机,注册中心是可以实时感知到,并且将该实例信息从列表中移出,也称为摘机。如何实现摘机?业界比较常用的方式是通过心跳检测的方式实现,心跳检测有主动和被动两种方式。被动检测是指服务主动向注册中心发送心跳消息,时间间隔可自定义,比如配置5秒发送一次,注册中心如果在三个周期内比如说15秒内没有收到实例的心跳消息,就会将该实例从列表中移除。心跳机制-被动检测上图中服务A的实例2已经宕机不能主动给注册中心发送心跳消息,15秒之后注册就会将实例2移除掉。主动检测是注册中心主动发起,每隔几秒中会给所有列表中的服务实例发送心跳检测消息,如果多个周期内未发送成功或未收到回复就会主动移除该实例。心跳机制-主动检测业界常用的服务注册与发现组件对比了解服务注册与发现的基本原理后,如果你要在项目中使用服务注册与发现组件,当面对众多的开源组件该如何进行技术选型?在互联网公司里,有研发实力的大公司一般会选择自研或者基于开源组件进行二次开发,但是对于中小型公司来说直接选用一款开源软件会是一个不错的选择。常用的注册与发现组件有eureka,zookeeper,consul,etcd等,由于eureka在2018年已经宣布放弃维护,这里就不再推荐使用了。业界开源组件下面结合各个维度对比一下各组件。组件优点缺点接口类型一致性算法zookeeper1.功能强大,不仅仅只是服务发现;2.提供watcher机制可以实时获取服务提供者的状态;3.广泛使用,dubbo等微服务框架已支持;1.没有健康检查;2.需要在服务中引入sdk,集成复杂度高;3.不支持多数据中心;sdkPaxosconsul1.开箱即用,方便集成;2.带健康检查;3.支持多数据中心;4.提供web管理界面;不能实时获取服务变换通知restful/dnsRaftetcd1.开箱即用,方便集成;2.可配置性强1.没有健康检查;2.需配合三方工具完成服务发现功能;3.不支持多数据中心;restfulRaft从整体上看consul的功能更加完备和均衡。接下来以consul为例详细介绍一下。Consul——值得推荐的服务注册与发现开源组件简单认识一下ConsulConsul是HashiCorp公司推出的开源工,使用Go语言开发,具有开箱即可部署方便的特点。Consul是分布式的、高可用的、
2020年11月2日
其他

两年半完成逆袭,他终于拿到字节跳动的Offer

你见过跨专业考计算机的,你也可能见过寒门子弟通过IT改变命运,但请相信我,真正经历过这些之后再回过头来看反而只有平静。我是亲眼看着这位研究生室友完成逆袭,他花了两年半。大学选专业竟然是为了造原子弹?高中升大学时,除了语数外那些上过课的专业外,知道最多的也就是计算机专业了,根本没有考虑过专业会决定以后的就业方向,更没想过不同专业就业形势差距会这么大。在一次校园企业宣讲会上,伊利集团说他们可以开到七千多的工资,左边的妹子惊呼到“哇哦,这么高”,右边的小哥嘀咕到“七千多这么低,谁会去哦”。对了,多说一句,左边是经管系的,右边是计算机系的。那时候选专业的初衷还是蛮高大上的,能源呢,一个说不准我就去研究原子弹了(笑哭)。有时候大家自嘲小时候想改变世界,读书时想改变国家,进入社会才发现改变自己都很难。我听着十分有感触,我们这代人可不就是这样的嘛。我们读书时都是看着伟人的事迹过来的,每次都读的热血沸腾,恨不能废寝忘食再学二十四小时!还有一个原因,高中毕业选专业,还真是丰满的理想遮蔽了我透过现象看本质的双眸,加之对这些五花八门的专业并不是很清楚,主要是那时候也没人告诉我选专业不是选理想,更不是选兴趣爱好啊(流下了后悔的眼泪)。所以选择能源系就成了我梦想的开始,虽然后来就业时啪啪打脸,这就是后话了。就业难,那就换个专业耍耍呗!我认为可以把大学生分为三种人:冥思苦想修仙派(专注小说和游戏)、独孤求败学霸派(常年活跃在图书馆和教室)、对酒当歌人生几何快乐派(完成老师布置的课堂作业应该就够了吧)。本科时候的我应该是第三种,不知道是现实毒打了我,还是我把理想给买活埋了,反正大学时没当成学霸,如果再给我一次机会,我一定还做第三种。我是一个中庸的人,总觉得人生短短几十年,如果不及时享乐,那万一没有下辈子可不就亏了,当然不号召大家学我,毕竟都像我这样,咱们国家和社会如何前进。没做学霸最直接的损失就是没能拿到国奖那一大笔钱钱,实在可惜。遭受了就业的现实毒打后,我做了继选专业之后的第二个冲动决定,换个专业耍。要说换专业,这次我可是做了一些功能,没有再追随理想,经过一番深入浅出的研究和朋友间口头调研后,我选择了计算机专业,是不是很有远见,虽然现在回头看这个决策也没什么前瞻性(掩面哭泣)。跨专业那就得认真准备,命运好歹没有把我放弃,就那么一报名,随随便便那么一考,还真让我给考上了,从此我就跟IT结缘。真正跟导师搞研究的时候发现竟也没想象的那么简单,现实还在不停的扇我耳光。实验室人少,什么前端后端都得一把抓,跟师兄学习,Java得搞、信息安全也得搞、文档管理还是我。重复的早上实验室打卡、码代码、写文档、跟需求方确认交付时间、需求的变更......晚上打卡回宿舍。高中般的三点一线,简单又无趣。好巧不巧,真觉得无趣的时候,学院合作的企业来找实习生,Base北京,从小到大还一次都没去过首都,去实习能涨涨见识还可以挣点生活费,应该还不错!北漂不易,实习的我竟然还攒到一万👍实习工资四千,不包食宿,还好还好,对于还在读书的学生,没那么多需求也就意味着没那么多花钱的地方。去实习前我就想好了,这次出来得攒点钱,作为自己回校后的生活费。说实话,读研的同学竟然很多都已经可以不问家里人要钱了,除了国家给的补贴,还有导师给的工资,想想自己着实惭愧。回头来看,北漂那段时光真不容易,能熬过来我都佩服我自己,主要是怎么可以为了生活扣扣搜搜成那样。电视上经常可以看到,女主角指着繁华的北京质问男主角“我想要融入这个城市,我想要在这里扎根,我有错吗?我不想在小房子里过一辈子,我有错吗?“对于我,吃着馒头就着榨菜,从来没想过这个问题,管好自己的一亩三分地便是自己当时最大的成就了。我住在北京的......搞不清多少环之外,吃了五个月的馒头榨菜,住的比较简单且有点偏僻。学生时候物质欲望比较简单,还真是尤其容易满足,有吃有住有工作还有结余,想着回学校后可以靠自己撑到毕业,自豪感油然而生。回到学校时我竟然攒了一万,好像还是比较牛的。反正我同学觉得我还是比较坚强、能吃苦耐劳,其实当时也就想着回学校的生活费有着落了。所以啊,苦不苦都是欲望这货造成的,简简单单不搞那么多想法,连自己苦不苦都不知道不就得了嘛。当然那是那个时候的我,不是现在的我。毕业2.5年后进入头条,我才觉得自己入了IT的门......在进头条前这些经历不该忽略,忘了交代研究生时我还是蛮积极的,当上了学院研究生学生会主席,title是不是还可以。当时也没想太多,就觉得本科阶段没什么精彩的过往,研究生应该过的不一样些。其实学生会主席也没什么,自己当过以后发现就那么回事,带着几个部长,同学间传达一些学院的要求,组织一些活动。虽说经历很普通,但为老师们服务,为同学们服务的过程中,对于自己的与人交流能力和情商提高着实有一定的帮助,发现性格外向、办事靠谱、语言逻辑强的同学很有魅力。由于跨专业,自己底子自然不如本科就是计算机的同学,由于自己性格中庸,所以读研也还是以前那种态度,按时完成作业型。要走IT这条路,不用等到毕业,你就可以看到人和人之间的差异。实习时好多同学已经是BAT
2020年10月28日
其他

内存泄露的原因找到了,罪魁祸首居然是Java TheadLocal

ThreadLocal使用不规范,师傅两行泪组内来了一个实习生,看这小伙子春光满面、精神抖擞、头发微少,我心头一喜:绝对是个潜力股。于是我找经理申请亲自来带他,为了帮助小伙子快速成长,我给他分了一个需求,这不需求刚上线几天就出网上问题了😭后台监控服务发现内存一直在缓慢上升,初步怀疑是内存泄露。把实习生的PR都找出来仔细review,果然发现问题了。由于公司内部代码是保密的,这里简单写一个demo还原场景(忽略代码风格问题)。public
2020年10月26日
其他

想自己写框架?不会写Java注解可不行

用注解一时爽,一直用一直爽Java后端开发进入spring全家桶时代后,开发一个微服务提供简单的增删改查接口跟玩泥巴似的非常简单,一顿操作猛如虎,回头一看代码加了一堆注解:@Controller
2020年10月22日
其他

程序员版《我和我的家乡》,拼搏奋斗的IT人是家乡的骄傲!

记者:导演,国庆节您要上个电影《程序员版我和我的家乡》,广大IT同胞都想知道电影讲了些什么。
2020年10月14日
其他

实战|还在用单机版?教你用Docker+Redis搭建主从复制多实例

准备好redis配置文件redis.conf下载链接:https://pan.baidu.com/s/14tWHtk3mch3e3VlT9TYX1A
2020年10月13日
其他

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

作者:浪漫先生https://juejin.im/post/6854573212831842311前言基于Redis使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。背景我们项目中的抢购订单采用的是分布式锁来解决的。有一次,运营做了一个飞天茅台的抢购活动,库存100瓶,但是却超卖了!要知道,这个地球上飞天茅台的稀缺性啊!!!事故定为P0级重大事故...只能坦然接受。整个项目组被扣绩效了~~事故发生后,CTO指名点姓让我带头冲锋来处理,好吧,冲~事故现场经过一番了解后,得知这个抢购活动接口以前从来没有出现过这种情况,但是这次为什么会超卖呢?原因在于:之前的抢购商品都不是什么稀缺性商品,而这次活动居然是飞天茅台,通过埋点数据分析,各项数据基本都是成倍增长,活动热烈程度可想而知!话不多说,直接上核心代码,机密部分做了伪代码处理。。。public
2020年10月13日
其他

硬核|华为鸿蒙系统尖刀武器之分布式软总线技术

什么是分布式软总线?分布式软总线技术是基于华为多年的通信技术积累,参考计算机硬件总线,在1+8+N设备间搭建一条“无形”的总线,具备自发现、自组网、高带宽低时延的特点。简单解释一下什么是1+8+N:
2020年10月11日
其他

女程序员在互联网界到底有没有被歧视?

虽说雷架是个男子汉,但工作的经历丰富,也遇到过不少女同事,华为的、网易的、百度的、斗鱼的、同程的、阿里的、腾讯的......大厂小厂都有,也算是见过很多现实的事情,今天给大家揭露下这个行业的潜规则,让大家看看更为立体的女程序员。一、面试问题——你有对象了?你结婚了吗?有考虑什么时候结婚吗?什么时候生孩子?会不会要二胎?雷架的女同事们说在面试时总是少不了被问到上面的问题,对象不会跑吗?跑了咋结婚?生孩子要二胎,难道是想怀就能怀上的?难道我先说不要后面再要不行吗?到了年纪的女程序员,择业不是选工作,而成了工作选自己。男同事技术的沉淀积累,越来越吃香,年薪越跳越高,女程序员怎么就每次跳槽都是贬值的过程。雷架面试过不少应届生、外包和社招的女程序员,知道大家进入这个行业都是一腔热血和报复,谁不是名牌大学毕业?谁又不是想做成番成绩?但招聘从简历这一趴就已经不平等了。雷架研究生的同实验室师妹在校招时就抱怨过招聘的不平等。人间真实啊,其实雷架待过的这些公司,大厂反而对女性的歧视还不那么严重,笔试、面试的机会都是正常给了,只要你有能力,不会将你拒之门外,这倒是堂堂国企,反而比私企更歧视女性,真是让雷架大跌眼镜了。二、升职加薪——女程序员结婚后就要顾家庭,机会不如留给男同志!这些画面熟不熟悉,大多数公司里男程序员比例总是比女程序员高,雷架在网易时的一个项目组,十几个开发,就一个妹纸。女生在程序员的圈子里可以说是稀有物种了,也不知道是实力感动了领导,还是领导觉得需要一个女生来调节气氛。倒是测试组有不少妹纸,运营组妹纸数量就更可观了,开发组同学只有羡慕嫉妒的份儿了。每年部门都有一定比例的升职加薪的机会,大佬们在决策时总会考虑多种因素,总觉得女程序员加班加不过男程序员,吃苦不如男程序员(所以男程序员是体力工吗?)。尤其是怀孕的女程序员,马上就要休一个长长的产假,休完产假还不知道会不会直接离职,好的升职加薪的机会给了,人再走了不就浪费了名额嘛,不如给男程序员,还能感激涕零一番。女生作为这个行业的弱者,明知潜规则却无力改变,面对不平等,却没有申诉的机会,去争取被拒绝了岂不是更尴尬。三、续签——都结婚生孩子了,精力不在工作上,就不续签了吧!雷架的一位前同事刚刚和东家不续签了,原因是生了二胎,不能加班。女同事应届毕业进入这家公司,一年多就从14级升到15级,能力在一批人里也是佼佼者,可从那之后三年始终是15级,同一批的男同事股票都有了,年薪早已不是一个水平了,这都是因为她后来结婚生孩子了。生孩子对于一个女生意味着什么,和对于一位女程序员的意义是不一样的。一位女程序员如果结婚生子,意味着事业的瓶颈,因为这类人有了家庭的牵绊。婴儿可以不黏爸爸,但一定会黏妈妈,女生到了这个阶段都会母爱爆棚,甚至高于事业。雷架的这位同事也免不了同样的境遇,她不再能做到为奋斗而彻夜加班,而是每天七点必须回家哄孩子睡觉。有短时间她婆婆脚扭伤住院,她疲于奔波,不停请假,一边照顾孩子,没有公司会喜欢这样的员工。可她也没办法,最后准备离职,但一时半会没人接替,因此还是继续留着,但过了那段时间,半年后该续签的时候公司不再跟她续签了,这样的结局不能再真实。四、女程序员的出路——进体制、创业、再择业、全职在家进体制:由于女生天然的弱势群体的特性,所以思来想去还是进体制比较合适,总有人说体制内工资低,这也要看看是哪里是什么单位,既然破釜沉舟不如一步到位,要考就考最好的,女程序员从来都是很优秀的一批人。创业:创业的格局就大了,少儿编程培训、企业员工技术培训、幼儿教育,当然这些对于资金和技术层次都有一定的要求,创业需谨慎。再择业:再择业的面就大了,如果准备的充分,好的互联网公司还是可以搏一搏。也可以去培训机构当老师,待遇也还不错。全职在家:男同志们好好努力吧,别让自己媳妇儿那么辛苦,下得厨房上得厅堂的!说归说笑归笑,程序员的压力只有这个行业的人才懂,都说外卖员辛苦、清洁工辛苦,程序员也是底层的打工仔,社会也该给这群人多点注意,少加班多陪家人。-
2020年10月8日
其他

一张图搞懂Redis缓存雪崩、缓存穿透、缓存击穿

点击放大看在实际生产环境中有时会遇到缓存穿透、缓存击穿、缓存雪崩等异常场景,为了避免异常带来巨大损失,我们需要了解每种异常发生的原因以及解决方案,帮助提升系统可靠性和高可用。缓存穿透什么是缓存穿透?缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。缓存穿透常用的解决方案(1)布隆过滤器(推荐)布隆过滤器(Bloom
2020年10月6日
其他

【硬核万字总结】看完这20道Redis面试题,女朋友都面上阿里了

(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。自动触发时机当aof_current_size>auto-aof-rewrite-minsize
2020年10月3日
其他

离开华为换种生活,它不香吗?

-吐血推荐:【程序员的故事】如果可以选择,我再也不想在国企当程序员了【程序员的故事】30岁的程序员出路在哪里?【玩转Redis面试第3讲】一次性将Redis
2020年9月29日
其他

如果可以选择,我再也不想在国企当程序员了

菜架:雷架,你知不知道咱们组表现优秀,最后组里准备留的那个实习生最后为啥没来不?雷架:不知道,没听说,不关心!菜架:要不说你一心只顾敲代码,两耳不听身边事呢,那个实习生最后竟然放弃了互联网大厂去了国企,也是鬼迷心窍了。雷架:额,额,额......曲项向天歌,白毛浮绿水,噗,扯远了。其实啊,现在互联网蓬勃发展,去国企,去大厂,抑或是去小厂,都可以有不错的发展,国企程序员难道真如外面大厂以为的那么不中看也不中用吗?国企程序员的高门槛——它左手端着985,右手还挑着211就我所知的国企程序员,门槛可都不低哟,那是左手捏着985,右手牵着211,眼睛不看普一二。早些年互联网蓬勃发展,高收入高挑战,吸引了不少年轻人前赴后继,那一波人也为整个中国互联网的发展奠定了不错的基调。但这几年经济下行,加之不断唱衰的30岁的程序员,让跨入30岁门槛的这批人紧张又踌躇,是走是留,敢问路在何方,路在看不到的远方~~~创业不易,且创且小心,一个不注意,几十万打水飘,再一个不注意,又被合伙人给卖了,啧啧啧,我们这样一群心眼儿耿直又简单的程序员,怎么玩得过管理大师们?难道就等着被社会淘汰,回到农村老家,耕种那一亩三分地吗?(哦,忘了,自户口迁出后,再分地都没我们的份儿了)我们那一届,国企开始吃香,也不知道是因为在二线城市还不错的待遇,还是大家刚毕业就已经奋斗不动了,竟然在面试时碰见了不少学院的同学,最后竟真的也去了上十个,两百多号人,一些去了大厂,一些去了精英奋斗者的”工厂“,少数一些去了小厂。原来国企不吃香的时候,招聘都是能211就不要普一二,我们那一届忽然去了很多985的面试者,于是,有了985,开始挑211,门槛已经不是普一二能够得上了。谁说读书无用了,寒门子弟你不读个书镀个金,你连个稳定的工作都捞不到。当老板?刘强东还是中国人民大学的呢,马云还读了个大学本科不是。不要以为乔布斯辍学你也辍学,要相信人和人生而不同,也就是从出生不论相貌还是智商都是有巨大的差距。当然并不是说不读书就无出路,也不是说不读书当不上大老板,不要那么较真儿嘛~~~(哎呀,被自己肉麻到了,我可是真二八经的男子汉)朝九晚六——一入国企深似海,进也进不了,退也不想退国企就必须要有国企的鸭子🦆(“样子”,一不小心打错字了)。你拿国企的工作时长和互联网公司,抑或是和私企小厂比,那都是不一样的,朝九晚六你可以拥有。有个阿里的朋友在账户系统修修补补三年后,薅起头顶已不多的发丝,觉得人生不能就这样过去了,自己还没找老婆,还没生娃,还没享受到呢。于是找到正在国企任职的室友(室友的关系总是亲密无间,尤其男人间),室友够意思,不光内推了工作,还介绍了对象。朋友毅然决然带着剩下的头发和弯曲了的脊背,从杭州回到了中部地区,自此真就过上了朝九晚六,老婆孩子热炕头的日子。但国企领导也不是闲着不找事的,也想各种学习互联网,你搞人工智能我也搞,你搞区块链我也可以,既然技术上学不到一模一样,我们还可以学习学习互联网的加班呀,然后就鼓励加班,加班有加班工资,加班到几点才可以报销车费,经常不加班的同学领导办公室走一趟。有一天,朋友被领导叫到办公室沟通,问到“你最近怎么不加班呐,别个都加班”,朋友阿里出来的,技术上过硬,自然有自己的底气,领导面前不懦弱,回答到“我事情做完了,别人不行需要加班,我不需要”。领导肯定心想“我太南了”。大家可不要学我朋友,这得有领导赏识+技术过硬,缺一不可,领导随时可能把你蹬了,要不就给你穿小鞋。有人来就有人去,这样看,待遇还不错,又不加班,为什么会有人要离职呢?所谓“食之无味,弃之可惜”,国企的工作大抵都是如此。围墙里的人想出去,围墙外的人想进来。进入这里想要有大的发展,大的机会去一展拳脚,基本不可能,论资排辈的情况还是很严重。所以应届毕业生进来后看清了国企程序员的真实情况,有更大报复或者理想的,自然不愿意待在这里。可能会有人好奇,国企程序员安逸惯了,能去哪里哦。前面说了,来这里的都不是一般学子,高中能过的独木桥,还怕互联网公司那点技术面吗?据我所知,朋友所在的国企跳槽去阿里的最多,也有去斗鱼(当然是那个时候斗鱼还在巅峰的时候过去的)。有人一毕业就在国企,想去外面的互联网浪一浪,也就有寻找更安逸更稳定的工作的。所以就有人考编制进入高校当老师抑或其它铁饭碗,毕竟现在很多国企也企业化,员工也是合同工。喝茶退休——颐养天年每个人都有每个人的选择,也就有不同的活法,哲学角度来讲叫求同存异。国企程序员虽然也是撸代码的,也是Spring、SpringBoot、Redis、Docker、Oracle、Mongo......各种新技术老技术玩的666。但终究带着国企的性质,基本不犯大错,公司是不会开除你的,留下来养老是不存在问题的。有人吃互联网的饭就有人吃国企程序员的饭,正所谓“甲之蜜糖,乙之砒霜”,萝卜青菜各有所爱。总结:各位同行切记——转行须谨慎,毕竟都是要写进履历的,要是想去互联网公司,那国企这段经历并不怎么加分哦,但实力决定高度,你觉得你可以,那你就可以!-
2020年9月26日
其他

30岁的程序员出路在哪里?

30岁是精神小伙和沧桑大叔的分界线?“你都30岁啦,那在IT圈也干不了几年了,比你年轻的还比你要的工资少,学的比你快,还比你能加班,啧啧啧......“
2020年9月24日
其他

【玩转Redis面试第3讲】一次性将Redis RDB持久化和AOF持久化讲透

什么是持久化?持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。图片还可以从如下两个层面简单的理解持久化
2020年9月22日
其他

【玩转Redis面试第2讲】面试官再问Redis事务把这篇文章扔给他

Redis事务生命周期开启事务:使用MULTI开启一个事务命令入队列:每次操作的命令都会加入到一个队列中,但命令此时不会真正被执行提交事务:使用EXEC命令提交事务,开始顺序执行队列中的命令2.
2020年9月18日
其他

【玩转Redis面试】01Redis数据结构和常用命令速记

Redis常用命令参考更多命令语法可以参考官网手册:https://www.redis.net.cn/order/是不是觉得太简单啦,没关系,这是一个完整的系列,收藏好继续看一篇哟~-
2020年9月16日