《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

2023-11-08

        马云说过“一个好的东西往往是是说不清楚的”,姑且不论这句话的对与错。但我真的很佩服《淘宝技术这十年》这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各种技术描述清楚,而且过程中读起来非常有意思。
        该读书笔记中参杂了很多原文的知识,因为我实在无法割舍,都挺有意思的;同时记录一些有用的知识,通过这本书能介绍些学过的知识或面试中可能出现的题目及作者所思,文章还是非常有趣的,希望对大家有所帮助!

一. Java时代 脱胎换骨

        我的师傅黄裳曾经说过“好的架构图充满美感”。一个架构好不好,从审美的角度就能看出来;后来我看了很多系统的架构,发现这个言论基本成立。反观淘宝以前两个版本的架构,如下图所示,你看哪个比较美?
 

        显然第一个比较好看,第二个显得头重脚轻,这也注定了它不是一个稳定的版本,只存活了不到半年的时间。2004年初,SQLRelay的问题解决不了(不能总这样通过不断地重启保证系统的稳定性),数据库必须要用Oracle,那么从哪里动刀呢?只有换开发语言了。换什么语言好?用Java。
       Java是当时最成熟的网站开发语言,它有比较良好的企业开发框架,被世界上主流的大规模网站普遍采用。另外,有Java开发经验的人才也比较多,后续维护成本会比较低。
        到2004年上半年,淘宝网已经运行了一年的时间,这一年积累了大量的用户,也快速开发了很多功能,当时这个网站已经很庞大了,而且新的需求还在源源不断地增加。把一个庞大的网站的开发语言换掉无异于脱胎换骨。在换的过程中还不能拖慢业务的发展,这无异于边换边跑,对时间和技术能力的要求都非常高。
        做这样的手术,需要请第一流的专家来主刀,现在再考一下大家:亲,如果你在这个创业团队中,请什么样的人来做这件事呢?
        PS:我的想法是请多隆,不是说“有困难找多隆”吗?他就相当于武侠小说中的扫地僧,也是淘宝的“神”。但他可能也需要自己学习吧!所以这样的答案也是不正确的,《淘宝技术这十年》读书笔记最后一篇博客我也将介绍淘宝网众多的大牛,其中第一位就是多隆。顺便说说,大家知道马云最喜欢的金庸小说里的人物是谁吗?没错,他就是风清扬。当时看到一个新闻,说马云想出演《笑傲江湖》风清扬一角色,找了很多关系,最后还是被导演无情的拒绝了,不知道消息是否真实,但确实挺有意思的!
        我们的答案是请Sun公司的人。没错,就是创造Java语言的那家公司,世界上没有比他们更懂Java的了。除此之外,还有一个不为人知的原因,我刚才说到Java被世界上主流的大规模网站普遍采用,其中有一个网站就是eBay,那时eBay的系统刚刚从C++改到Java,而且就是请Sun的工程师改造成Java架构的,这下你懂了吧?他们不仅更懂Java,而且更懂eBay。
        Sun公司的这帮工程师的确很强大,在笔者2004年年底淘宝的时候,他们还在,我有幸与他们公事了几个月。现在摆在他们面前的问题是用什么办法把一个庞大的网站从PHP语言迁移到Java?而且要求在迁移过程中不停止服务,原来系统的bugfix和功能改进不受影响。亲,你是架构师你怎么做?
        有人的答案是写一个翻译器,如同把中文翻译成英文一样,自动翻译(现在机器翻译是自然语言处理的重要应用)。我只能说你这个想法太超前了,“too young,too simple, sometimes native”。当时没有,现在也没有人能做到。
        他们的大致方案是给业务分模块,一个模块一个模块地渐进式替换。如用户模块,老的member.taobao.com继续维护,不添加新功能,新功能在新的模块上开发,跟老的模块共用一个数据库,开发完毕之后放到不同的应用集群上,另开一个域名member1.taobao.com,同时在替换老的功能;替换一个,就把老的模块上的功能关闭一个,逐渐把用户引导到member1.taobao.com,等所有的功能都替换完之后,关闭member.taobao.com
        从设计上来看,这个member1的二级域名应该是一个过渡状态,但我们把member域名的代码下线以后,发现很难把member1切换回member,因为有些地方把链接写死了,于是后来很长时间里我们都在用member1.taobao.com这个奇怪的域名。一年之后,有另一家互联网公司开始做电子商务,他们的域名也叫member1.xx.com、auction1.xx.com,复制得毫无保留,我们只能会心一笑。

二. MVC框架

        说了开发模式,再说说用到的Java MVC框架。当时struts1.x是用得比较多的框架,但是用过webwork和struts2的人可能知道,struts1.x在多人协作方面有很多致命的弱点。由于没有一个轻量框架作为基础,因此很难扩展,这样架构师对于基础功能和全局功能的控制就很难做到。
        而阿里巴巴的18个创始人中有个架构师周悅虹,他在Jakarta Turbine的基础上做了很多扩展,打造另一个阿里巴巴自己用的MVC框架WebX:
        http://www.openwebx.org/docs/Webx3_Guide_Book.html
        这个框架易于扩展,方便组件化开发,它的页面模板支持JSP和Velocity等,持久层支持ibatis和hibernate等,控制层可以用EJB和Spring(Spring是后来才有的)。项目组选择了这个强大的框架。
        另外,当时Sun在全世界大力推广他们的EJB,虽然淘宝的架构师认为这个东西用不到,但他们还是极力坚持。在经历了很多次的技术讨论、争吵之后,这个系统的架构就变成了下图的形式。


        MVC框架是阿里的WebX,控制层用了EJB,持久层是ibatis。另外为了缓解数据库的压力,商品查询和店铺查询放在搜索引擎中。这个架构图是不是好看了一点?
        Sun的这帮工程师开发淘宝网后,用同样的架构又做了一个很牛的网站,叫“支付宝”。(上一篇说过支付宝最初是淘宝的“安全交易”功能,这个功能后来独立出来,成立了一个网站,也成立了一个公司,就是现在的支付宝。把支付宝从淘宝分出去的人,就是Sun公司的这几个人。)下图是支付宝第一次员工大会。


        上面的结构中,引入了搜索引擎iSearch(它是在LAMP[Linux+Apache+MySQL+PHP]系统运行一段时间之后被多隆引进的,换为Oracle之后知识替换一下数据源)。其实这个搜索引擎的原理很简单,就是把数据库里的数据dump(倾倒)成结构化的文本文件后,放在硬盘上,提供Web应用以约定的参数和语法来查询这些数据。
        这看起来不难,难的是数以亿计的信息,怎么做到快速更新呢?这好比你做了一个网站,在百度上很快就能搜到,你一定很满意了。但是如果你发布一件商品,在淘宝上过了1个小时还搜不到,你肯定很郁闷。另一个难点是如何保证非常高的容量和并发量?再往后面就要考虑断句和语义分析的问题,以及推荐算法等更加智能的问题。这些内容先不详细介绍,因为搜索引擎的技术已经足以写好几本书了。
        其实在任何时候,开发语言本身都不是系统的瓶颈,业务带来的压力更多的存在于数据和存储方面。前面也说到,MySQL撑不住之后换位Oracle,Oracle的存储一开始在本机上,后来在NAS上,NAS撑不住了用EMC的SAN存储,再后来,Oracle的RAC撑不住了,数据的存储方面就不得不考虑使用小型机。在2004年夏天,DBA七公、测试工程师郭芙和架构师行癫,踏上了去北京测试小型机的道路。他们带着小型机回来的时候,然后Oracle就运行在小型机上;存储方面,从EMC低端CX存储到Sun oemhds高端存储,再到EMC dmx高端存储,一级一级地往上跳。
        到2004年底,淘宝网已经有4百多万种商品了,日均4千多万个PV,注册会员达到400万个,全网成交额达10亿元。
        到现在为止,我们已经用上了IBM的小型机、Oracle的数据库、EMC的存储,这些东西都是很贵的。有人说过“钱能解决的问题,就不是问题”,但随着淘宝网的发展,在不久以后,钱已经解决不了我们的问题了。花钱买豪华的配置,也许能支持1亿个PV的网站,但淘宝网的发展太快,到了10亿个PV怎么办?到了百亿怎么办?
        在几年以后,我们不得不创造技术,解决这些只有世界顶尖的网站才会遇到的问题。后来我们在开源软件的基础上进行自主研发,一步步把IOEIBM小型机、OracleEMC存储)这几个“神器”都去掉了。这些神器就如同《西游记》中那些神仙的兵器,他们身边的妖怪们拿到这些兵器能把猴子打得落荒而逃。但最牛的神仙不依赖这些神器,他们挥一挥衣袖、翻一下手掌就威力无比了。
        PS:在这部分我们看到了很多Java相关的技术,包括MVC(模型model-视图view-控制器controller)框架、hibernate、Spring、搜索引擎技术、IOE等;同时看到了遇到的一个接一个的问题及当时的解决方案。

三. 坚若磐石 缓存和CDN

       已经有读者在迫不及待地想知道怎么去掉IOE了?别急,在去掉IOE之前还有很长的路要走。
        行癫等人买回小型机之后,我们用上了Oracle;然后七公带着一帮DBA做优化SQL和存储方面的工作,行癫带着几个架构师研究数据库的扩展性。Oracle本身是一个封闭的系统,用Oracle怎么做扩展呢?用现在一个时髦的说法就是“分库分表”。
        我们知道一台Oracle的处理能力是由上限的,它的连接池有数量限制,查询速度和容量成反比。简单地说,在数据量上亿、查询量上亿的时候,就到它的极限了。要突破这种极限,最简单的方式就是多用几个Oracle数据库。
        但一个封闭的系统做扩展,不像分布式系统那样直接加机器就可以了。我们的做法是把用户的信息按照ID来存放到两个数据库中(DB1和DB2),把商品的信息和卖家信息放在两个对立的数据库中,把商品类目等通用信息放在第三个库中(DBcommon)。这么做的目的除了增加了数据库的容量之外,还有一个就是做容灾,即万一一个数据库挂了,整个网站上还有一半的商品可以买。
        数据库这么分后,应用程序就会出现麻烦,如果我是卖家,查看我的商品没有问题,我们都在一个库里。但如果我是一个买家,买的商品有DB1的,也有DB2的,要查看“我已买到的宝贝”的时候,应用程序怎么办?必须到两个数据库中分别查询对应的商品。要按时间排序怎么办?两个库中“我已买到的宝贝”全部查出来在应用程序中做合并。另外,分页怎么处理?关键字查询怎么处理?专业点的说法就是数据的Join没法做了。这些工作交给程序员来做也许会更麻烦,于是行癫出手了,他写了一个数据库路由的框架DBRoute,统一处理了数据的合并、排序、分页等操作,让程序员像使用一个数据库一样操作多个数据库里的数据,这个框架在淘宝的Oracle时代一直在使用。
        但是后来随着业务的发展,这种分库的第二目的——“荣灾”的效果没有达到(数据库挂了,整个网站上还有一半的商品可以买)。像评价、投诉、举报、收藏、我的淘宝等很多地方,都必须同时连接DB1和DB2,哪个库挂了都会导致整个网站挂掉。
        PS:讲到这里涉及到了很多数据库方面的知识,如“XXX管理系统”这样的网站大家一定都不陌生,数据库的增删改查,JSP\PHP\ASP结合数据库的这些网站都是很常见的课程项目或毕业设计。回过头来,这些东西都不是很难;如果让你去解决一个真实的网站中遇到的问题、去实现这样一个框架解决实际问题,那才是真正的厉害。同时说到数据库,你可能会想到包括数据的增删改查、各种交叉查询、Join操作、ACID特性、事务加锁、存储过程触发器等知识。
        
上一篇说过,采用EJB其实是和Sun的工程师妥协的结果,在他们离开后,EJB也逐渐冷落下来。在2005年和2006年的时候,Spring大放异彩,于是控制层用Spring替换掉了EJB,给整个系统精简了很多代码。
        同时为了减少数据库的压力,提高搜索的效率,我们引入了搜索引擎。随着数据量的增长,到了2005年,商品数有1663万个,PV有8931万个,注册会员有1390万个,这给数据存储带来的压力依然很大,数据量大,速度就慢。亲,除了搜索引擎、分库分表,还有什么办法能提升系统的性能?一定还有招数,这就是缓存和CDN(内容分发网络)。
        你可以想象9000万次的访问量,有多少是在商品详情页面?访问这个页面的时候,数据全都是只读的(全部从数据库中读出来,不写入数据库),在那个时候,我们的架构师多隆大神做了一个基于Berkeley DB的缓存系统,把很多不太变动的只读信息放了进去。
        其实最初这个缓存系统还比较弱,我们并不敢把所有能缓存的信息都往里面放,一开始先把卖家的信息放里面,然后把商品属性放里面,再把店铺信息放里面,但是像商品详情这类字段太大的放进去受不了。说到商品详情,这个字段比较恐怖,有人统计过,淘宝商品详情打印出来平均有5米长。笔者记得,我来淘宝之后担任项目经理做的第一个项目就是把商品详情从商品表中移除来,它最早与商品价格、运费等信息放在一个表中,拖慢了整张表的查询速度,而很多查询商品信息是不需要查看详情的。
        于是在2005年的时候,我把商品详情放在数据库的另外一张表中,再往后,这个大字段被从数据库中请了出来,先是放入缓存系统,到现在放进了文件系统TFS(Taobao File System)中。
        到现在为止,整个商品详情的页面都在缓存里面了,眼尖的读者可能会发现现在的商品详情不全是“只读”的信息了,这个页面上有个信息叫“浏览量”(2006年加上去的),这个数字每刷新一次,页面就要“写入”存储一次,这种高频度实时更新的数据能用缓存吗?
        通常来说,这种是必须放进数据库的,但悲剧的是,我们在2006年开发这个功能的时候,把浏览量写入数据库,发布上线1个小时后,数据库就挂掉了,每天几亿次的写入,数据库承受不了。那怎么办?亲,先不回答你,下一篇讲到缓存Tair的时候再说。
        注意下图不是广告,请把注意力从左边移到右边,看看浏览量这个数据在哪里。


        PS:写到这里我想到了一个问题,大家都知道淘宝有一个买家评价和销售量可以推荐更好的商品;但是如果有浏览量呢?商家可以通过不断的刷新增加浏览量。就像CSDN博客一样,如果想通过Python写个简单的不断访问增加访问量的程序还是很容易的,如何防止这种问题呢?这个问题好像还挺有趣的。
        CDN这个工作相对比较独立,跟别的系统一样,一开始我们采用的也是商用系统。后来随着流量的增加,商用的系统已经撑不住了,LVS的创始人章文嵩博士带人搭建了淘宝自己的CDN网络。在本文引言中说过淘宝网的CDN系统支撑了800Gbps以上的流量,作为对比,我们可以看下国内专业做CDN的上市公司ChinaCache的介绍(ChinaCache是中国第一的专业CDN服务提供商,向客户提供全方位网络内容快速分布解决方案。目前在全国50多个大中型城市拥有300多个节点,全网处理能力超过500Gbps,其CDN网络覆盖中国电信、网通、移动、联通、铁通、教育网科研网等各大运营商):
         淘宝一家的流量比他们的加起来还要多。
        这样你可以看出淘宝在CDN上的实例,这在全世界都是数一数二的。 另外因为CDN需要大量的服务器,要消耗很多资源(消耗多少?在前两年我们算过一笔账,淘宝上产生一个交易,消耗的电量足以煮熟4个鸡蛋)。这两年,章文嵩的团队又在研究低功耗的服务器。
        我们对数据库分库、放弃EJB、引入Spring、加入缓存和CDN等工作,看起来没有章法可循,其实都是围绕着提高容量、提高性能、节约成本做的,由于这些是不算大的版本变迁,我们姑且叫它2.1版,这个版本从构图上看有三只脚,是不是稳定了很多?

        在这个稳定的版本下,淘宝网发展迅猛,2005年5月微软的MSN门户大张旗鼓地进入中国,淘宝网成为它的购物频道。2005年盛大进军机顶盒业务,其电视购物的功能也是淘宝网开发的。虽然因水土不服或政策的原因,这两个业务现在都看不到了,但是他们曾经是中国互联网行业的大事件。
        另外老马也从来不缺少娱乐精神,他看到湖南卫视的超女如此成功,也想借鉴这种模式。2005年底,淘宝网和湖南卫视合作推出“超级Buyer秀”,让大家分享自己的网购经历。虽然没有超女火爆,但也让“淘宝网就是网购”的形象加深人心。
        到2006年,淘宝网已经有了1.5亿个日均PV,商品数达到5千万个,注册用户3千万个,全网成交额达169亿元。


        最后回顾下这四张图的变迁和几个版本:
        1.0版的PHP系统运行了将近一年的时间(2003年5月-2004年1月),服务器由1台发展到多台;
        后来数据库撑不住了,将MySQL换成了Oracle,引入了搜索引擎(2004年1月-2004年5月),叫1.1版本;
        然后不到半年的时间又把开发语言换成了Java(2004年2月-2005年3月),叫2.0版本,数据服务逐步采用了IOE(IBM小型机、Oracle、EMC存储);
        随着数据量和访问量的增长,我们进行数据分库、加入缓存、使用CDN(2004年10月-2007年1月),叫2.1版本。

        这几个版本中间有些时间上的重合,因为很多架构的演化并没有明显的时间点,它是逐步进化而来的。 在描述2.1版本时,我写的标题是《坚若磐石》,因为这个版本终于稳定下来了,它在淘宝网运行了两年多的时间。这期间很多优秀的人才加入,也开发了很多优秀的产品,例如商品的类目属性、支付宝认证系统、招财进宝项目、淘宝旅游、淘宝彩票、淘宝论坛等,甚至在团购网站风起云涌之前,淘宝网在2006年就推出了“团购”的功能。
        下一篇将讲述创造技术,包括TFSTair、缓存技术。
        PS:最后还是希望文章对大家有所帮助,虽然文章中出现的很多涉及淘宝网的专业词汇我也不知道其技术是什么,但是还是能从《淘宝技术这十年 著:子柳》书中学到一些有用的知识。我主要是记录了其中自己认为比较好的文字复述出来,希望大家购买正版书籍阅读学习!
        (By:Eastmount 2015-4-22 下午4点    http://blog.csdn.net/eastmount/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石 的相关文章

  • mysql+关掉密码过期

    mysql 关掉密码过期 要在MySQL中关闭密码过期功能 可以按照以下步骤进行操作 登录到MySQL服务器 使用管理员账户 如root 连接到数据库 mysql uroot ppassword 运行以下命令来查看当前的密码过期设置 SHO
  • MySQL中设置自增主键id从1开始

    可能遇到过这种问题 当你只想新增一条数据时 发现使用Insert语句后 发现id并不是从1开始的 握草 怎么回事 其实很简单 通过执行一下SQL 对应你的表就可以解决 ALTER TABLE user AUTO INCREMENT 1 具体
  • 【计算机开题报告】家具销售库存管理信息系统

    一 选题的目的 意义及相关研究动态和自己的见解 随着当今社会信息化的发展 电子自动化办公越来越为各人所重视 它能有效地收集 处理各种信息 极大地提高了办事效率 而计算机技术各种软件工作平台不断的发展 又为电子自动化办公的实现提供了良好的前景
  • 如何在CentOS安装SQL Server数据库并通过内网穿透工具实现公网访问

    文章目录 前言 1 安装sql server 2 局域网测试连接 3 安装cpolar内网穿透 4 将sqlserver映射到公网 5 公网远程连接 6 固定连接公网地址 7 使用固定公网地址连接 前言 简单几步实现在Linux cento
  • 天猫数据分析工具推荐(天猫第三方数据平台)

    在电商迅速发展的大背景下 做好天猫数据分析能够在多方面帮助品牌商家更好地运营店铺 塑造品牌 如通过数据分析了解消费者的需求 购买偏好 这有利于品牌商家及时调整商品结构 产品推广 商品宣传等等 灵活制定品牌的销售策略 那么 天猫平台行业 品牌
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • AntDB内存管理之内存上下文之内存上下文机制是怎么实现的

    4 内存上下文机制是怎么实现的 下文将针对内存上下文机制进行代码说明 本次以AntDB的代码为例 来解析内存上下文的实现方式 4 1 最基础的数据结构 MemoryContextData和MemoryContextMethods是内存上下文
  • Navicat 16 for MySQL:打造高效数据库开发管理工具

    随着数据的快速增长和复杂性的提升 数据库成为了现代应用开发中不可或缺的一部分 而在MySQL数据库领域 Navicat 16 for MySQL作为一款强大的数据库开发管理工具 正受到越来越多开发者的青睐 Navicat 16 for My
  • 【计算机毕业设计】出租车管理系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本出租车管理系统就是在这样的大环境下诞生 其可以帮助管理者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管理人
  • 【计算机毕业设计】基于web的山东红色旅游信息管理系统

    有效的处理想要的相关信息和如何传播有效的信息 一直是人类不断探索的动力 人类文明火种的传承都是通过了多种媒介作为载体 也是随着社会生产力的发展不断的更新 随着互联网的到来 信息传播与管理都上升了一个新的台阶 并且方便应用的同时也要考虑信息传
  • 【计算机毕业设计】网上拍卖系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本网上拍卖系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管理人员
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮

    数据库 面试官 一次到底插入多少条数据合适啊 面试连环炮 数据库插入操作的基础知识 插入数据是数据库操作中的基础 但是 我们程序员将面临随之而来的问题 如何快速有效地插入数据 并保持数据库 性能 当你向数据库中插入数据时 这些数据直接存储到
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • 30天精通Nodejs--第二十天:express-操作mysql

    目录 前言 安装依赖并配置MySQL连接 安装mysql2库 配置连接信息 在Express应用中使用MySQL 结合Express路由实现CRUD操作 整合到主应用 结语 前言 在Node js中使用Expre
  • MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

    目录 一 MongoDB 1 1 简介 a MongoDB 是什么 为什么要使用 MongoDB b 应用场景 c MongoDB 这么强大 是不是可以直接代替 MySQL d MongoDB 中的一些概念 e Docker 下载 1 2
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具

随机推荐

  • 【Linux】linux进程间通信netlink socket(用户与内核通信) 一

    目录 1 基础概念 2 netlink socket 基本原理 3 用户空间常用socket APIs 3 1 socket 3 2 bind 3 3 sendmsg 3 4 send 3 5 recvmsg 3 6 close 4 net
  • chatGPT中国入口-ChatGPT评论文章-ChatGPT怎么用

    国内怎么玩chatGPT 如果您在国内使用ChatGPT 主要的问题可能是连接OpenAI服务器的速度和稳定性 由于OpenAI位于美国 可能受到中国的网络限制和防火墙的影响 造成访问速度比较慢或不稳定 为了解决这个问题 您可以采取以下方法
  • 为什么要分库分表(个人理解,希望能与大家共勉)

    前言 其实分库分表是牵扯到高并发的 因为分库分表无非来说就是为了支撑高并发 数据量大的问题 尤其进入稍微大一点的公司或者互联网公司 这些都是必须掌握 场景 假如一个新兴公司 刚开始时 注册用户就40W 每天活跃1W 每天单表数据量1000
  • Shark(鲨鱼记账系统)--附源码

    Shark 鲨鱼记账系统 附源码 程序员就要多撸代码 以便在脑海中形成深刻记忆 昨晚试着撸了一个小小的记账系统 内容很简单 主要负责简单的记账 不过没用到持久层 后续会做持久层的版本 先看个简单的把 package com shayu no
  • 十大Python可视化工具,太强了

    今天介绍Python当中十大可视化工具 每一个都独具特色 惊艳一方 Matplotlib Matplotlib 是 Python 的一个绘图库 可以绘制出高质量的折线图 散点图 柱状图 条形图等等 它也是许多其他可视化库的基础 import
  • 【复变函数与积分变换】【第一章 复数与复变函数】

    2021 1 3 文章目录 2021 1 3 第一章 复数与复变函数 1 1 复数 一 复数及其运算 定义 复数的基本概念 相等 四则运算 二 共轭复数 定义 性质 1 2 复数的几种表示 复平面 一 复数的模与辐角 主辐角 相互转换关系
  • Hydra(九头蛇)密码破解工具的详细使用教程

    简介 Hydra是 款开源的暴 密码pojie 具 持多种协议密码的破译 可以对多种服务的账号和密码进行爆破 包括 数据库 SSH FTP 等服务 在 Kali Linux 中自带 Hydra 有了这个工具就可以很方便的对密码进行破解 其简
  • C++——随机数引擎和分布

    随机数引擎是一个函数对象类 他们定义了一个调用运算符 不接受任何参数并且返回一个unsigned整数 我们可以适用其生成随机数 为什么称其为随机数引擎 因为我们通常不会直接适用引擎生成随机数 而是将其传入一个分布类对象中对齐进行分布生成 所
  • 【100天精通python】Day31:使用python操作数据库_数据库编程接口,连接对象和游标对象,数据库连接配置

    目录 专栏导读 一 数据库编程接口 1 Python标准库接口 2 MySQL Connector Python接口 3 Psycopg2接口 用于连接PostgreSQL数据库 4 SQLAlchemy接口 二 连接对象和游标对象 1 连
  • 【hbase】hbase学习总结

    HBase是一种构建在HDFS之上的分布式 面向列的存储系统 在需要实时读写 随机访问超大规模数据集时 可以使用HBase 特点 大 面向列 面向列表 簇 的存储和权限控制 列 簇 独立检索 稀疏 对于为空 NULL 的列 并不占用存储空间
  • Python--Working with date and times(待整理…strftime不清楚)

    1 modules working with dates and times The calendar module The time module The datetime module focus on datetime first d
  • Python基础数据类型之字符串(二)

    Python基础数据类型之字符串 二 一 字符串的常规操作 二 字符串的大小写转换 1 首字母大写 2 每个单词首字母大写 3 大写转化为小写 4 所有字母变成大写字母 二 验证码忽略大小写 三 字符串空白的去除方法 1 strip 使用
  • IOC容器(详细讲解)

    文章目录 IOC容器 一 IOC底层原理 二 IOC接口 三 Bean管理 IOC操作Bean管理 基于xml 1 基于XML配置文件创建对象 2 基于XML方式注入属性 3 第一种注入方式 set方式注入 4 第二种注入方式 有参构造函数
  • Linux:用户态和内核态的区别?什么时候会从用户态切换到内核态?

    1 用户态和内核态的区别 明白这两个概念之前 我们得知道用户空间和内核空间 用户空间 指的就是用户可以操作和访问的空间 这个空间通常存放我们用户自己写的数据等 内核空间 是系统内核来操作的一块空间 这块空间里面存放系统内核的函数 接口等 在
  • STM32定时计算详解

    STM32之定时器 时间 次数x1 频率 1 TIM Prescaler 72M 1 TIM Period 1 7199 72M 1 9999 1秒 一 定时器简介 1 时钟来源 2 定时器结构 以基本定时器为例 二 基本定时器的编程方法
  • NAT的四种分类:全锥形NAT,地址受限锥形NAT,端口受限锥形NAT,对称NAT

    文章目录 1 STUN 1 1 Full cone NAT 全锥形NAT 1 2 Restricted Cone NAT 地址受限锥形NAT 1 3 Port Restricted Cone NAT 端口受限锥形NAT 1 4 Symetr
  • unity平台区分

    这里就介绍几种常见的 也是便于使用的几种平台判断的方法 1 先说第一种 也是我用的顺手的一个 利用RuntimePlatform判断 API上的解释是 The platform application is running Returned
  • 中国唯一的图灵奖获得者姚期智,在清华开设的“姚班”有哪些 AI 名徒?

    转自 https www leiphone com news 201702 tll28CkQFCd3r6vE html 今日 雷锋网了解到 已放弃外国国籍成为中国公民的中国科学院外籍院士姚期智教授日前正式转为中国科学院院士 姚期智是世界著名
  • js面向对象编程class

    1 面向对象介绍 面向对象是把事务分解成为一个个对象 然后由对象之间分工与合作 2 面向过程与面向对象对比 面向过程 面向对象 优点 性能比面向对象高 适合跟硬件联系很紧密的东西 例如单片机就采用的面向过程编程 易维护 易复用 易扩展 由于
  • 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过 一个好的东西往往是是说不清楚的 姑且不论这句话的对与错 但我真的很佩服 淘宝技术这十年 这本书的作者子柳 能够通过淘宝的一些故事 按照时间顺序和IT发展的各种技术描述清楚 而且过程中读起来非常有意思 该读书笔记中参杂了很多原文的知