• 阶段总结


    JVM

      JVM优化?

      JVM内存模型?所有jdk版本的模型都一样吗?

      对JVM的了解?

        JVM内存分配?

        GC 是在什么时候?对什么东西?做了什么事情?

    分布式、集群

      做一个分布式事务怎么做?

      实现分布式锁怎么实现

      redis如何保证热点数据?

      缓存

      序列化

      数据库锁

    Mybatis

      #{}和${}区别

      数据库事务

    Spring Boot

      springBoot自动配置原理

      @RestController

      Spring 关于iOC容器 特点

      Spring MVC 流程图

    redis

      如何手动持久化

      Memcached、Redis、MongoDB 对比

      redis遍历所有key的两个命令 keys scan

        keys

        scan

    mysql

      索引分类

      索引类型

      建索引原则:

    页面访问慢怎么排查

      慢查询sql优化基本步

    HashMap 和 HashTable区别?

    ArrayList 与LinkedList 区别

    说说知道的设计模式?

    多线程状态?

    volatile 关键字

    NIO 与 BIO 区别?那个更快。

    HTTP协议

      常用HTTP方法有哪些

      GET与POST区别

      HTTP请求报文与相应报文格式

      HTTP请求

      常见HTTP状态码

      HTTP的缺点与HTTPS

      HTTP优化

      GET 下URL地址最大长度

    搜索引擎

    HQL

    JVM

    JVM优化?

    查看堆空间大小分配(年轻代、年老代、持久代分配)

    垃圾回收监控(长时间监控回收情况)

    线程信息监控:系统线程数量

    线程状态监控:各个线程都处在什么样的状态下

    线程详细信息:查看线程内部运行情况,死锁检查

    CPU热点:检查系统哪些方法占用了大量CPU时间

    内存热点:检查哪些对象在系统中数量最大

     

    堆设置

    回收器选择 (jdk 5前使用串行收集器,之后根据系统配置智能判断。)

    收集器有三种:串行、并行、并发收集器

    串行收集器适用于 小数据量 的情况

    并行收集器适用于 吞吐量 优先的情况

    并发收集器适用于 响应时间 优先的情况

     

    JVM优化原则:

    尽量减少 youngGC 、尽量减少 fullGC、缩短大对象生命周期,替换收集器、

     

    JVM内存模型?所有jdk版本的模型都一样吗?

    内存模型:java虚拟机栈、本地方法栈、程序计数器、堆、方法区

    (线程共享:方法区、堆; 线程独享:java虚拟机栈、本地方法栈、PC寄存器)

    jdk 1.7 有永久代的概念。

    jdk 1.8 取消永久代,添加了元空间。

    元空间的本质和永久代类似,都是JVM规范中方法区的实现。不过元空间与永久代之间最大区别在于:元空间并不在虚拟机中,而是使用本地内存。默认情况下,元空间的大小仅受本地内存限制。

     

    对JVM的了解?

    JVM内存分配?

    Java虚拟机栈、本地方法栈、堆、方法区、程序计数器。

    程序计数器当前线程所执行的字节码的行号指示器(线程私有区域,唯一没有任何OOME情况的区域)

    java虚拟机栈:java方法执行的内存模型(线程私有,生命周期与线程相同。)

    本地方法栈:线程创建时产生,方法执行时生成栈帧(为Native方法服务)

    方法区(持久代):存储类信息、静态变量、常量等。区域用完,会抛出OutOfMemoryError。

    :java代码中所有new操作

     

     

     

    GC 是在什么时候?对什么东西?做了什么事情?

    时间:

    Eden(新生代) 满了,触发 minor gc (新生代GC | 会导致全世界暂停,停止应用程序的线程,过程很短暂),

    升到老年代的对象大于老年代剩余空间,触发 full gc,或者小于时 被 HandlePromotionFailure(HandlePromotionFailure 参数配置是否允许担保失败,如果允许,进行minor gc,不允许,进行 full gc) 参数强制 full gc;

    gc 与 非gc 时间耗时超过了 GCTimeRatio(设置吞吐量大小) 的限制引发OOM(OutOfMemory)

    调优 -- 通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold 控制进入老年前生存次数等。

    对什么东西:

    从gc root(垃圾回收的根)搜索不到,而且经过第一次标记、清理后、仍然没有复活的对象。

    做了什么事情:

    新生代是复制清理,

    新生代区有 Survivor Space 幸存者区,包含 To Survivor、 Form Survivor,两个区域空间一样大,垃圾回收时把不能回收的对象都放到 To Survivor中,结束后把To Survivor里的内容都放到 Form Survivor内。

    老年代是标记清理,标记清理后需要做整理,也有直接的标记整理算法。

    复制清理需要较大内存,标记清理收集后有大量空间碎片。

     

    分布式理论:CAP定理、BASE理论

    CAP - 一致性C、可用性A、分区容错性P

    BASE - 基本可用BA、软状态S、最终一致性E

     

    分布式、集群

    分布式是个工作方式,集群是个物理形态

     

    ·分布式系统

    分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。

     

    ·分布式系统核心本质

    拆分 :根据业务需求、成本限制。

    连接 :拆分后Process之间要能通信

     

    ·为什么要使用分布式

    性能扩展 : 系统高负载,单机无法承受,通过使用多台机器提高系统的负载能力

    增强可靠性 :为了避免故障,需要将业务分散开保留一定的冗余

     

    ·集群

    将相同的程序,通过不断横向扩展,以提高服务能力的方式。

     

    做一个分布式事务怎么做?

    1)两阶段提交(2PC):

    优点:尽量保证了数据的强一致,适用数据强一致性要求很高的领域

    缺点:实现复杂,牺牲可用性,对象能影响大,不适合高并发性能场景。

     

    2)补偿事务(TCC):针对每个操作,都要注册一个与其对应的确认和撤销操作。

    分三步 -- try阶段,对业务系统做检测及资源预留

    Confim阶段,对业务系统做确认提交。try阶段成功,默认认为confim阶段也成功。

    cancel阶段,在业务执行错误,需要回滚状态下,执行业务取消,预留资源释放。

    优点:比2pc,实现流程简单,数据一致性不如2pc

    缺点:2、3步可能失败,业务流程不太容易定义。

     

    3)本地消息表(异步确保)

    将分布式事务拆分成本地事务进行处理。

    消息生产方,需要额外建一个消息表,并记录消息发送状态,消息表和业务数据在一个事务里提交,然后消息会经过mq发送到消息的消费方,如果消息发送失败,会进行重试发送。

    消息消费方,需要处理这个消息,并完成自己的业务逻辑,如果本地事务处理成功,表明已经成功,如果处理失败,会重试执行。如果业务失败,会给生产方发送一个业务失败消息,通知生产方回滚。

    优点:经典的实现,避免分布式事务。实现最终一致性

    缺点:消息表会耦合到业务中。

     

    4)MQ事务消息

    RocketMQ 支持,RabbitMQ和Kafka不支持

    使用阿里中间件 RocketMQ中间件,第一步拿到消息地址,第二步 执行本地事务,第三部通过拿到的地址去访问消息,并修改状态。

    优点:实现了最终的一致性,不需要依赖本地数据库事务

    缺点:实现难度大,主流MQ不支持。

     

    实现分布式锁怎么实现

    CAP理论最多实现两项

    三种方式:基于数据库实现分布式锁、基于缓存实现分布式锁、基于zookeeper实现分布式锁

    基于数据库实现 -

    创建一张锁表,要锁住否个方法或资源时,在表中增加一条记录,释放锁时候删除记录。

    优点:直接用数据库,容易理解,

    缺点:有问题,解决麻烦,开销大,性能低。

    基于缓存实现 -

    可以提供更好的性能,redis的setnx方法,

    优点:性能好、实现方便

    缺点:超时时间不一定靠谱。

    基于zookeeper 实现分布式锁

    基于zookeeper临时有序节点实现分布式锁。 客户端某个方法加锁,在zookeeper上与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断有序节点中序号最小的一个判断是否获取锁。释放锁时候删除瞬时节点即可。可以避免服务宕机导致的锁无法释放产生的死锁问题。

    优点:有效解决单点问题,不可重入问题,非租塞问题以及锁无法释放的问题。实现简单。

    缺点:性能不如缓存实现的分布式锁。

     

    redis如何保证热点数据?

    redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)

    volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰

    volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰

    volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

    allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

    allkeys-random:从数据集中任意选择数据淘汰

    no-enviction:禁止驱逐数据

     

    缓存

    工作原理:当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即反馈处理。没找到,就从速率相对较慢的内存中读取并送给CPU处理。

     

    序列化

    把java对象转化为有序字节流的过程

    作用:在传递和保存的时候,保证对象的完整性和可传递性。

    优点:实现数据持久化,可以把数据永久的保存在硬盘上;实现远程通信;在进程间传递对象

    要求:只有实现了 Serializable 或 Externalizable 接口的类的对象才能被序列化。

     

    数据库锁

    数据库为了保证数据的一致性,而使各种共享资源在并发访问下变得有序的一种规则。

    表级锁 - 最大颗粒锁机制,逻辑非常简单,系统负面影响小,获取锁和释放锁速度很快。

    两种模式 - 表共享读锁、表独占写锁

    操作前自动加锁,用户不需要干预。

    优化 - 缩短锁定时间、分离能并行的操作、合理利用读写优先级

    行级锁 - 锁定对象颗粒度小,能给予程序最大的并发处理,获取锁释放锁需要事情多,消耗大,容易发送死锁。

    InnoDB存储引擎实现的行级锁 - 共享锁、排它锁,表级锁 - 意向共享锁、意向排它锁。

    页级锁 - 消耗和能力和粒度 都在表级所和行级锁之间

     

     

    Mybatis

    #{}和${}区别

    ${}是 properties文件中的变量占位符,用于标签属性值和sql内部,属于静态文本替换

    #{}是 sql的参数占位符,Mybatis会将sql的#{}替换为?号,在sql执行前会根据传递的参数按序给占位符设置参数值。

     

    数据库事务

    一条或多条数据库操作语句的组合,保证数据的一致性和完整性

    事务并发会产生的问题

    1、第一类丢失更新

    2、脏读

    3、不可重复读

    4、第二类丢失更新

    5、幻读

    事务隔离 serializable 事务被处理为顺序执行,解决所有问题。

     

    Spring Boot

    springBoot自动配置原理

    main方法中,添加@SpringBootApplication 或者@EnableAutoConfiguration 会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean。

     

    @RestController

    @Controller 处理HTTP请求,注:单独使用会报错,因为没有使用模板,配合 @ResponseBody使用

    @RestController 是 @ResponseBody 和 @Controller 的组合注解

    @RequestMapping 配置 url 映射,可以作用在控制器的某个方法上,也可以用在此控制器类上

    当控制器在类级别上添加@RequestMapping注解,注解会应用到控制器的所有处理器方法上;

    处理器方法上的@RequestMapping 注解会对类级别上的@RequestMapping 声明进行补充

    例:

    @RestController

    @RequestMapping(“/hello”)

    public class HelloController {

    @RequestMapping( value="/sayHello", method = RequestMethod.GET)

    public String sayHello(){

    return "hello";

    }

    }

    @ PathVaribale 获取url中的数据

    @ RequestParam 获取请求参数的值

    @GetMapping 组合注解

     

    aop 面向切面编程

    ioc 依赖注入

    spring的ioc容器是spring的核心,spring aop 是spring 框架的重要组成部分

    DI机制 依赖注入(Dependecy Injection) 和控制反转 (Inversion of Control )是同一个概念

    在spring中创建调用者的工作不再由路由器来完成,因此成为控制反转。创建被调用者的工作有spring来完成,然后注入调用者,因此也称为依赖注入。

     

    Spring 关于iOC容器 特点

    - 总的来说:IOC容器完成了 对象的创建 和 依赖的管理注入。

    - 详细点:

    依赖对象不直接引用,而是引用接口

    对象的创建与注入由Spring决定,Spring 可以根据xml配置来创建对象

    - IOC能力

    依赖解耦,依赖对象只要满足接口就能自由替换

    依赖封装,Spring在注入对象时,可对对象执行操作

     

    Spring MVC 流程图

     

    1、请求到达 SpringMVC 前段控制器的时候,会到达 DispatcherServlet 的 doService() 方法

    2、接着调用 doDispatcher() 方法

    3、接着调用 getHandler(processedRequest) 获取当前的处理器;返回当前请求的处理器链。当前处理器链封装了负责请求的处理器及其方法。

    4、根据请求的处理器获取处理器适配器,通过调用 getHandlerAdapter() 获取

    5、接下来调用 handler() 方法处理请求,返回modelAndView对象

     

    redis

    如何手动持久化

    save 同步保存操作,将当前redis实例的所有数据快照(snapshot)以RDB文件的形式保存到硬盘。保存成功时返回ok。

    bgsave 命令执行后立即返回ok,然后redis fork(分叉)出一个新子进程,原来的redis进程(父进程)继续处理客户端请求,子进程负责将数据保存到磁盘,然后退出。

    结论:save 保存阻塞主进程,客户端无法连接redis,等save完成后,主进程才开始工作,客户端可以连接。

    bgsave 分叉子进程,执行save过程,不影响主进程,客户端可以正常连接redis,子进程fork执行save完成后,通知主进程,子进程关闭。

     

    Memcached、Redis、MongoDB 对比

    redis 是一个开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列。

    Memcached 是一个自由开源的,高性能,分布式内存对象缓存系统。

    MongoDB 是一个基于分布式文件存储的数据库,文档型的非关系型数据库。

    - 性能上

    redis只使用单核,Memcached 可以使用多核,平均每一核上,小数据存储 redis性能大于memcached,大于100K以上的数据Memcached性能更高。两者性能都大于mongoDB

    - 操作上

    memcached 数据结构单一,仅用来缓存数据,而redis支持更加丰富的数据类型,可以在服务端直接对数据进行丰富操作,可以减少IO次数和数据体积。

    MongoDB 支持丰富的数据表达,索引,类似关系型数据库,支持查询语言丰富。

    - 可靠性上

    Memcached 不支持数据持久化,断电或重启后数据消失,稳定性好。

    redis支持数据持久化和数据恢复,允许单点故障,同时会付出性能代价。

    MongoDB从1.8版开始采用binlog方式支持持久化的可靠性。

    -应用场景上

    Memcached 动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查用户信息、好友信息)

    redis 适用对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统

    mongoDB 解决海量数据的访问效率问题

    注:- Memcached 单个key-value大小有限,一个value最大支持1MB; redis key最大512M,value 1GB

    - Memcached 是内存缓存,对可靠性无要求; redis 对可靠性要求较高

    - 本质上 memcached 是单一key-value 内存cache; redis 是一个数据结构内存数据库,支持五种数据类型,不仅可以缓存,还可处理简单逻辑运算,redis不仅可以缓存,还可以作为数据库用

    - MongoDB不支持事务

     

    redis遍历所有key的两个命令 keys scan

    redis 关于各种类型的运用, 模糊遍历,取list值

    keys速度快,在一百万个key的数据库中执行一次查询需要40毫秒,在大数据中查找特定keys,最好用redis的集合结构sets。keys命令返回匹配的key。

    2.8以上版本 scan 命令,scan每次执行都会返回少量元素,不会阻塞服务器。

    scan是一个基于游标的迭代器,命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以延续之前的迭代过程,当scan命令的油表参数(cursor)被设置为0时,服务器将开始一次新的迭代。当服务器向用户返回值为0的游标时,表示迭代器已结束。

     

    scan

    scan 0 从0游标开始查询key

    scan 0 count 5 scan命令,从0游标开始,查询5条数据。不能严格控制返回的key数量,只是一个大致约束。

    scan 0 match *11* 类似于 keys scan从0命令开始,查询 key包含11的值。

     

    mysql

    索引,原理,作用

    (索引本质:通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变成顺序事件。有了索引机制,可以总是用同一种查找方式来锁定数据

    索引分类

    普通索引 index:加速查找

    唯一索引 主键索引,primary key,加速查找+约束(不为空且唯一),唯一索引:unique,加速查找+约束

    联合索引 -primary key(id,name)联合主键索引; -unique(id,name) 联合唯一索引; -index(id,name)联合普通索引 【查询时使用联合索引的一个字段,这个字段在索引中所有字段的第一个,就会用到索引。】

    全文索引 fulltext:用于搜索很长一篇文章的时候,效果最好。

     

    【聚集索引:给表加上主键,整个表就变成一个索引(聚集索引),主键的作用就是把 [表] 的数据格式转换成[索引(平衡树)]的格式放置。

    索引让数据库查询速度上升,使写入数据的速度下降。原因是平衡树这个结构必须维持在一个正确的状态,增删改数据会改变平衡树各个节点的索引数据,破坏树结构,因此数据改变时,DBMS必须重新梳理索引树结构确保正确。这回带来不小的性能开销。

     

    非聚集索引:每次给字段建一个新索引,字段中数据就会被复制一份出来,用于生成索引。给表添加索引,会增加表的体积,占用磁盘空间。

    (非聚集索引和聚集索引的区别在于,通过聚集索引可以查到需要查询的数据,通过非聚集索引可以查到记录对应的主键值,再使用主键的值通过聚集索引查找到需要的数据。)

     

    覆盖索引(复合索引、多字段索引):

     

     

    索引类型

    hash 类型 :查询单条快,范围查询慢

    btree 类型 :平衡树(B+树),层数越多,数据量指数级增长(innodb默认支持)

     

    建索引原则:

    1、最左前缀原则。mysql 会一直向右匹配,直到遇到范围查询(>、<、between、like)就停止

    2、= 和 in 索引查询部分先后。

    3、尽量选择区分度高的列作为索引,字段不重复的比例越大,扫描记录数越少。

    4、索引列不能参与计算

    5、尽量扩展索引,不要新建索引。有索引a,要加索引(a,b),只要修改原来的索引即可

     

    mysql版本 5.1 select version() 可以得到

    postgresql 9.4 select version() 可以得到

     

    页面访问慢怎么排查

    ping端口是否能接通

    是否有线程阻塞

    是否造成数据库锁表

     

    慢查询sql优化基本步

    1、运行查看sql是否真的很慢

    2、where条件单表查,锁定最小返回记录表。

    3、explain 查看执行计划,

    4、order by limit 形式的sql语句让排序表优先查

    5、了解业务方使用场景

    6、加索引时参照建索引的几大原则

    7、观察结果,不符合预期从头开始

     

    mysql的慢查询日志

    mysql日志包括 错误日志、二进制日志、通用查询日志、慢查询日志等

    通用查询日志:记录建立的客户端链接和执行的语句

    慢查询日志:记录所有执行时间超过long_query_time 秒的所有查询或者不使用索引的查询,默认不开启,默认值10秒,

     

     

    HashMap 和 HashTable区别?

    1)对 null key 和 null value 支持不同。

    HashTable 不支持 null key和null value。

    HashMap 可以有一个 null key,多个 null value。不能用get() 方法判断HashMap中是否存在某个键,应该用 containsKey() 方法来判断。

    2)线程安全性不同

    HashTable 是线程安全的,它的每个方法都加入了synchronized 方法。

    HashMap 是线程不安全的,多并发可能产生死锁等问题。

    HashMap 效率比HashTable 好很多。ConcurrentHashMap 是线程安全的。且效率比Hashtable高。因为ConcurrentHashMap 使用了分段锁。并不对整个数据进行锁定。

    3)初始容量大小和每次扩容量大小不同

    Hashtable 默认大小为 11,每次扩充容量变为原来的 2n+1.

    HashMap 默认大小为 16,每次扩充,容量变为原来的2倍。

     

    ArrayList 与LinkedList 区别

    public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, ...

    public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Queue<E>, ...

    ArrayList 实现了随机访问的接口 ; LinkedList 实现了Queue的接口;

    ArrayList 是基于数据实现的list,有数组特性 ; LinkedList 是基于链表实现的list,有链表特性。

    优缺点:

    ArrayList 优点:适合随机读取时候,读取速度快,可以一步get(index)

    缺点:添加值很慢,

    LinkedList 优点:添加值很快,实现栈和队列方面 LinkedList 优于 ArrayList

    ArrayList 增删比 LinkedList 开销更大,除了有查找时间复杂度,还有移动过程。

     

    说说知道的设计模式?

    大致分三类:创建型模式、结构型模式、行为型模式

    创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

    结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、亨元模式

    行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

     

    例:

    工厂模式 - 创建一个工厂接口和多个工厂实现类,需要增加新功能时候增加实现类,不用修改之前的代码。

    单例模式 - JVM中,单例对象只有一个实例存在。

    代理模式 - 用代理类调用原来的方法,对产生的结果进行控制。

    适配器模式 (例:向外提供一个接口,后端后不同的各种实现。通过调用的数据,去对应实现方法。)

     

    设计模式六大原则:总原则 开闭原则(对扩展开放、对修改关闭)

    单一职责原则

    里氏替换原则

    依赖倒转原则

    接口隔离原则

    迪米特法则(最少直到原则)

    合成复用原则

     

    多线程状态?

    线程包括5种状态 - 新建、就绪、运行、阻塞、死亡

    新建状态(new):线程被创建后进入新建状态。 Thread thread = new Thread();

    就绪状态(Runable):可执行状态,其他线程调用该对象的start()方法,进入就绪状态。 thread.start().

    运行状态(Running):线程获取CPU权限进行执行。

    阻塞状态(Blocked):线程因为某种原因放弃CPU使用权,暂时停止运行。分三种阻塞

    等待阻塞 - 通过调用线程的 wait() 方法,让线程等待某工作的完成。

    同步阻塞 - 线程在获取 synchronized 同步锁失败 (锁被其他线程占用),它会进入同步阻塞状态

    其他阻塞 - 通过调用线程的sleep() 或 join() 或发出了I/O请求时,线程会进入阻塞状态。当sleep()状态超时,join() 等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。

    死亡状态(Dead):线程执行完成或因异常退出run()方法,该线程结束生命周期。

     

    wait() 与 Sleep() 、Join() 的比较

    wait() 会释放对象的同步锁,sleep() 则不会释放锁。join() 底层实现时wait(),作用是等待线程对象被销毁。

     

    volatile 关键字

    - 共享变量(类的成员变量、静态变量)被volatile修饰后,有两层语义 :

    1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,新值对其他线程来说是立即可见的(强制修改的值立即写入主存)。

    2)禁止进行指令重排序

    - 不能保证原子性,需要synchronized锁辅助。

    - 可以保证有序性

    加入volatile关键字,会多出一个lock前缀指令。相当于一个内存屏障,提供三个功能 :

    1)执行到内存屏障这句指令时,它前面的操作已经全部完成。

    2)强制将对缓存的修改操作立即写入主存。

    3)写操作会导致其他CPU中对应的缓存行无效。

     

     

    NIO 与 BIO 区别?那个更快。

    NIO 非租塞IO :多线程对某资源进行IO操作时会把资源先操作至内存缓冲区,然后询问是否IO操作就绪,是则进行IO操作。否则进行下一步操作。然后不断轮询是否IO操作就绪,直到IO操作就绪后进行相关操作。操作更快。

    BIO 阻塞IO :多线程对某资源进行IO操作时会出现阻塞,一个线程进行IO操作完才通知另外的IO操作线程。必须等待。

     

    HTTP协议

    HTTP请求由三部分组成,请求行、消息报头、请求正文

    HTTP(超文本传输协议)是一个基于请求与相应模式的、无状态的应用层的协议。

     

    常用HTTP方法有哪些

    GET:用于请求访问已经被URL识别的资源,可以通过URL传参给服务器。

    POST:传输信息给服务器。

    PUT:传输文件,报文主题中包含文件内容,保存到对应URL位置。

    HEAD:获得报文首部,与get类似,不返回报文主体,用于验证URL是否有效。

    DELETE:删除文件,删除对应URL位置的文件

    OPTIONS:查询相应URL支持的HTTP方法。

     

    GET与POST区别

    1、get重点在从服务器上获取资源;post重点在向服务器发送数据

    2、get传输时通过url请求,?+&传输多个值,过程可见;post传输通过http的post机制,将字段与对应值封存在请求实体中发送给服务器。过程对用户不可见。

    3、get传输数据量小,效率高;post可以传输大量数据

    4、get不安全,url可见,密码可见;post安全性高

    5、get只支持ASCII字符,向服务器传的中文字符可能会乱码;post支持标准字符集,可以正确传递中文字符。

     

    HTTP请求报文与相应报文格式

    请求报文包含:请求行(请求方法,url,HTTP版本信息),请求头,请求体

    相应报文包含:状态行(包含HTTP版本,状态码,状态码的原因短语),响应头,相应体

     

    HTTP请求 : 指从客户端到服务端的请求消息。包括 消息首行中,对资源的请求方法,资源的标识符及使用协议。

    组成 : 三部分 - 1、请求方法url协议/版本; 2、请求头; 3、请求正文

     

    常见HTTP状态码

    1**:指示信息 -- 表示请求已接收,继续处理

    2**:成功 -- 请求已成功接收

    3**:重定向 -- 要完成请求必须进行更进一步的操作

    4**:客户端错误 -- 语法错误或请求无法实现

    5**:服务端错误 -- 服务器未能实现合法请求

     

    HTTP的缺点与HTTPS

    缺点:通信使用明文不加密,内容可能被窃听;不验证通信方身份,可能遭到伪装;无法验证报文完整性,可能被篡改

    HTTPS是HTTP加上加密处理+认证+完整性保护

     

    HTTP优化

    利用负载均衡优化和加速HTTP应用

    利用HTTP Cache来优化网站

     

    GET 下URL地址最大长度

    以前256,现在不止了

    在IE8 下,4076,超过后自动忽略后面的内容。

    在firefix下,7530,超过后报错。

    在Chrome下,7675,超过后报错。

     

    搜索引擎

    原理概述:引擎后台,有一些用于搜索网页信息的程序,所收集的信息是能表明网站内容的关键词或短语,接着将这些信息的索引放到数据库中。

    原理爬行和抓取(引擎排出一个能在网上发现新网页并抓文件的程序:蜘蛛。从已知网站出发,访问网页并抓取文件,通过爬虫去爬互联网上的外链,跟踪网页链接,访问更多网页,这个过程叫爬行。反向链接是搜索引擎优化的最基本因素之一,搜索引擎抓取的页面文件与浏览器得到的完全一致,抓取的文件存入数据库)

    建立索引(蜘蛛抓取的页面文件分解、分析后,以巨大表格形式存入数据库,过程叫索引)

    搜索词处理(如中文的分词处理,去除停止词,判断是否需要启动整合搜索,判断是否有拼写错误或错别字)

    排序()

    数据结构:引擎核心数据结构为倒排文件(倒排索引)

    全文搜索引擎

    目录索引

    元索引

     

    HQL

    面向对象的查询语言

    步骤:

    1、获取Hibernate Session对象、

    2、编写HQL语句、

    3、以HQL语句作为参数,调用Session的CreateQuery方法创建查询对象、

    4、如果HQL包含参数,调用Query的setXxx方法为参数赋值。

    5、调用Query对象的list() 或 uniqueResult() 方法返回查询结果列表

     

  • 相关阅读:
    ACE 的一些词汇
    odbc连接不上,初步猜想是myodbc安装有问题
    1分钟 当数据库管理员
    硬件申请
    编译删除
    ASP.NET之数据绑定
    发布、订阅、复制、同步SQL Server 2000 数据库
    SQL——添加约束的语句
    SQL——规则
    十大著名黑客—— 凯文米特尼克
  • 原文地址:https://www.cnblogs.com/wgy1/p/9555193.html
Copyright © 2020-2023  润新知