精华内容
下载资源
问答
  • 腾讯面试题: 百度搜索为什么那么快?

    万次阅读 多人点赞 2020-05-07 19:17:06
    我还记得去年面腾讯时,面试官最后一个问题是:百度/google的搜索为什么那么快? 这个问题我懵了,我从来没想过,搜素引擎的原理是什么 然后我回答:百度爬取了各个网站的信息,然后进行排序,当输入关键词的时候...

    我还记得去年面腾讯时,面试官最后轻飘飘的问:百度/google的搜索为什么那么快?

    这个问题我懵了,我从来没想过,搜索引擎的原理是什么

    然后我整整思考了2000ms,回答:百度爬取了各个网站的信息,然后进行排序,当输入关键词的时候进行文档比对……巴拉巴拉

    面试官:这不是我想要的答案

    我内心
    在这里插入图片描述


    这个问题我一直耿耿于怀,终于今天,我把他写出来,以后再问,我直接把这篇文章甩给他!!!

    两个字:倒排,将贯穿整篇文章,也是面试官想要的答案

    首先我们知道,百度肯定是有爬虫,到处爬取网页,进行某种处理。然后通过你输入的关键词进行某种计算再返回给你的

    我们先来看看什么是某种处理

    某种处理

    当百度爬取了海量网页后,每一个网页我们称为”文档“,不可能就杂乱无章的放着,它使用了文档集合,就是类似的文档放在一个集合中

    那什么样的文档算类似呢?相信你猜到了,文档中有相同关键字的就可以放在一个集合中

    来举例说明

    假设全世界只有下面5个文档(网页),文档内容也很简单,就一句话(注意是文档内容,不是标题)

    image-20200507163757569

    百度爬取后,将他们进行编号,然后对文档进行扫描分词,因为百度内部有词库,匹配上的词将被切分,所以文档1号将被切分为【谷歌,地图,之父,跳槽,FaceBook】,后面的文档也一样,然后对切分出来的单词进行倒排处理,形成倒排列表

    image-20200507164140174

    啥是倒排处理?右边这堆杂乱无章的数字咋来的?别急,仔细看,1号单词“谷歌”是不是在1,2,3,4,5号文档都出现过?9号单词“离开”是不是只在3号文档出现过?

    是的,倒排列表所做的,就是保存对应单词所出现过的文档编号

    我想你开始明白他的目的了,当我们搜索“谷歌”的时候,他就会获得“谷歌”这一单词对应的倒排列表,知道哪些文档包含他,然后将这些文档提取出来返回给你,这就是一种单词映射文档的方法

    但是,没那么简单,因为只有这样的话,我在一篇博客上把所有的单词都写上,这样杂乱无章的文章岂不是要被推荐给全体中国人???

    所以倒排列表还要保存下列信息

    image-20200507164836182

    保留的信息变成了二元组,比如16号单词“网站”的(5:1),5表示出现的文档编号,1表示出现的次数,也就是说,有了这个信息,如果一个单词在文档中频率越高(英文缩写TF),搜索引擎就可以把他排在前面推给你

    除了频率,还有位置,比如”谷歌“就是在1号文档中出现了一次的单词,位置在第一个,用<1>表示

    image-20200507165150616

    可能到这你有点记不住有哪些网页了,再看一遍比对下

    image-20200507163757569

    这样子,搜素引擎就可以根据你的关键词在倒排列表中找到含有这个关键词的文档集合,然后根据关键词在文档集合中各个文档出现的频率和位置综合判断返回给你排序后的文档

    上句话比较长,加粗部分连在一起读意思不变

    实际上很多搜索引擎基本就是这样做的,只不过各家还有别的参考标准,比如百度还会参考热度,你的搜索记录,还有网站给的钱(你懂的)等等综合打分,按评分高低返回搜索结果的排序

    上面的所以记录处理好后都会存放在磁盘中,然后等你关键词来后再调入内存


    假设世界上只有5个文档,那么上面的东西完全够了,但实际上,世界上有亿万个文档,此时,问题的性质已经变了,不是找不找得到的问题,而是怎么找更快,更准的问题,这需要算法,也就是我们上面提到的某种计算

    某种计算

    第一个问题就是,词库那么多,当你输入“苹果”的时候,百度如何将你的关键词和他内部倒排列表的“苹果”一词联系起来?

    计算机是不认识“苹果”的,这里,可以通过哈希的方法将“苹果”转换为一个编号

    所谓哈希,即是将一个词通过某种算法映射为一个符号,比如“将单词转换为其长度”就是一种算法,虽然很low,这样“苹果”就是2,“梨”就是1,不同的哈希算法有不同的转换结果,但是必然会有一个东西——哈希冲突,比如“桃子”也是2,此时,需要使用链表,也称冲突表,将编号相同的单词链在一起

    image-20200507170500512

    当我们搜索“苹果”的时候,经过哈希计算,得知其编号为2,然后发现2中有一个链表,里面可能保存着“苹果”,”桃子”,“蘑菇”等,然后再遍历链表找到苹果即可

    这里和java8中的hashmap思想一致,不过链表也会过长,所以可以使用别的数据结构代替,比如红黑树,b树等

    解决了第一个问题,我们就可以通过关键词获得他的Id,然后得到所建立的倒排列表了,比如“谷歌

    image-20200507171253060

    第二个问题,由于文档的数量庞大,我们获取的文档往往编号位数都很多,而不像上图那样1,2,3,4,5,导致倒排列表无谓的扩大,所以我们这里进行作差

    在这里插入图片描述

    就是后面的文档编号减去前面的,在取文档(从磁盘中读取)的时候加回来即可

    第三个问题,如何从磁盘中读取文档

    现在我们已经有了倒排列表

    在这里插入图片描述

    可以有两种方法从磁盘中读取文档

    两次遍历法

    第一遍,扫描文档集合,找到文档数量N, 文档集合内所包含的不同单词数M,和每个单词出现的频率DF(如下图),以及一些别的必要信息,这些东西所占内存加起来,得到需要开辟的内存空间,

    在这里插入图片描述

    同时这个空间是以单词为单位划分,比如“谷歌”一词有5篇文档,

    1. 第一遍主要就是确定要开辟多大的内存空间来显示文档

    2. 第二遍扫描,就是边扫描,匹配对应的文档编号(三元组中的第一个数),载入内存

    但是这个方法有一个问题,那就是文档集合有多大,内存就有多大,所以,很可能内存会溢出,不过都放在内存中速度也很快,这是一种空间换时间的方法

    相信你发现了,但凡涉及到读取,一定有两种以上的方法,空间优先或是时间优先,第二种就是时间换空间——排序法

    排序法

    现在我们只用固定大小的内存,如何从上图中的倒排列表得知每个单词对应的文章集合所需要的内存空间有多少呢?

    我们需要解析文档,构造(单词ID,文档ID,单词频率)三元组,然后进行排序,按单词ID,文档ID,单词频率先后排,最后如果规定的内存满了,就将这些三元组通通写入一个临时文件A中

    在这里插入图片描述

    为什么要这样呢?想想看,如果我们最后拿到了一个(单词A,文档A,单词频率),我们就可以很轻松的知道一个单词对应哪个文档,和对应的频率,

    也就是一个三元组告诉我们单词A对应的文档A,另一个三元组告诉我们单词A对应文档B……,这些三元组加起来我们就知道了单词A对应的文档集合,就可以知道他需要多少内存空间来填补这些文档了

    可能解析50个文档后规定的内存就满了,然后把这些三元组们写入磁盘临时文件A,就可以再读下一篇50个文档了,注意,词典是不断增加的,比如前50个文档只有上面7个单词,后50个文档可能出现了别的单词,此时要插入词典中,词典一直在内存

    这样,只用固定大小的内存就可以50一批的解析完所有文档,写入了一个个的临时文件A,B,C,D,再将这些临时文件合并,就是把他们分别读入内存中的缓冲区,合成最终索引后再写入磁盘,这样通过最终索引就知道有哪些单词对应多少文档,还有频率,然后根据这些开辟内存空间读取进入内存返回给你即可

    image-20200507181036502

    排序法叙述起来比较复杂,但是其实理解起来很简单,耐心读一定能懂哦

    限于篇幅,这里只讲了你输入关键词到他返回给你大致的网页的过程,其实,百度如何爬取网页?如何保证网页的时效性?如何筛选垃圾网站?如何分布式存储海量网页?如何应对超长关键字查询?如何根据用户历史记录精准分析用户意图?
    等等都需要大量的篇幅详解,一篇文章不可能讲完,下次有机会再分析吧

    作者简介 :【小松漫步】,微信公众号同名,喜欢读书和收集书,文章参考自《这就是搜索引擎核心技术详解》,关注公众号回复【搜索引擎】,即可获取资源,一起交流学习吧

    展开全文
  • 女程序员,为什么比男程序员少???

    万次阅读 多人点赞 2020-03-08 16:08:09
    昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

    昨天看到一档综艺节目,讨论了两个话题:

    (1)中国学生的数学成绩,平均下来看,会比国外好?为什么?

    (2)男生的数学成绩,平均下来看,会比女生好?为什么?

     

    同时,我又联想到了一个技术圈经常讨论的话题:

    互联网公司,做技术的人,平均下来看,为什么男生会比女生多,是男生更适合写代码么?男生的技术更好么?

     

    就在今天,女神节,谈谈自己的一些思考。

     

    问题1:中国学生数学成绩 vs 外国学生数学成绩

    中国是一个非常重视基础教育的国家,从一岁两岁开始,就开始教数数;从小学开始,就开始教加减乘除,二元一次方程;从中学开始,就开始教手动开根号...

    画外音:在外国友人眼里,手动开根号,就是神!

    对于我个人来说,小学就搞各种奥赛,甚至我小时候的理想,就是长大做一名数学家(另一个理想,是做飞行员)。

    画外音:你小时候的理想是什么?

     

    这些,是咱们潜移默化的认知,是几百年的传统

     

    西方国家,最早上学,是以“玩”为主,注重锻炼小朋友的沟通能力,动手能力,探索能力,解决问题能力,创新能力... 数学,作为工具,系统性学习相对较晚。

     

    能稍微解释一点了么?

     

    问题2:男生数学成绩 vs 女生数学成绩

    中华文化,几千年的传统是啥?男生赚钱,女生养家,是否是这样?

     

    生了一个男孩,父母是不是更重视教育(理科教育)?父母是不是从小就和你说,男生适合理科,以后要考大学,数学重要?

     

    生了一个女孩,父母是不是更偏重教育她,什么是美,什么是漂亮,什么是得体?你一个女孩子,不能爬树,不能打闹,不能大喊大叫,怎么像一个男孩子一样?今后嫁都嫁不出去?

    画外音:“像男孩子”怎么就成了贬义词了呢?

     

    这些,是咱们潜移默化的认知,是几千年的传统

     

    仔细想想,回顾一下咱们小时候咱们自己,咱们身边的人的经历,是不是这样?

     

    问题3:男工程师 vs 女工程师

    A:我要去互联网公司做程序员?

    B:你疯了?程序员很累的... 女生不适合做程序员,还是去做产品经理吧。

    画外音:我去,产品经理不累吗?

     

    并不是女生不适合写代码,也不是女生写不好代码,固化的认知,普世的观念,让女生在做选择的时候,背负了更多了压力,才导致了这样的结果。是不是这个逻辑?

     

    我们应该如何做?

    不管是女生,还是男生,不管是择业,还是择偶,都存在类似的问题:应该怎么怎么样,女生/男生更适合怎么样怎么样?

     

    这个“应该”,这个“更适合”,就是固化的认知,普世的观念,它们会在我们做选择时,给我们戴上无形的枷锁

     

    我的经验是,每当自己受到隐形的压力时,心中默念三句话

    (1)我过我的人生;

    (2)我要做真实的自己;

    (3)我为自己的选择负责;

     

    共勉!

     

    女神节,和老婆喊句话:

        我爱你

        不是因为你是谁

        而是因为

        你是你

    希望,程序媛越来越多。

    也祝大家,早日找到心中的女神/男神。

    展开全文
  • 什么是NoSQL,为什么要使用NoSQL?

    万次阅读 多人点赞 2018-04-30 16:44:10
    1 为什么用 NoSQL? 1.1 单机 MySQL 的美好时代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。 上述架构下,我们来看看...

    1 为什么用 NoSQL?

    1.1 单机 MySQL 的美好时代

    在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。
    在那个时候,更多的都是静态网页,动态交互类型的网站不多。

    这里写图片描述

    上述架构下,我们来看看数据存储的瓶颈是什么?

    DAL : Data Access Layer(数据访问层 – Hibernate,MyBatis)

    1. 数据量的总大小一个机器放不下时。
    2. 数据的索引(B+ Tree)一个机器的内存放不下时。
    3. 访问量(读写混合)一个实例不能承受。

    如果满足了上述1 or 3个时,只能对数据库的整体架构进行重构。

    1.2 Memcached(缓存)+MySQL+垂直拆分

    后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。

    memcached+mysql垂直拆分

    Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。

    1.3 Mysql主从读写分离

    由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。

    mysql主从读写分离

    1.4 分库分表+水平拆分+mysql集群

    在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM在写数据的时候会使用表锁,在高并发写数据的情况下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM

    ps:这就是为什么 MySQL 在 5.6 版本之后使用 InnoDB 做为默认存储引擎的原因 – MyISAM 写会锁表,InnoDB 有行锁,发生冲突的几率低,并发性能高。

    这里写图片描述

    同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。

    1.5 MySQL的扩展性瓶颈

    MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

    1.6 今天是什么样子?

    这里写图片描述

    最前面的是企业级防火墙,后面通过负载均衡主机(软负载:Nginx,硬负载:F5)在 web 服务器集群之间进行调度,再由具体的 web 服务器(Tomcat)去访问缓存,访问数据库。

    1.7 为什么用NoSQL?

    今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

    2. 什么是NoSQL?

    2.1 NoSQL 概述

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
    泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

    (例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

    2.2 NoSQL代表

    MongDB、 Redis、Memcache

    3. 关系型数据库与NoSQL的区别?

    3.1 RDBMS

    • 高度组织化结构化数据
    • 结构化查询语言(SQL)
    • 数据和关系都存储在单独的表中。
    • 数据操纵语言,数据定义语言
    • 严格的一致性
    • 基础事务
    • ACID

    关系型数据库遵循ACID规则
    事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:

    1. A (Atomicity) 原子性
      原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

    2. C (Consistency) 一致性
      一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

    3. I (Isolation) 独立性
      所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的

    4. D (Durability) 持久性
      持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

    3.2 NoSQL

    • 代表着不仅仅是SQL
    • 没有声明性查询语言
    • 没有预定义的模式
    • 键 - 值对存储,列存储,文档存储,图形数据库
    • 最终一致性,而非ACID属性
    • 非结构化和不可预知的数据
    • CAP定理
    • 高性能,高可用性和可伸缩性

    分布式数据库中的CAP原理(了解)
    CAP定理:

    • Consistency(一致性), 数据一致更新,所有数据变动都是同步的
    • Availability(可用性), 好的响应性能
    • Partition tolerance(分区容错性) 可靠性
      P: 系统中任意信息的丢失或失败不会影响系统的继续运作。

    定理:任何分布式系统只可同时满足二点,没法三者兼顾。

    CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,

    因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

    • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
    • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
    • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

    CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。

    而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。

    所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。

    说明:C:强一致性 A:高可用性 P:分布式容忍性

    举例:

    CA:传统Oracle数据库

    AP:大多数网站架构的选择

    CP:Redis、Mongodb

    注意:分布式架构的时候必须做出取舍。

    一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性。

    因此牺牲C换取P,这是目前分布式数据库产品的方向。

    4. 当下NoSQL的经典应用

    当下的应用是 SQL 与 NoSQL 一起使用的。
    代表项目:阿里巴巴商品信息的存放。
    去 IOE 化。

    ps:I 是指 IBM 的小型机,很贵的,好像好几万一台;O 是指 Oracle 数据库,也很贵的,好几万呢;M 是指 EMC 的存储设备,也很贵的。

    难点:

    • 数据类型多样性。
    • 数据源多样性和变化重构。
    • 数据源改造而服务平台不需要大面积重构。
    展开全文
  • 为什么越来越多的开发者选择使用Spring Boot?

    万次阅读 多人点赞 2016-10-16 15:26:05
    经过这么长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用Java作为主流的语言进行服务器端开发的原因,也是为什么Java一直保持着非常活跃的用户群。 最受Java开发者喜好...

    一、Web应用开发背景

    使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架、库以及整个生态系统。经过这么长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用Java作为主流的语言进行服务器端开发的原因,也是为什么Java一直保持着非常活跃的用户群体的原因。

    Java EE开发生态图

    最受Java开发者喜好的框架当属Spring,Spring也成为了在Java EE开发中真正意义上的标准,但是随着新技术的发展,脚本语言大行其道的时代(Node JS,Ruby,Groovy,Scala等),Java EE使用Spring逐渐变得笨重起来,大量的XML文件存在与项目中,繁琐的配置,整合第三方框架的配置问题,低下的开发效率和部署效率等等问题。

    这些问题在不断的社区反馈下,Spring团队也开发出了相应的框架:Spring Boot。Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者!

    二、Spring Boot解决的问题

    (1) Spring Boot使编码变简单

    (2) Spring Boot使配置变简单

    (3) Spring Boot使部署变简单

    (4) Spring Boot使监控变简单

    (5) Spring的不足

    三、Spring Boot的优点

    官方地址:https://spring.io/projects/spring-boot

    这里写图片描述

    Spring Boot继承了Spring的优点,并新增了一些新功能和特性:

    (1)SpringBoot是伴随着Spring4.0诞生的,一经推出,引起了巨大的反向;
    (2)从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架;
    (3)SpringBoot帮助开发者快速启动一个Web容器;
    (4)SpringBoot继承了原有Spring框架的优秀基因;
    (5)SpringBoot简化了使用Spring的过程;
    (6)Spring Boot为我们带来了脚本语言开发的效率,但是Spring Boot并没有让我们意外的新技术,都是Java EE开发者常见的额技术。

    四、Spring Boot主要特性

    (1)遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;
    (2)项目快速搭建,可以无需配置的自动整合第三方的框架;
    (3)可以完全不使用XML配置文件,只需要自动配置和Java Config;
    (4)内嵌Servlet容器,降低了对环境的要求,可以使用命令直接执行项目,应用可用jar包执行:java -jar;
    (5)提供了starter POM, 能够非常方便的进行包管理, 很大程度上减少了jar hell或者dependency hell;
    (6)运行中应用状态的监控;
    (7)对主流开发框架的无配置集成;
    (8)与云计算的天然继承;

    五、Spring Boot的核心功能

    (1)独立运行的Spring项目

    Spring Boot可以以jar包的形式进行独立的运行,使用:java -jar xx.jar 就可以成功的运行项目,或者在应用项目的主程序中运行main函数即可;

    (2)内嵌的Servlet容器

    内嵌容器,使得我们可以执行运行项目的主程序main函数,实现项目的快速运行;

    主程序代码SpringbootDemoApplication.java

    package com.springboot.demo.helloworld;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringBootHelloWorldApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootHelloWorldApplication.class, args);
        }
    }
    
    

    (3)提供starter简化Manen配置

    Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖,下边是创建一个web项目中自动包含的依赖,使用的starter pom依赖为:spring-boot-starter-web

    这里写图片描述

    Spring Boot官网还提供了很多的starter pom,请参考:

    https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#using-boot-starter

    这里写图片描述

    (4)自动配置Spring

    Spring Boot会根据我们项目中类路径的jar包/类,为jar包的类进行自动配置Bean,这样一来就大大的简化了我们的配置。当然,这只是Spring考虑到的大多数的使用场景,在一些特殊情况,我们还需要自定义自动配置;

    (5)应用监控

    注意:以前的版本还支持这个功能,目前使用的2.0.4.RELEASE已经不再支持此功能!

    Spring Boot提供了基于http、ssh、telnet对运行时的项目进行监控;这个听起来是不是很炫酷!

    示例:以SSH登录为例

    1、首先,添加starter pom依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-remote-shell</artifactId>
    </dependency>
    

    2、运行项目,此时在控制台中会出现SSH访问的密码:

    这里写图片描述

    3、使用SecureCRT登录到我们的程序,端口为2000,用户为user:

    这里写图片描述

    密码就是刚才的shell access;

    但是当我点击连接的时候,出现错误:

    这里写图片描述

    显然是SecureCRT的版本不支持,所以就放弃了这个,使用Git Bash:

    ssh -p 2000 user@127.0.0.1
    

    这里写图片描述

    剩下的事情,大家自己玩吧!

    (6)无代码生成和XML配置

    Spring Boot神奇的地方不是借助于代码生成来实现的,而是通过条件注解的方式来实现的,这也是Spring 4.x的新特性。

    六、Spring Boot的快速搭建案例

    下边使用的是IDEA快速搭建一个Spring Boot项目

    (1)File----New—New Project

    这里写图片描述

    (2)点击Next填写相应的信息

    这里写图片描述

    (3)点击Next,选择Dependencies,这里创建Web项目选择-----Web:

    这里写图片描述

    (4)点击Next,设置项目名称,这里默认设置,点击Next之后,项目等一下就创建好了

    这里写图片描述

    找到应用程序的主函数,运行即可:

    这里写图片描述

    注意,在pom文件里的java版本这个要和你的机子上一致!我的是1.8,默认创建项目的时候为1.8:

    <properties>
    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    	<java.version>1.8</java.version>
    </properties>
    

    七、案例代码

    GitOS 项目地址:

    https://gitee.com/xuliugen/spring-boot-unofficial-guide/tree/master/spring-boot-hello-world

    这里写图片描述


    【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork),和20万人一起学Java!回复:1024,即可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!

    展开全文
  • 为什么HTTPS比HTTP更安全?

    万次阅读 多人点赞 2019-08-09 14:39:34
    前言 近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代... 读完本文,希望你能明白: HTTP通信存在什么问题 HTTPS如何改进HTTP存在那些问题 HTTP...
  • 可是为什么我觉得什么也没学到呢?其实不是没有学到东西,只是我们的学习效率太低而已! 为什么我们的学习效率如此的低呢?我们在上学一来一直都羡慕那种玩的多但是考的又好的人,他学习的时候你也在学习,他玩的...
  • 为什么程序猿996多猝屎,而企业家007却不会?

    万次阅读 多人点赞 2019-07-30 13:16:49
    公号:Source Code Labs 【转载请务必携带此二维码】
  • 漫画:为什么C语言永不过时?

    万次阅读 多人点赞 2020-10-09 08:51:00
    更多精彩技术漫画,尽在码农翻身 后记:这篇漫画主要是科普一下编程语言的发展历史和适用范围。C语言/C++一直是系统级编程的不二之选,在操作系统,...2. 应用层编程变化剧烈(JS尤其甚),底层编程变化比较小。 
  • 为什么要报考系统架构设计师考试

    万次阅读 多人点赞 2019-08-02 17:03:09
    为什么要报考系统架构师考试 最近一年多,很多朋友来信,问我什么要报考系统架构设计师考试。为什么参加这个考试,这个考试有用吗?对自己的职业会带来什么好处?我想有以下几个方面: 一、强迫自己,去系统学习...
  • 为什么说Redis是单线程的以及Redis为什么这么快!

    万次阅读 多人点赞 2018-03-07 17:39:56
    一、前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”、什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩、...如果你在以前面试的时候还没有遇到过面试官问你《为什么说R...
  • 杂谈:我为什么开始写博客,我又不是什么大犇

    万次阅读 多人点赞 2019-07-05 20:22:35
    杂谈:我什么开始写博客,我又不是什么大犇? 我写博客只是自己学习总结的一种方式 首先我很多遇见的问题都是在很多博客中找到解决方案的,我想我在学习路上积累的东西也可以做个总结,我写的博客很多就是自己的...
  • 为什么说C++太复杂?复杂的必要性是为什么

    万次阅读 多人点赞 2020-05-05 09:54:01
    文章目录1 常见观点2 反驳观点3 为什么要解决的问题越复杂,工具就不得不复杂?3.1 类库和语言语意3.2 折中方案3.3 复杂度的守恒 1 常见观点 可以轻易的找出许多文献说明C++太复杂了,例如学习C++的书籍的厚度。 ...
  • 为什么程序员做外包会被瞧不起?

    万次阅读 多人点赞 2020-03-24 07:07:58
    最近,我在读一本迪伦马特的书,里面有一段话,特别精彩,是老探长贝尔拉赫对福西齐说的: 福西齐啊福西齐,如果你想使自己的行为谈得上主持公道和正义,那就必须使自己的行动避免面包而斗争的嫌疑。你必须摆脱...
  • 为什么要配环境变量?path用来干什么?

    万次阅读 多人点赞 2018-03-26 14:07:20
    问题:为什么要配环境变量?配环境变量解决了什么?(菜b进~~~~) 注:环境变量具体概念自行百度百科 谈谈自己对Path的理解: (因为截至目前我用到最多的就是系统变量中的path变量,之后遇到别的再补充): ...
  • 什么是协方差,怎么计算?为什么需要协方差?

    万次阅读 多人点赞 2017-05-25 15:34:23
    # 均值,方差和标准差 学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合,依次给出这些概念的公式...以这两个集合例,[0,8,12,20]和...
  • 为什么大多数人永远不会真正成功?

    万次阅读 多人点赞 2020-02-20 09:29:00
    前几天看到一个叫做《为什么大多数人永远不会真正成功?》的视频,我本来以为是鸡汤,耐着性子看了一个开头,立刻被吸引了,居然一口气看完了。看完了以后,我对照着自己这10多年的经历反思了一下...
  • 漫画:量子计算为什么这么牛?

    万次阅读 多人点赞 2020-09-07 08:55:00
    后记:我也不是量子计算的专家,对量子计算也只是了解一点儿皮毛,所以有读者问我“量子计算为什么这么牛”的时候,我发现我就很难像讲编程技术那样,通俗易懂,深入浅出地回答了。看了一些相关资料以...
  • java web项目为什么我们要放弃jsp?为什么要前后端解耦? --------------------------------------------------- 前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等)...
  • 为什么样本方差的分母是n-1?最简单的原因,是因为因为均值已经用了n个数的平均来做估计在求方差时,只有(n-1)个数和均值信息是不相关的。而你的第n个数已经可以由前(n-1)个数和均值 来唯一确定,实际上没有信息量...
  • 为什么程序员在学习编程的时候什么都记不住?

    万次阅读 多人点赞 2019-10-12 15:20:20
    在程序员的职业生涯中,记住所有...以下译文: 每个人都会在学习编程语言的时候,努力记住所有一切,这也不足为奇。虽然有些人可以过目不忘,直接在脑海里就能想出问题的解决方案,但普通人却不能。特别是那些刚...
  • 1.什么是框架? 其实框架,就是别人写好了包装起来的一套工具,把你原先必须要写的,必须要做的一些复杂的东西都写好了放在那里,你只要调用他的方法,就可以实现一些本来要费好大劲的功能。形象一点说吧,假如你盖...
  • 为什么程序员下班后只关显示器从不关电脑?

    万次阅读 多人点赞 2019-02-22 11:55:46
    曾有安保人员晚上来办公室巡查时问,为什么这些人不关机就下班呢? 作为程序员,你会心一笑。对方不明白如果关机了,第二天程序员上班可能会崩溃: 打开IDEA,并定位到昨天的代码,十分钟 打开Navic...
  • 为什么重写equals一定要重写hashcode?

    万次阅读 多人点赞 2018-05-24 23:55:10
    正文 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解。 这是Object类关于这两个...
  • 什么是MTU?为什么MTU值普遍都是1500?

    万次阅读 多人点赞 2019-09-04 14:29:25
    什么是MTU Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。 这是哪一层网络的概念? 从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也...
  • 不知道大家有没有经常遇到这样的一个困扰,为什么同样的算法,你的程序却一直超时?大家用的都是暴力大法,为什么别人的能过所有数据,而你的却只能过前几个样例;同样都是使用dp,为什么你的比别人的慢了那么多,有...
  • ThreadLocal为什么会导致内存溢出

    万次阅读 2020-08-04 16:10:18
    ThreadLocal为什么会导致内存溢出
  • TCP 为什么三次握手而不是两次握手(正解版)

    万次阅读 多人点赞 2018-09-19 19:10:58
    TCP 数据包结构图 为什么 TCP 需要握手这个操作 在解答为什么 TCP 需要三次握手, 而不是两次之前, 首先需要回答的问题是: 为什么需要握手这个操作, 能不能不握手? 如果读者对比一下 UDP 的通信流程和 TCP 的通信...
  • 为什么要用交叉验证

    万次阅读 多人点赞 2017-06-21 12:09:31
    为什么用交叉验证法? 主要有哪些方法?优缺点? 各方法应用举例? 什么是交叉验证法?它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。为什么用交叉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,420,249
精华内容 568,099
关键字:

为什么