第一讲_网站架构的演变及海量数据的解决方案

2023-05-16

文章目录

    • 《看透springMVC》读书笔记——第一讲
      • 单机类型
      • CS结构(Client-Server)
      • BS结构(Browser-Server)
      • BS结构网络传输方式
        • OSI七层模型/TCP/IP四层模型
        • TCP/IP每层使用的协议规范
      • 网站架构的演变
        • 应用和数据分离
      • 海量数据的解决方案
        • 利用缓存
          • 实现缓存的两种方式
          • 使用缓存的两个核心要素:什么时候创建缓存,缓存什么时候失效
          • 缓存的适用场合
        • 利用页面静态化
        • 数据库优化
        • 分离活跃数据
        • 批量读取和延迟修改
        • 读写分离
        • 分布式数据库
        • NoSQL和Hadoop
          • RDBMS vs NoSQL
          • Hadoop的特点
      • 高并发的解决方案
        • 应用和静态资源分离
        • 页面缓存
        • 集群与分布式
        • 反向代理
        • CDN:特殊的集群页面缓存服务器
      • 底层的优化
      • 总结
      • 底层的优化
      • 总结

《看透springMVC》读书笔记——第一讲

单机类型

不需要联网,数据和软件都在本地

CS结构(Client-Server)

CS结构分为客户端和服务端,客户端产生的数据通过互联网保存到服务器上,由服务器统一管理数据

[外链图片转存失败(img-1UswJ57q-1565927742061)(G:\Blog\面试\Java web\看透springMVC\1564650540274.png)]

业务处理

服务器除了保管客户端产生的数据之外还可以处理业务,业务可以放在服务器上统一处理,也可以放在客户端处理,放在服务器上处理对服务器的性能要求比较高,但是具有一定的稳定性和安全性,同时完成软件的升级也比较方便。如果将业务放在客户端处理,对服务器的性能要求就没那么高,可以减少服务器的负担,节省服务器的资源

比如我们的QQ,微信等现在各大app,以及大型游戏都是基于CS结构

CS结构的缺点

  • 软件提供商需要同时开发客户端和服务器两套软件体系。
  • 客户使用的时候需要单独安装软件
  • 升级的时候需要客户单独升级

BS结构(Browser-Server)

BS结构将客户端统一处理,做成一个浏览器,并且浏览器默认安装在用户的电脑里面,不需要用户单独进行安装,浏览器只是一个作为显示数据的作用,它通过特定的协议和服务器通信,将服务器的数据返回并显示。具体的业务逻辑也在服务器上处理
在这里插入图片描述

BS结构的特点

实现简单

BS结构网络传输方式

OSI七层模型/TCP/IP四层模型

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

TCP/IP每层使用的协议规范

在这里插入图片描述

网站架构的演变

应用和数据分离

最初是由一台主机包含了所有的服务器程序和数据,当数据和流量越来越大时,就需要将数据单独分离出来

在这里插入图片描述

海量数据的解决方案

利用缓存

海量数据无疑是对数据库造成的压力,所以我们的目标也是减轻数据库的压力,通过使用缓存可以将从数据库中获取的结果暂时保存起来,如果下次还要用到,就直接从缓存中取数据,而不用再次从数据库中获取数据流

实现缓存的两种方式
  • 通过程序直接保存到内存:从数据库中的数据直接保存到本地内存,如果需要再次获取相同的数据那么可以直接从内存中获取,而不用从数据库中获取了。比如concurrentHashMap
  • 使用缓存框架:Ehcache,Memcache,Redis
使用缓存的两个核心要素:什么时候创建缓存,缓存什么时候失效
  • 什么时候创建

    • 可以在第一次从数据库中获取到数据的时候创建缓存
    • 也可以在程序启动的时候就创建缓存
    • 也可以是缓存失效了创建
  • 缓存什么时候失效

    • 缓存可以设置定期失效
    • 也可以在数据发生变化的时候失效(分为粗粒第失效和细粒度失效)
缓存的适用场合

由于缓存中的数据代表的数据库中的数据,如果数据库中的数据更新的很频繁,那么缓存如果又设置了定期失效(不会因为数据库中的数据发生了改变而失效),所以就会导致缓存中的数据和数据库中的数据不一致的现象

当然如何设置的缓存当数据库中的数据发生变化的时候就失效,并且是细粒度失效,那么同样也适用于一些实时性要求比较高的场合

利用页面静态化

页面静态化是直接将程序最后生成的页面保存起来,这样就不需要每次调用都重新生成页面,这样不但不需要重新查询数据库,连应用程序都不需要处理了

数据库优化

以上两种方式都是用缓存的方式将数据暂时存储起来,当下次需要数据的时候可以直接获取来达到节省开销,而数据库优化是直接针对数据库里面的逻辑操作进行优化

  • 表结构优化

  • SQL语句优化:可以将处理大数据的SQL语句执行的时间记录下来进行分析和优化

  • 分区:将一张表中的数据按照特定的规则分到多个区中

  • 分表:如果一张表中有几种固定不变的类型,并且同时对所有类型的操作情况不多,那么就可以分表,否则最好不要分表,因为进行增删改查的时候还需要定位到哪张表,才能进行操作,进一步增加了开销
    在这里插入图片描述

    分表还可以将表中不同的类型进行分表,然后对于增删改操作锁定的范围就会小点(如果只是针对某些字段就行修改的话),但是如果是查找的话需要进行连表查找

  • 索引优化

    索引的作用是当数据发生变化的时候(增删改),将数据按照指定字段的顺序排列后保存到一个类似表的结构中,当下次需要查询以索引条件的数据的时候,就可以很快从索引中 找到对应记录的指针并从表中获取到结果

    通过对某些字段建立索引可以提高查询速度,但是同时对于增删改增加了一定的消耗

  • 建立存储过程

    存储过程由于只用编译一次,并且可以在存储过程里面做一下复杂的操作,所以对于一些操作频率很高的业务中,可以通过利用存储过程来代替一些直接操作

分离活跃数据

在这里插入图片描述

批量读取和延迟修改

批量读取:将多次查询合并到一次中进行

将一次请求中的数据进行批量读取

将多个请求合并到一次执行

延迟修改:针对高并发且频繁修改的数据,如一些统计数据。可以先将需要修改的数据暂时保存到缓存中,然后定时将缓存中的数据保存到数据库中,但是程序在读取数据的时候可以同时读取数据库和缓存(但是这种情况会导致数据库有一段时间的数据不是最新的,并且保存缓存的机器不能出问题,否则会发生数据丢失)

读写分离

读写分离的本质是对数据库进行集群,也就是设置多个服务器来分散服务器的压力。一般用一台主服务器专门用于写操作,其他从服务器用于读操作。(写操作用一台服务器的原因是,当多台服务器同时写数据,会使得数据的同步变得非常的复杂)

当有很多从服务器时,可以将数据的同步分阶段进行,先同步一部分从服务器,然后再让从服务器去同步其他的从服务器
在这里插入图片描述

数据库同步有哪些方式?

  • 热备的情况下,只有主数据中心承担用户的业务,此时备数据中心对主数据中心进行实时的备份,当主数据中心挂掉以后,备数据中心可以自动接管主数据中心的业务,用户的业务不会中断,所以也感觉不到数据中心的切换。

  • 冷备的情况下,也是只有主数据中心承担业务,但是备用数据中心不会对主数据中心进行实时备份,这时可能是周期性的进行备份或者干脆不进行备份,如果主数据中心挂掉了,用户的业务就会中断。

  • 双活是觉得备用数据中心只做备份太浪费了,所以让主备两个数据中心都同时承担用户的业务,此时,主备两个数据中心互为备份,并且进行实时备份。一般来说,主数据中心的负载可能会多一些,比如分担6070%的业务,备数据中心只分担40%30%的业务 。

分布式数据库

分布式数据库:将不同的表放到不同的数据库然后放到不同的服务器

这里可以按照业务对服务器进行划分,使得不同的业务调用不同的数据库

好处:如果一个请求里面需要调用多个表,那么可以分散到多台服务器处理,提高处理速度(解决的是单个请求里面业务逻辑很复杂的情况,将单个服务请求分配到多台服务器处理),对于每台服务器节点又可以使用读写分离减轻当需要处理多个请求的压力

在这里插入图片描述

分布式数据库需要考虑的问题是:多表查询和事务处理

NoSQL和Hadoop

RDBMS vs NoSQL

RDBMS

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

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

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

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

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

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

Hadoop的特点
  • 将一张表中的数据分成多个部分,分别保存在不同的节点上
  • 每个部分的数据块都同时保存在多个节点上
  • 每个节点都不包含完整的数据,但是可以保存多张表的数据

优点:

  • 多个节点可以并行的处理相同的数据
  • 当一个节点宕机,数据不会丢失,因为其他节点都会有实时的备份
    在这里插入图片描述

Hadoop对数据的处理是先处理每个数据块的内容,然后再处理每一个处理的结果合并到一起

高并发的解决方案

应用和静态资源分离

将静态资源比如图片、视频、js、css和一些资源文件保存到专门的服务器中
在这里插入图片描述

页面缓存

将生成的页面暂时缓存起来,不用每次请求都重新生成页面,并设置 一个缓存失效机制(设置一个缓存时间,或者在数据发生更改之后使得缓存失效),可以将缓存放入内存,或者借助其他专用服务器比如Nginx服务器,它具有自带的缓存功能,也可以使用专门的squid服务器

对于页面中一部分数据经常发生变化的情况:可以先生成静态页面,然后使用ajax读取并修改相应的数据

集群与分布式

什么是集群:集群是每台服务器都具有相同的功能,比如读写分离时,每一台从服务器的功能都相同,可以从任何一台从服务器中读取数据,当有多个请求时,可以分散服务器的压力

什么是分布式:分布式是将不同的业务放到不同的服务器中,处理一个请求可能会用到多台服务器,从而提高处理一个请求的速度。分布式就是根据业务进行分流

集群和分布式可以一起使用,比如在分布式中对于不同的业务可以分别对应使用一个集群来实现
在这里插入图片描述

集群的分类

  • 静态资源群

  • 应用程序群:需要考虑对于不同服务器中间对于session的同步

    为什么session需要同步:由于不同的服务器为同一个用户提供服务,那么就会造成不同的服务器中存储的用户的数据信息不一致的情况,所以就需要进行同步

    同步session的方式

    • 简单粗暴的方式:一个服务器对应一个用户,不将一个用户分配到多个服务器中去处理,也就是对于一个用户的请求不会像分布式那样根据请求中包含的业务种类分配到多个服务器中处理,而是一个用户的请求就直接分配到一个服务器中去处理,不管请求的业务有多复杂(会影响处理单个请求的速度,增加响应时间,降低用户的体验度)

      如何保证同一个用户的请求只会被分配到同一个服务器中呢:可以在负载均衡分配请求的时候按照IP地址进行分配,并且这样简单的分配对负载均衡也不会造成太大的影响

    • 如果非得要使用分布式集群那么就是当session一发生变化就自动同步到其他服务器(Tomcat使用该种方式)

    • 有一个专门的程序统一管理session,所有服务器都是用同一个session(可以让管理session的程序安装Memchached的高效缓存程序统一管理session,然后在应用程序中通过重写request并覆盖getSession方法来获取指定服务器中的session)

集群需要考虑的问题

  • 不同服务器之间session的同步(针对应用程序群)
  • 负载均衡(将一个请求具体分配到哪个服务器中去处理)

反向代理

什么是反向代理:

反向代理就是客户端直接访问的服务器并不真正提供服务,它从别的服务器获取资源然后返回给用户
在这里插入图片描述

反向代理服务器和代理服务器的区别

  • 代理服务器是我们用户主动使用的,比如我们正常获取国外的网站的时候,不能直接访问,那么我们可以使用代理服务器帮助我们去获取资源,然后返回给我们,代理服务器是为我们用户服务的,没有域名
  • 反向代理服务器是服务器为了帮助服务器的工作而使用的,我们用户并不知道反向代理服务器的存在,反向代理服务器有自己的域名,我们访问它和正常的服务器没有任何的区别

反向代理服务器可以和实际处理请求的服务器在同一台主机上,而且一台反向代理服务器可以同时访问多台实际处理请求的服务器

反向代理服务器的作用

  • 可以作为前端服务器与实际处理请求的服务器(比如Tomcat)集成
  • 可以作为负载均衡
  • 转发请求:将不同类型的资源请求转发到不同的服务器处理(比如将动态资源转发到Tomcat服务器,php等动态程序;将图片等静态资源的请求转发到静态资源的服务器)(可以在url地址结构发生变化后将新地址转发到原来的旧地址上)

CDN:特殊的集群页面缓存服务器

特殊之处:

  • 服务器的位置:分布在全国各地
  • 分配请求的方式:会将请求分配到最合适的CDN服务器(电信用户分配到电信服务器,移动分配到移动的服务器)(根据地域:北京的用户分配到北京的服务器,重庆分配到重庆的服务器)

具体如何实现上述的请求分配:不是通过负载均衡服务器分配,而是使用专门的CDN域名解析服务器在解析域名的时候进行分配。

具体的过程:

  • 在ISP使用CNAME解析域名到一个特定的域名
  • 使用CDN服务器将这个解析得到的特定的域名再次解析找到对应的CDN节点

在这里插入图片描述

底层的优化

Google制定了Quic,Spdy协议进行网络的数据传输,Quic比TCP效率高而且比UDP安全

Spdy协议在HTTP协议的基础上增加了很多新的特性,提高了传输的效率,Google现在使用的是HTTP/2

总结

如今的网站架构主要考虑的是两个方面:海量数据和高并发

解决方案:

  • 使用缓存

  • 使用多资源:多存储、多CPU、多网络

    多资源分类:

    • 单个资源处理一个请求(多存储的集群,多网络的CDN,)
    • 多个资源合作处理一个请求(多CPU的分布式,静态资源分离)

…(img-4KYEDk3b-1565927742075)]

底层的优化

Google制定了Quic,Spdy协议进行网络的数据传输,Quic比TCP效率高而且比UDP安全

Spdy协议在HTTP协议的基础上增加了很多新的特性,提高了传输的效率,Google现在使用的是HTTP/2

总结

如今的网站架构主要考虑的是两个方面:海量数据和高并发

解决方案:

  • 使用缓存

  • 使用多资源:多存储、多CPU、多网络

    多资源分类:

    • 单个资源处理一个请求(多存储的集群,多网络的CDN,)
    • 多个资源合作处理一个请求(多CPU的分布式,静态资源分离)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一讲_网站架构的演变及海量数据的解决方案 的相关文章

  • 解决Android8.0之后开启service

    背景 项目测试时发现的 xff0c 在双击返回键关闭应用后 xff08 并未杀死后台 xff09 重新打开APP xff0c 其他手机都OK xff0c 但是8 0的手机会出现较频繁的crash 检查代码 xff0c 问题锁定在重新开启应用
  • 在Android Studio中使用Lambda

    应用场景 在使用过程中 xff0c 不建议在自定义接口中使用 xff0c 原因是因为Lambda常应用在只有一个方法的接口中 而我们自定义的接口 xff0c 后期可能会增加接口中的方法 xff0c 这样修改的地方就比较多 xff0c 因为L
  • Android枚举实现Parcelable接口

    枚举类实现Parcelable的写法如下 xff1a public enum MyEnum implements Parcelable FIRST 1 SECOND 2 private int mValue MyEnum int value
  • Android Studio Build Output控制台输出乱码解决

    Android Studio版本升级到4 0之后 xff0c 出现Build Output控制台输出乱码的现象 该情况在Android Studio版本3 6及以上就会出现 解决方法 xff1a 点击Android Studio 菜单栏He
  • 1230---KVM Windows 虚拟机磁盘如何快速扩容

    KVM Windows 虚拟机磁盘如何快速扩容 前言 xff1a 由于KVM虚拟机直接构建于宿主机内核之上 xff0c 对于充分利用宿主机硬件性能有天然的优势 网上针对KVM Linux 虚拟机运维的文章很多 xff0c 但针对KVM Wi
  • Android中的IPv6

    什么是IPv6 IPv6 的全称是Internet Protocol version 6 Internet Protocol 译为 互联网协议 xff0c 所以 IPv6 就是互联网协议第6版 它对比于 IPv4 所带来的是地址池的扩容 x
  • 浅谈Android下的注解

    什么是注解 java lang annotation xff0c 接口 Annotation xff0c 在JDK5 0及以后版本引入 注解是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运行时被读取 xff0c 并执行相应的处
  • 浅析Java中的final关键字

    一 final关键字的基本用法 在Java中 xff0c final关键字可以用来修饰类 方法和变量 xff08 包括成员变量和局部变量 xff09 下面就从这三个方面来了解一下final关键字的基本用法 1 修饰类 当用final修饰一个
  • volatile与Java内存模型

    1 volatile特点 volatile的两大特点是可见性和有序性 xff1b volatile的内存语义 xff1a 当写一个volatile变量时 xff0c JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个v
  • 隐藏Detected problems with API compatibility警告弹窗

    如果在Android9 0亦即API 28或以上的系统中运行debug app时 xff0c 出现如下警告弹窗 xff1a Detected problems with API compatibility visit g co dev ap
  • JAVA中枚举如何保证线程安全

    枚举类型到底是什么类呢 xff1f 是enum吗 xff1f 明显不是 xff0c enum就和class一样 xff0c 只是一个关键字 xff0c 他并不是一个类 xff0c 那么枚举是由什么类维护的呢 xff0c 首先写一个简单的枚举
  • ‘sed‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    在使用adb命令查看task和Activity的时候 xff0c 发现报错 sed 不是内部或外部命令 xff0c 也不是可运行的程序 或批处理文件 看样子是没有配置sed的环境变量 xff0c 或者没有sed工具 从网上找了一下 xff0
  • win11 我们无法设置移动热点

    有可能是因为Windows移动热点服务被禁用 启动移动热点服务 1 使用该配件的键 43 热键启动运行 WindowsR 2 要打开 服务 xff0c 请在 打开 框中键入此文本并单击 确定 xff1a services msc 3 选中W
  • 链栈(java 实现)

    Node类 xff1a package LinkStack public class Node String name int age Node next public Node public Node String name int ag
  • Android之WindowManager介绍

    WindowManager android中真正展示给用户的是window和view activity在android中所其的作用主要是处理一些逻辑问题 xff0c 比如生命周期的管理 建立窗口等 在android中 xff0c 窗口的管理
  • https://dl.bintray.com/umsdk/release/com/facebook/react/react-native/maven-metadata 502 Bad Gateway

    https dl bintray com umsdk release com facebook react react native maven metadata xml 39 Received status code 502 from s
  • Android UI深度理解:Activity UI视图结构

    Activity UI视图结构 每个Activity都会获得一个窗口 xff0c 那就是Window xff0c 它用于绘制用户的UI界面 Window是一个抽象类 xff0c 提供了绘制窗口的一组通用API xff0c PhoneWind
  • 学习嵌入式必读十本书,从C语言到ARM

    学习嵌入式必读的十本书籍 xff0c 按照C语言 数据结构 Linux C 43 43 QT 单片机 ARM的顺序给大家推荐 01 C语言 凡是计算机 电子 通信 自动化 机械专业的同学 xff0c 大一的时候必学C语言 xff0c 而且大
  • 研一(研究生)看论文文献必须要知道的几个网站

    找论文看文献必备的几个网站 明确研究方向查找论文看英文文献看文献方法想说的几句话 明确研究方向 刚进入研究生阶段的同学们都干劲十足 xff0c 充满无限期待 但是没有正确的方向很容易让你的努力白费 xff0c xff08 有人会说丰富了自己
  • 【网络教程】群晖自动更新 Docker 映像与容器(Watchtower)【转】

    群晖自动更新 Docker 映像与容器 xff08 Watchtower xff09 更多内容

随机推荐

  • git多账号配置

    什么叫多账号配置 xff0c 也就是说假如你在公司用的gitlab服务器 xff0c 但是自己还有用到GitHub xff0c 那么此时你在本地就需要配置多个ssh key 步骤如下 xff1a 利用ssh keygen t rsa f g
  • Ubuntu 18.04和windows建立共享文件夹

    1 安装samba sudo apt install samba sudo apt install cifs utils 2 创建共享目录 mkdir home yourname share yourname是home下一个文件夹 xff0
  • Linux权限详解,多用户多组各种权限配置原理

    网上有太多关于Linux权限详解 xff0c 这里不啰嗦那些 主要解释下这些权限是杂用的 xff0c 否则知道了什么用户 组之类的权限也配不好 一 权限分类 r xff1a 读取权限 xff0c 数字代号为 34 4 34 w xff1a
  • 1.tow sum

    文章目录 题目c 43 43 版本java版本利用hashmap正确做法 题目 Two Sum Easy Given an array of integers return indices of the two numbers such t
  • 2. Add Two Numbers

    2 Add Two Numbers Medium 59971568Share You are given two non empty linked lists representing two non negative integers T
  • Linux VNC server的安装及简单配置使用

    Linux VNC server的安装及简单配置使用 转 xff1a http www 2cto com os 201309 241104 html Linux VNC server的安装及简单配置使用 摘要 xff1a Linux vnc
  • 3. Longest Substring Without Repeating Characters

    Longest Substring Without Repeating Characters Given a string find the length of the longest substring without repeating
  • 4. Median of Two Sorted Arrays

    Median of Two Sorted Arrays Hard There are two sorted arrays nums1 and nums2 of size m and n respectively Find the media
  • 7. Reverse Integer

    文章目录 Reverse IntegersolutionAlgorithm Reverse Integer Easy Given a 32 bit signed integer reverse digits of an integer Ex
  • 8. String to Integer (atoi)

    String to Integer atoi Implement atoi which converts a string to an integer The function first discards as many whitespa
  • 9. Palindrome Number

    Palindrome Number Easy Determine whether an integer is a palindrome An integer is a palindrome when it reads the same ba
  • 1071. Greatest Common Divisor of Strings

    1071 Greatest Common Divisor of Strings Easy 30985Share For strings S and T we say 34 T divides S 34 if and only if S 61
  • 这个问题搞了我一天

  • 150逆波兰式

    文章目录 150 Evaluate Reverse Polish NotationSolution 150 Evaluate Reverse Polish Notation Medium Evaluate the value of an a
  • 收到礼物最大值

    题目描述 在一个m n的棋盘的每一个格都放有一个礼物 xff0c 每个礼物都有一定价值 xff08 大于0 xff09 从左上角开始拿礼物 xff0c 每次向右或向下移动一格 xff0c 直到右下角结束 给定一个棋盘 xff0c 求拿到礼物
  • 64. Minimum Path Sum

    64 Minimum Path Sum Given a m x n grid filled with non negative numbers find a path from top left to bottom right which
  • 找出亲密对数

    题目内容 xff1a 求数n之内的亲密对数 所谓 亲密对数 xff0c 即A的所有因子 xff08 包含1但不包含其本身 xff09 之和等于B xff0c 而B的所有因子之和等于A 输入格式 某个数字n 输出格式 xff1a 此数字n之内
  • 5. Longest Palindromic Substring

    5 Longest Palindromic Substring Given a string s find the longest palindromic substring in s You may assume that the max
  • 516. Longest Palindromic Subsequence

    516 Longest Palindromic Subsequence Given a string s find the longest palindromic subsequence s length in s You may assu
  • 第一讲_网站架构的演变及海量数据的解决方案

    文章目录 看透springMVC 读书笔记 第一讲单机类型CS结构 xff08 Client Server xff09 BS结构 xff08 Browser Server xff09 BS结构网络传输方式OSI七层模型 TCP IP四层模型