springmvc 工作原理:
tomcat 启动时,也是先加载 web.xml,找到 spring mvc 的前端总控制器 DispatcherServlet,并且通过 DispatcherServlet 来加载相关的配置文件信息。
当浏览器发出一个请求之后,首先找到 DispatcherServlet,通过这个控制器和代码中的requestMapping 注解找到对应的 controller 中的方法,参数直接通过方法参数接收就可以,然后调用 service、dao 操作数据库,返回数据。如果页面跳转,controller 的方法可以返回ModelAndView 和 string 类型,再通过 spring-mvc 配置文件中的视图解析器找到对应的页面。
数据可以用 request 或 ModelAndView 返回到页面。如果是 ajax 请求,可以直接返回 List 或
对象,加上 responseBody 注解,进行返回。
2 堆和栈
栈的空间比较小,存放函数的参数值,局部变量的值等。
堆的空间比较大,用于存放 new 的对象。
与 C++不同,Java 自动管理栈和堆,程序员不能直接地设置栈或堆。
堆(数据结构):堆可以被看成是一棵树,如:二叉树。
栈(数据结构):一种先进后出的数据结构。
3 Java 集合
Java 里边主要有两种集合,collection 接口和 map 接口,其中 collection 下又包含 list 和 set两个子接口;
List 子接口:有序,可以有重复元素。和数组类似,List 可以动态增长,查找元素效率高,相对的插入删除元素效率低,因为会引起其他元素位置改变。
Set 子接口:无序,不允许重复。检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。set 集合中的元素不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
List 接口下有三个实现类 ArrayList 、LinkedList 和 Vector
Vector 是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用
ArrayList 实现一个动态数组,它的规模可变并且能像链表一样被访问。它提供的功能类似 Vector 类但不同步,它是以 Array 方式实现的 List,允许快速随机存取。特点是读快改慢;
LinkedList 实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的链表也可以像栈或队列一样被使用。提供最佳顺序存取,适合插入和移除元素。特点是改快读慢Set 接口有 HashSet 和 TreeSet 两个实现类HashSet 能够快速定位一个元素,
要注意的是:存入 HashSet 中的对象必须实现 HashCode()方法;
TreeSet 将放入其中的元素按序存放。它实现的是 SortedSet 接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。Map 接口的实现类主要有 HashMap 、HashTable 和 TreeMap;当元素的顺序很重要时选用 TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。HashMap 不是同步的,Hashtable 是同步的,但 Hashtable 不推荐使用,因为 HashMap 提供了所有类似的功能,并且速度更快。当需要在多线程环境下使用时,HashMap 也可以转换为同步的。HashMap 没法保证映射的顺序一直不变,但是作为HashMap 的子类 LinkedHashMap 可以。HashMap 可以通过 Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。
4 锁机制:
4.1 sql 锁:
悲观锁:就是考虑问题很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁;
实现:sql 语句后边加上 for update
例子:Select id,nam from biao for update
乐观锁:就是考虑问题很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
实现:在表里边加一个 vesion
例子:
Select max(nub) ,version from biao
Update biao set nub=nub+1,version=vsersion+1 where id=id and version =version
4.2 方法锁:
方法锁主要包括:synchronized 锁和 lock 锁
区别:
1)Lock 是一个接口,而 synchronized 是 Java 中的关键字;
2)synchronized 当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,不能够响应中断,(释放:1 执行完线程自动释放 2 发生异常 jvm让线程释放)((比如调用 sleep 方法)),这样的好处是不会导致死锁现象发生。
Lock 锁,可以不让等待的线程一直无期限地等待下去,比如只等待一定的时间或者响应中断。但 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时必须在 try{}catch{}块中进行,需要在 finally 块中释放锁;
3)通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于 synchronized。所以说,在具体使用时要根据适当情况选择。
在并发量比较小的情况下,使用 synchronized 是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重,此时 ReentrantLock(可重入锁,唯一实现了 Lock 接口的类)是个不错的方案。
5 Reids
Redis 是一个继 memcached 后的又一个第三方缓存数据库,他比 memcached 强大很多,支持更多的数据类型(String、list、set、sort set、hash),支持持久化,支持集群;Redis 虽然支持持久化,但是他并不适合持久化的保存数据。因为他不是很稳定。但是由于他是保存在内存中,读取速度非常快,所以在项目中一般都用它作为数据库和应用程序直接的中间层来使用,已减轻数据库压力,提高运行效率。我们项目中很多地方用到了 redis;比如商品的三级分类、省市县、关于我们、联系我们、友情链接,常见问题等经常查询但是不经常改变的数据.redis 还可以在 tomcat 集群里边实现session 的共享。由于他的单线程的,所以在电商平台里边也经常用他做“防止超卖”, 生成规则的商品编号等。还有就是购物车也用到了 redis代码中,我们一般都通过 spring 整合 redis 官方提供的 jedis 工具包来操作 redis。可以是单机版,也可以是集群。Redis 本身就支持集群操作 redis_cluster,另外 redis 还支持主从复杂,还有他独特的哨兵模式,在主服务器宕机时,从服务器可以自动转换为主服务器。
另外,他也有他的分片机制,就像 mysql 的水平分表设计,数据量大时,可以把数据存储到不同的库中,来减轻 redis 负担。
Redis 的持久化方式主要有 2 种,RDB 和 AOF,RDB 是一种快照方式,默认每隔 5 分钟创建一个快照副本,这种方式占用空间大,而且会丢失间隔时间 5 分钟之内的数据,但是他适合做备份,恢复时,可以根据需要恢复任意间隔时间点的数据。AOF 是一种日志的持久化记录方式,每秒钟,都把 redis 中新增的数据记录到日志文件中,这种方式只有一个文件,占用空间少,最多丢失 1 秒内的数据。相对比较好,但是如果想要恢复 5 分钟或 10 分钟前某个时间点的数据,就不行了。所以实际项目中,我们一般会两种方式同时使用。如果搭建集群的话,还可以通过集群互相备份数据,只要集群不同时挂掉,单个 redis 就可以从集群中的其他服务器获取到最新数据。
还有就是,由于 redis 不是很稳定,有时候会发生“穿透”和“雪崩”;redis,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去数据库
查找。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如 DB)带来很大压力,这就叫“缓存雪崩”。解决办法是,对查询结果为空的情况也进行缓存,并且给缓存设置不同的有效期。当然 redis 容灾的最有效的方法还是搭建集群。
6 Solr
Solr 是一个基于 Lucene 开发的全文搜索引擎,项目中一般用它做首页的全文搜索或者做文件管理系统中的文件检索,因为他提供了分词的支持,同时采用文件存储数据,所以无论是查询速度还是匹配精确度方面,都比数据库的 like 查询方便了很多。比如:电商网站上,用户想买手机,输入“苹果手机”,但是系统中录入的是 ipone 手机,那么用 like 查询就很难匹配到,但 lucene 就可以解决这个问题。使用时,Lucene 官方紧紧提供了核心实现的 jar 包,我们只能通过 api 文档,自己实现创建索引和查询的逻辑,并进行优化处理,开发比较繁琐,但比较基础,更灵活,做文档的检索时可能相对更好点。而 solr 是 Apache 开发的一个开源的 web 工程,他帮我们实现了创建索引、查询等操作,经内部进行了一定的优化,然后以 restful 风格对外提供了接口。并且提供了 solrj 的 sdk 工具包,方便 Java 开发者直接使用。一般做电商等网站的全文搜索,我们使用时,只需要官方下载到 solr 工程的 war 包,根据我们的实际情况,修改 solrhome 、solrconfig.xml 和 schema.xm 文件,简单配置一下使用的数据库和创建索引的 sql 和字段,然后把 war 包进行部署就可以了。可以通过他提供的页面进行创建和查询索引的操作。也可以在项目中集成 solrj 的 jar 包,直接调用他的方法,进行创建索引和查询的操作。Solr 支持高亮显示搜索关键字,支持匹配权重配比(无特殊排序要求时,默认根据查询相关
度来进行排序,可以在配置文件中配置,通过权重配置相关度) 、支持分页,支持自动分词等。我们一般都采用 IK 分词器,代替他默认的标准分词器。因为 IK 对中文的支持比较好。
如果想要支持拼音,还可以使用它的拼音分词器。Solr也支持集群部署,官方提供了SolrCloud的部署方案,一般通过 solrcloud+zookeeper 实现,zookeeper 在 solr 集群中主要有两大作用:
1 负载均衡 2 集中式配置管理。需要注意的是:zookeeper 一般采用选举机制,所以一般都是 2n+1(奇数)台。
另外由于 solr 查询时,不是直接查询数据库,而是开始时,先把数据库中的数据同步到索引文件中,查询时,直接查询索引文件。索引数据库数据修改时,需要同时同步到 solr 的索引文件中,也就是创建索引。创建索引分为全量创建和增量创建。可以通过配置文件实现自动增量更新,自动增量更新可定时将数据库中的数据导入到 solr 索引库中,并可定时重建索引库,合并小索引文件为大的索引文件。除了 solr 以外,最近又出了一个搜索引擎叫ElasticSearch,我简单了解了一下,他和 solr 一样,也是一个基于 Lucene 的,rest 风格的,分布式搜索引擎。Solr 特点是:查询快,但更新索引时慢(即插入删除慢),对用于电商等提前录入好数据,之后查询特别多的应用;而 ElasticSearch 简称 ES 建立索引快、查询相对
慢点,但综合上表现为实时性查询快,用于新浪了,facebook 了等搜索。
1、zookerpper 的作用;
2、solr、Lucene、es 的区别;
3、solr 集群搭建主要步骤,和集群方案;4、solr 高亮和分页
5、solr 权重配置;
6、索引创建;全局索引和增量索引;
7、solr 部署主要步骤;
8、solrhome
9、solrconfig.xml,主要定义 solr 的处理程序(handler)和一些扩展程序;
solrconfig.xml 文件不仅指定了 Solr 如何处理索引、突出显示、分类、搜索以及其他请求,
还指定了用于指定缓存的处理方法的属性,以及用于指定 Lucene 管理索引的方法的属性。
10、schema.xml,主要定义索引的字段和字段类型。
fieldtype、Fields、copyField、dynamicField
7 数据库比较
1、 首先主要是关系型数据库、nosql 数据库和缓存数据库的区别;我觉的:
关系型数据库(mysql、Oracle)就想当于一个储物柜,里边分了各种小格子,把各种数据有序的保存在里边,查询时非常方便;有比较完善的 sql 语句;
mysql 免费开源,自动提交事务,是基于表级别的一个事务,而 Oracle 不自动提交,是基于行级别的事务;mysql 安装包小,使用简单,Oracle 安装包较大,还会收费,更适合于大数据的处理、并发量高;
mysql 用 limit 进行分页,第一个参数表示启始数,第二个参数表示要查询的条数。
oracle 用伪列 rownum 来进行分页,因为伪列只能用小于,不能用大于,所以需要一个两层的嵌套查询。
mysql 主键可以自增。Oracle 必须用序列(sequence);字段类型有些区别;
mysql 一般都是先有用户,然后创建库、创建表。而 Oracle 一般是,先创建数据库,然后创建临时表空间、物理表空间,再创建用户,创建表。
nosql 数据库(mongdb)就相当于一个仓库,比如把衣服放在一堆,书本放在一堆,这样他的存储效率肯定很高,但是查找时,不方便精确查找。所以 nosql 更适合于数据量比较大,但是数据之间关系不是特别强,或者不是特别重要的数据;比如:电商里边的评论数据;他的 collection 相当于数据库,document 相当于表,document 中数据主要以 json 格式存储;
缓存数据库(redis、memcached):缓存数据库由于是保存在内存中的,所以他的存储效率非常高;但是他不适合持久化存储数据,尽管 redis 支持持久化,但是他也仅仅是在一定程度上保证了数据的安全性,还是有很多情况会造成数据丢失的,比如 redis 穿透、雪崩等。
所以他仅仅适合做为数据库和应用程序直接的中间层使用,不能作为真正的存储数据库使用。即使使用,也只能是一些不是特别重要的数据,比如购物车,在 B2C 的项目中,用户购物车一般都是临时存储,如果放入购物车长时间不提交,那么用户再购买的可能性很小了,所以即使丢了,也不会造成太多的损失。以这个,来换取项目的运行效率非常划算;
8 dubbo
dubbo 是一个分布式架构的服务框架,一般结合 maven 的模块试开发使用。传统的单架构项目,不方便维护和升级;通过 maven 的模块式开发,就可以把一个单架构的工程,拆封成一个一个的小模块,包括(jar 和 war);jar 包可以被 war包直接应用。war 包可以分布式部署,但是这样不同的 war 之间的交互就成为了问题。我们之前的做法是,两个 war 之间进行交互时,一般采用 webservice 或httpclient。但是在这种分布式架构中,多个 war 之间的交互会特别频繁,如果用 webservice或 httpclient架构师很多时候自己都搞不清楚他们之间的依赖关系了。而 dubbo 解决了这个问题,有了 dubbo 架构以后,多个 war 之间不在直接进行交互,而是统一和 dubbo 的注册中心 zookeeper 进行交互。无论是发布服务还是调用服务,都通过 dubbo 实现,并且提供了 web 页面,来监控和管理各个接口直接的调用。使用时首先搭建 dubbo 的注册中心 zookeeper,然后下载 dubbo 的服务治理工程 dubbo_admin.war,解压修改他的配置文件 dubbo.properties,设置用户名、密码和注册中心 zookeeper 的 ip、端口。部署到 Tomcat 的 webapp 中,启动 Tomcat,浏览器用 ip+端口访问,就可以看到 dubbo_admin 的 web 页面了。接着在我们要发布或者调用服务的项目中,导入 dubbo 提供的相关 jar 包,加载配置文件,把要发布的服务注册到 zookeeper 里边。或者从 zookeeper 里边调用服务就可以了。dubbo_admin 的 web 页面中,可以监控和管理所有的服务提供者和调用者。。
在 dubbo 架构中,service 接口和实体对象时各个工程共享的,service 实现类是发布服务的工程独有的。只需要发布服务的工程把他的接口注册到
zookeeper 中,其他工程就可以从 zookeeper 中进行调用了。
用 dubbo 的好处是:把项目拆分成各个独立的小工程,通过接口调用方式,互相交互数据,可以单独进行部署和升级,这样就减少了他们直接的耦合性和代码的复用性。还可以针对不同模块采用不同的部署策略,比如订单模块并发比较高,所以可以把订单模块这个 war 包,单独部署多套,都注册到同一个 zookeeper 中。当客户端调用时,zookeeper 会帮忙进行负载处理。
【下载地址】
百度网盘链接:https://pan.baidu.com/s/1yNOmSickhugJR3MzB2EnBw,提取码:4593
相关文章
使用-JFreeChart来创建基于web的图表
XStream使用文档
WebService发布过程及常见问题
webpack实战入门进阶调优分享
weblogic调优参数及监控指标
weblogic节点管理
weblogic管理控制台概述
weblogic-部署和启动
WebLogic-Server-性能及调优-调优-Java-虚拟机
Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。
FlashFXP绿色版网盘下载,附激活教程 1774
FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具
Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1559
firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ
navicat for mysql中文绿色版网盘下载 1620
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
火车头采集器(旗舰版)绿色版网盘下载 1703
火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA
Photoshop(CS-2015-2023)绿色中文版软件下载 1819
安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64