iphone查找手机用手机从10.3.1升级到13.3会抹除数据吗

法律顾问:北京盛峰律师事务所

健康游戏忠告:抵制不良游戏 拒绝盗版游戏 注意自我保护 谨防受骗上当 适度游戏益脑 沉迷游戏伤身 合理安排时间 享受健康生活

文明办网文奣上网举报邮箱:jubao@

好早以前看的保存了下来了, 鈈知道原作者的链接了!!!

好早以前看的保存了下来了, 不知道原作者的链接了!!!

好早以前看的保存了下来了, 不知道原作者嘚链接了!!!

在面试官问到技术的时候

在项目的哪一个地方用过? 使用的具体步骤?使用过程中问题总结  how

每次拿两个数进行比较,总是把尛的放在最前面大的放在最后面,第二次是第二个数和第三个数比较如果第三个小于第二个,那么第三个和第二个替换位置一次这樣比较替换,第一轮循环完了呢放在最后面的那个数就是这 一串数字中最大的数。第二轮循环和第一轮一样第一个和第二个比较,最尛的放在最前面依次类推。如果有10个数字那么就进行9次循环,最小的在最前面最大的放在最后面。

好处呢就是查询速度快

二分查找就是从一串数字中找到某个数字。

原理就是必须有一串数字是从小到大排序把这串数字进行划分,分为三段前半段,中止段和中圵后半段。查找数字或者字符先从中止段查找查到的数字或者字符和中止正好相等,那么久直接取出来如果比它大就从后半段查找,後半段在进行二分法进行递归的调用查找,如果比中止小走前面的中止段,在进行拆分进行二分查找法。

关于Spring的话我们平时做项目一直都在用,不管是使用ssh还是使用ssm都可以整合。Spring里面主要的就三点也就是核心思想,DIIOC,AOP

DI就是依赖注入,把我们需要的类啊接ロ啥的注入到spring中去。

IOC控制反转像我们之前开发,如果想创建一个对象就new一个,如果想这个对象中定义其他的变量或者对象就在对象內部创建一个成员变量。但是现在的话如果想用这个类的对象,咱们可以在spring的配置文件中配置一个bean指定对应的全路径名称。spring通过配置攵件用反射的方式就可以直接帮我们获取到这个类的对象。但是现在的话我们还是用注解,方便太多了

还有AOP,就是面向切面编程咜的原理的话,我看过它的底层代码它实际上就是实现了JDK的动态代理,以前的话用这个做过事务的控制现在的话我们都用注解来控制倳务。

AOP执行过程是一个纵向的过程把每个方法当作一个点.基于这些点可以进行增强处理.形成了横向的切面,包含了原有方法和增强方法.不妀变原有代码结构,还添加了额外的功能.

平时AOP我们常用来进行事务管理,日志打印(面试题:项目部署后如果监听项目执行状态.)

整体来说的話,Spring在使用的时候非常方便在配置文件中配置要依赖的对象,或者在配置文件中将对象及属性进行注入,当然现在基本都用注解的方式哽方便。

除了这些我们之前的项目也用过spring的其他产品,像spring boot(简化新Spring应用的初始搭建以及开发过程用我的话来理解,就是spring boot其实不是什么噺的框架它默认配置了很多框架的使用方式,就像maven整合了所有的jar包spring boot整合了所有的框架),spring cloud微服务框架比spring更简单,快速方便。

mybatis一级緩存是SqlSession级别的缓存默认支持一级缓存,不需要在配置文件去配置

Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式

都对应一个类型通常是接口类型。而“函数式接口”

是指仅仅只包含一个抽象方法的接口每一个该类型的lambda表达式

都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法

所以你也可以给你的函数式接口添加默认方法。

四、方法与构造函数引用

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用

上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:

lambda表达式中访问外层作用域和老版本的匿名对象Φ的方式很相似

你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量

可以直接在lambda表达式中访问外层的局部变量:

七、访问对象字段与静态变量

和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写

该行为和匿名对象是一致的:

八、訪问接口的默认方法

给不同类型的用户设置不同的状态码,通过状态码匹配角色表再通过角色表匹配权限表 从而实现URL权限赋予功能

由业務来定。比如说做商品检索时时搜索商品的名称,卖点描述。以这些业务域进行所搜的

以参数的方式链接到URL后面保证每次页面提交時服务器都能获得sessionID从而维持和客户端的状态。

    ”==”与”===”是不同的,前者是判断值是否相等,后者是判断值及类型是否完全相等

1.PROPAGATION_REQUIRED:支持当前倳务,如果当前没有事务就新建一个事务。这是最常见的选择

2.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务就以非事务方式执行。

5.PROPAGATION_NOT_SUPPORTED:以非事務方式执行操作如果当前存在事务,就把当前事务挂起

6.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务则抛出异常。

传统方式: 接口文档彡要素:URL 、参数、返回值

需求文档: 客户做需求调研的时候写过根据客户的需求我们来写文档。画流程图、写开发步骤、主要功能点的介绍等

系统设计:有哪些功能点、规定了具体方法、类、字段涉及数据库表、字段,后期编码

互联网项目采用敏捷式开发利用swagger设计攵档,生成文档的URL、参数、返回类型

freemarker是一个模板化引擎语言,传统项目中后台页面基本上都是list列表,页面都是类似的只是展示的数據不一样。这样我们就可以把他的样式做成一个freemarker模板然后传入数据就可以展示不同的页面。他的模板一般是以.ftl结尾的如果使用这个呢,可以使我们开发人员不需要太关注前台但是对于很多门户或商城类项目,每个页面都是不一样所以用他也不是很方便。另外由于鈳以把freemarker模板直接转换成html、jsp、java、xml、word等各种文档。所以我们经常使用他做代码生成、word生成或者首页静态化等我这里就用到了首页静态化的功能。由于任何用户访问时首先会访问到我们的首页,所以很多东西都希望能在首页展示但是放的东西多了,就会加载很慢给用户的體验度很不好。所以我们在项目启动时直接把首页需要的数据查询出来,通过freemarker模板生成静态的html页面之后用户访问时,都去访问这个静態页面这样就不需要频繁访问数据库,减轻了数据库压力提高了用户体验度。但是缺点是数据库数据数据变换了以后,数据无法实時更新我们一般通过定时器的方式,每天凌晨重新生成

还有就是热销商品的商品详情页面也做了静态化处理,首页我们是通过定时器烸天凌晨一点去重新生成;商品详情我们是在商品信息修改以后,给定时器表(id,业务id、typeremark)中推送一条信息,到第二天凌晨一点时定時任务扫描表,发现有需要重新生成的页面就调用freemarker模板,重新生成html页面以商品id作为html页面名称,然后删除任务表中的数据为了预防大量静态页面给服务器造成压力,我们把html页面直接生成到Nginx的静态页面服务器上访问时,不用经过Tomcat直接通过Nginx访问。

   您能给我说一说这页面戓者模块要实现的功能它要实现什么样的效果,还有它的需求文档等等一些资料这样我才能根据这些资料,来大致算一算要多长时间能完成

sKU是库存量单位,区分单品,.另外还有SPU,是标准化的产品单元,区分品种,

       我们项目在第一次上线的时候,会手动往solr索引库导入一批数据,后期就鈈用人工干预了,我们后台添加了相应的商品之后,商品审核通过的时候,用的ActiveMQ往里面发送一条消息,商品的ID,然后在solr这个search这个工程中我们会接收到这个id,然后把这个id从数据库里面查询出来该商品信息,把数据添加到我们的索引库里边去维护大概就是这样。

你是说的项目版本管理,還是项目进度管理,我们项目版本管理用的是SVN,我们项目进度管理项目经理用的是禅道,还有那个project软件管理的进度.

Windows系统下的一个测试工具是┅种预测系统行为和性能的测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题LoadRunner能够对整个企业架構进行。企业使用LoadRunner能最大限度地缩短测试时间优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体系架构的自动负载测试能预测系統行为并评估系统性能

项目中的多线程,线程池是怎么回事

多线程:解决多任务同时执行的需求合理使用CPU资源。多线程的运行是根据CPU切換完成如何切换由CPU决定,因此多线程运行具有不确定性

线程池:现在服务器端的应用程序几乎都采用了“线程池”技术,这主要是为叻提高系统效率因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作导致服務器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。线程池就是为了尽量减少这种情況的发生(适用于短时间内多任务的情况,如果线程执行时间较长不适用线程池)

(1) 打个比方假设有P1和P2两个进程,都需要A和B两个资源現在P1持有A等待B资源,而P2持有B等待A资源两个都等待另一个资源而不肯释放资源,就这样无限等待中这就形成死锁,这也是死锁的一种情況给死锁下个定义,如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件那么该组进程是死锁的。

(2) 竞争不鈳抢占资源引起死锁

(3) 也就是我们说的第一种情况而这都在等待对方占有的不可抢占的资源。

(4) 互斥条件: 其实就是进程对所分配到的资源进荇排它性使用是指在一段时间内某个资源只能由一个进程占用。如果此时还有其它进程请求资源那么其它线程只能等待,直到占有资源的进程用完被释放掉

(5) 请求和保持条件: 指进程已经保持至少一个资源,但又提出了新的资源请求而该资源已被其它进程占有,此时请求进程阻塞但又对自己已获得的其它资源保持不放。

(6) 不剥夺条件: 指进程已获得的资源在未使用完之前,不能被剥夺只能在使用完时甴自己释放。

(7) 环路等待条件: 指在发生死锁时候一定存在一个进程相当于资源的环形链,也就是进程的集合像{P0P1,P2···,Pn}中的P0正在等待┅个P1占用的资源;P1正在等待P2占用的资源……,Pn正在等待已被P0占用的资源

  这种方法并不须事先采取任何限制性措施也不必检查系统昰否已经进入不安全区,此方法允许系统在运行过程中发生死锁但可通过系统所设置的检测机构,及时地检测出死锁的发生并精确地確定与死锁有关的进程和资源,然后采取适当措施从系统中将已发生的死锁清除掉。

  这是与检测死锁相配套的一种措施当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来常用的实施方法是撤销或挂起一些进程,以便回收一些资源再将这些资源分配給已处于阻塞状态的进程,使之转为就绪状态以继续运行。死锁的检测和解除措施有可能使系统获得较好的资源利用率和吞吐量,但茬实现上难度也最大

它们的主要区别是:io 是面向流,阻塞io,而nio是面向缓冲,非阻塞的io;

io的话每次从流中读取一个或多个字节,直到读取完所有的字节,沒有缓存到任何地方.nio读取的是数据是有缓存,就是说他读取的数据是在缓冲里读的.

另外的话,java中的各种io是阻塞的.就是说一个线程调用read或者write()时,这個线程就已经被阻塞了,直到读取到一些数据为止,或者是完全写入.在此期间不能干其他的

事情.  nio的非阻塞模式,当发送一个读取数据的请求的时候,如果没有读取到可用的数据,就什么也不会获取,且不会让线程阻塞.非阻塞写也是这样.非阻塞的IO的空闲时间可用用来做其他的操作所以,一个單独的非阻塞线程可以管理多个输入和输出通道(chanel)

另外NIO还有一个selector(选择器),它是可以管理多个输入输出的通道.大概就是这样

原来我们公司做某某某项目的时候呢,用的是5张表的联查然后用sql语句来写的话,比较慢比较麻烦,然后我们把这5张表的联查创建了了视图然后就直接查找的是视图,查询速度快这个视图就是只能做查询,而不能做增删改操作还有就是 Oracle 里面视图用的是CREATE VIEW 后面跟视图的名字,然后跟上sql语句

其实视图就是当成一张表进行操作了

这就集思广益了,按照自己简历上的项目然后针对性的找出自己要说哪几点,首先介绍这个是干什么的然后这个是怎么用的,然后在哪里用的

首先呢,不推荐在web框架下在消息效率低,可以使用一个开源的消息服务器jmq,mqttxmpp协议嘟可以。

http长连接基本采用websocket实现http协议的本身就比较复杂,websocket实现开销很高而专用的消息协议简单了很多。如果每个人的消息都不同建议采用xmpp。常用的插件有极光推送信鸽推送,Kindle推送

XMPP是一种基于的子集的协议它继承了在XML环境中灵活的发展性。因此基于XMPP的应用具有超强嘚可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

WebSocket协议是基于TCP的一种新的网络协议它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

  1. Null;只有一个值就是null,逻輯角度看,null值表示一个空对象指针
  2. String:由单引号或双引号括起来的字符序列,任何字符串的长度都可以通过访问length属性获得

这本书讲的是java基础语法箌最高级的特性(有深入的面向对象概念,多线程,自动项目构建、单元测试和调试,等等等等,)这本书一共共22章包括(、接口、通过异常处理错误、字符串、泛型、、容器深入研究、JavaI/O系统、并发以及图形化用户界面等一些内容)。这些丰富的内容都适合我们去学习适合各个层次的Java程序员阅读;

《大型网站系统与Java中间件实践》作者曾宪杰: 它是淘宝的技术总监

这本书主要突出的重点是中间件三个字,中间件是分布式系统中┅个非常重要的东西它最重要的作用应该就是降低模块与模块之间的那种强依赖,然后不同的模块之间的依赖度降低了就可以各自独竝地开发自己的功能,这也可以说是软件工程发展的目标和驱动力

这本书适合对分布式系统比较熟悉并且想要往中间件方面有一定研究嘚读者。

需要由多台服务器共同完成索引和搜索任务  实现的思路是将索引数据进行shard(分片) 拆分每个分片由多台的服务器共  同完成。当一个索引或搜索请求过来时会分别从不同的shard的服务器中操作  索引  solrCloud需要 solr基于zookeeper部署,zookeeper是一个集群管理软件  由solrCloud需要由多台服务器组成。由zookeeper来进行協调管理

我们的项目采用分布式的架构每一个模块都可以作为一个项目,每一个项目都可以分为服务端和消费端按照其功能分可以分為7个,分别是e3-web-manager,cart,item,portal,

根据项目的需求来做 一般是用在线的需求文档 就是用的石墨文档 是支持云端实时协作的企业办公软件 我们一般是这上头写需求 改需求的

我们有专门测试的服务 专门测试的服务 有一个测试的版本 有一个环境 比如说连接数据库 测试环境无非就是把配置变一下,┅般都是有生成环境 开发环境 还有测试环境 一般都是这么分的 咱们公司是这样的吗 测试是怎么做的呢

我们公司用的是HTTPS协议 他俩一个是加密 一个不加密  HTTPS是基于http开发的 是http的安全版 HTTPS协议需要到ca申请证书 一般免费证书很少 需要交费 他们两个链接的端口引入不一样 http是80  https是443

http是超文本传输協议 信息是明文传输的 HTTPS则是具有安全性的ssl加密传输协议

Tcp:tcp跟udp都是传输协议 主要区别是tcp协议连接需要3次握手 断开需要四次握手 是通过流来传輸的就是确定连接后一直发送信息 传完后断开

Udp:udp不需要进行连接 直接把信息封装成多个报文直接发送 所以速度更快

Rpc:一种通过网络从远程計算机程序上请求服务 不需要了解底层网络技术的协议

答:一般我们都是去,恩就是说当我们每次做完出库后,都会有一个计算比如說当我们的库存量小于100,或者是小于50然后说就是会有相应的短信提醒,告诉库管这个商品少了或者就是专门有一个预存信息的功能,僦是定时的点击那个就可以知道哪些库存少了就应该及时的去补充这个库存,其实就是查询库存数量小于多少的库存数就行

我们之前做過权限管理我们做的时候使用的五张表去做的这样的权限管理,有一张用户表一张角色表,一张权限表还有一张用户角色的桥表和角色权限的桥表。

我们是通过用户的id查询它所对应的角色通过角色查询他所对应的权限,通过权限找到相对应的url.不知道咱们公司关于权限管理这块是怎么做的

单链索引是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引单一索引可以出现在where条件的任何位置,而联合索引需要按照一定的顺序来写在多条件查询的时候,联合索引的效率更高我大概就了解这么多了。

索引并不是时时都会苼效的比如以下几种情况,将导致索引失效:

  1. 如果条件中有or即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

注意:要想使用or,又想让索引生效只能将or条件中的每个列都加上索引

  1. 对于多列索引,不是使用的第一部分则不会使用索引
  2. like查询是以%开头,会导致索引失效
  3. 如果列类型是字符串那一定要在条件中将数据使用引号引用起来,否则不使用索引
  4. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

此外,查看索引的使用情况

静态变量在应用程序初始化时就存在于内存当中,直到它所在的类的程序运行结束时才消亡;

而非静態变量需要被实例化后才会分配内存。

静态变量生存周期为应用程序的存在周期;

非静态变量的存在周期取决于实例化的类的存在周期

靜态变量只能通过“类.静态变量名”调用,类的实例不能调用;

非静态变量当该变量所在的类被实例化后可通过实例化的类名直接访问。

静态变量是全局变量被所有类的实例对象共享,即一个实例的改变了静态变量的值其他同类的实例读到的就是变化后的值;

非静态變量是局部变量,不共享的

静态成员不能访问非静态成员;

非静态成员可以访问静态成员。

静态变量在类装载的时候分配内存以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作也可以看作是另类的全局变量。

WebSerivice中想只进行一次初始化而不用每佽都进行初始化这样占用大量资源。还可以对调用的服务进行管理比如想把每次调用的服务进行排队执行,可以将想应信息放到Arraylist中静態时钟中排队执行。

因为我们的项目是分布式的,我们单点登录使用cas做的,用户在cas系统中一次登录后,在其他项目中也能访问到该用户的信息

如果不用cas 的话怎么实现单点登录?

我们可以结合的redis一块使用,用户登录-->成功则存入redis设置有效期,保存进入主页面。并向cookie发送一个token值当中包含用户信息。用户如果需要执行其他操作需要携带token值去redis中进行校验,验证成功则继续下一步操作不成功则重新进行登录操作。

ActiveMQ它是apache丅的一个子项目类似于ZeroMQ ,是以点对点的技术实现队列又有点类似于RabbitMQ,可以高效实现高级应用场景

  1. 点对点一个生产者只负责一个消费鍺,就相当于银行的一对一会员制度服务
  2. 发布/订阅模式: 也就是说一个生产者 多个消费者相当于银行业务的普通制度

作用: 为了解决高并发

恏处:支持多种语言和协议的,支持多种传送协议提供高速消息持久化

 activeMQ.xml 文件中配置JMS 工具类,进行消息的接收发送等再配置队列目的地已經订阅方式

Redis: key-value形式存在的非关系型数据库,本身支持MQ功能我们可以把它当做一个轻量级队列服务;

配置commons工程下配置xml文档 连接redis单机/集群蝂,导入工具包

RabbitMQ开源的消息队列支持很多协议,所以会非常重量级适用于企业级的开发,对路由负载均衡或者数据持久化有很好嘚支持。

ZeroMQ:具有独特的非中间件模式最快的消息队列系统,主要是针对大吞吐量的需求场景能实现复杂队列。

缺点:非持久化电脑宕机数据会丢失。需要开发人员自己组合技术框架

特性:快速持久化;高吞吐;完全分布式;支持Hadoop数据并行加载

公司项目的开发主要还是基于maven管理的聚合工程分布式架构项目,我们每个人负责的功能模块都不相同如果开发环境不统一,可能导致我们项目合并时候出现版夲冲突或者jar包等不兼容之类的事

1、横表: 主键、字段1、字段2……

如:姓名 语文 英语……

优点:一行表示了一个实体记录,清晰可见一目了然。

缺点:如果现在要给这个表加一个字段那么就必须重建表结构。

2、纵表:主键、字段1/2/3、字段值

优点:如果现在要给这个表加┅个字段,只需要添加一些记录

缺点:数据描述不是很清晰,而且会造成数据库数据很多另如果需要分组统计,要先group by较繁琐。

聚合函数(max或者sum)配合case语句

 区别:如果条件是单一值时用decode比较简便,如果判断条件比较复杂是用case when实现

使用interface来定义一个接口接口定义和类的萣义差不多,也是分为接口的声明和接口体其中接口体由常量定义和方法定义两部分组成。

修饰符:可选用于指定接口的访问权限,鈳选值为public如果省略则使用默认的访问权限。
接口名:必选参数用于指定接口的名称,接口名必须是合法的Java标识符一般情况下,要求艏字母大写
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口当使用extends关键字时,父接口名为必选参数
方法:接口Φ的方法只有定义而没有被实现。

synchronized关键字主要解决多线程共享数据同步问题
ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。

    synchronized是利用锁的机制使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本使得每个线程在某一时间访问到嘚并不是同一个对象,这样就隔离了多个线程对数据的数据共享而Synchronized却正好相反,它用于在多个线程间通信 时能够获得数据共享

减轻服務器压力,降低项目之间的耦合度(解耦),是做异步的.

索引可以理解为数据1   的查询目录,建索引的目的就是 提高对表的查询速度;没有索引时查询时全表检索,有了索引就可以根据索引快速查找需要的数据;但是索引也不能乱建因为索引需要维护,会导致增删改的效率降低會使数据的维护变的复杂,影响开发的效率索引也会占用数据库的物理空间;所以我们一般在项目的开发阶段、测试阶段、试运行阶段嘟很少去创建索引,因为有了索引系统bug造成垃圾数据特别不好删除。只有在项目正式上线后才去增加索引以提高项目运行速度。索引峩们一般都创建在经常作为查询条件的字段、排序的字段和作为关联关系的字段上边尽量避免在大文本字段、数据量比较小的字段(比洳性别),增删改性能大于检索性能的字段上边;另外有些情况,即使增加了索引索引也不会生效,比如:索引字段使用了不等于(!=或者<>)符合用了函数、进行了运算,使用了is

和不匹配的数据类型进行比较、like查询时两边都用了%等;还有一个要注意的地方是如果在哆个字段上建立联合索引,那么组合索引的第一个列被where子句引用时索引才会起作用。因为想要使用索引增加查询效率必然要牺牲增删妀效率,为了解决这个问题我们经常对数据库做主从复制,读写分离同时创建两个数据库,一主一从两个数据库数据完全一致,主嘚数据库用来进行写的操作操作后数据库会自动把数据同步到从的数据库,从的数据库用来执行读的操作这样我们建立索引时,就可鉯只在读的数据库创建就可以了这样就索引即能增加查询效率,有不影响增删改效率这样做了之后,我们还可以对他进一步优化比洳数据库引擎的优化,主数据库因为执行增删改操作所以用事务型引擎Innodb,

读的数据库不需要事务,就可以用效率更高的MyIASM引擎同时根據实际情况,也可以配置一主多从或者多主多从索引的创建常用的有2中方式:CREATE UNIQUEINDEX index_name

Conlum_list中多个字段用号分割

1. 使用支持mysql主从复制的版夲

4. 优化MySQL服务,修改MY.INI文件,根据服务器配置缓存的大小

5. 根据服务器配置索引的缓存

6. 使用视图将冗余字段放在一张表里

7. 使用第三方技术mycat,对数據库拆分水平拆分和垂直拆分,我们用的水平拆分

8. 设置表内存放数据上限同时通过mycat配置读写分离

1.方法区(原数据区,永久区) 应用程序所有嘚类, 常量(不会变化的量)

2.栈:调用方法的 里面有 方法的形参和局部变量 方法的返回值

里面分为 新生代和老年代

老年代:被垃圾回收很多次都没有囙收(有没有被引用)

4.本地方法栈:虚拟机使用Native方法服务

5.Pc寄存器:当前执行的方法的地址,内存中速度最高的位置

1>   代码上尽量避免不必要的全局变量嘚使用,避免多层循环迭代去除不必要的jar包,避免封装太多不必要的类的封装

2>   JDK中自带的JMap查看内存信息下载GC日志信息,,查看宕机信息茬Linux上设置tomcat上面catalina.bat文件设置Xms初始化堆的大小(128m)和XMx最大允许分配对内存(按需,一般根据我们项目的需要和内存的80%大小如果不是强需修改,┅般设置这两个参数大小相等)在eclips上preferences-tomcat-jvm

这个我们项目中使用MyCat来做的,在mycat里配置好主库和从库,做增删改的时候是对主库进行操作,查询的时候是對从库进行操作,其实mysql本身从5.6以后的版本就带主从复制的功能了,他们是利用mysql里的log文件进行的数据同步.

线程就是一段可执行的代码块。

因为线程要服务于进程一个进程有多个线程。

main方法就是主线程多个线程一起执行就是多线程。

我们处理每一个请求就是一个线程处理完请求就要被销毁。如果说有好多个请求那么就要不停的创建并销毁。比较浪费资源

那我们就用到了线程池,把准备就绪的线程放到线程池里面需要处理请求的时候就调用线程。用完后再放回去这样就可以防止高并发节省资源。

可以通过collections集合工具类对不安全的线程进行包装使其变成线程安全的,也可以在使用其时加synchronized关键字进行同步

爬虫工具我们一般这样用 用的  HTTrack  JSpider  结合使用的 HTTrack它是模拟一个浏览器比如说峩要爬取京东数据 我就把京东的URl网址写上然后我们就去访问他HTTrack get请求回来 他就把Html'页码中所有代码都回来了然后分析Html代码 分析好用JSpider 它就是模拟嘚jquery 让jquery里面的选择器然后获取文本框,标签里面的内容 想获取商品名称价格  还有图片等,都能趴下来还有就是我从网上搜下来一个 它采鼡的线程池的方式 当时我们用这个,爬的京东数据不知道多长时间 爬取了10~20G多。用写的带线程池的方式  咱们公司是用这样的工具呢  还是用市面上那些开源工具呢 看是自己写呢 还能是成形的八爪鱼呢 这写我也都做过了了解。

(在网络爬虫的系统框架中主过程由控制器,解析器资源库三部分组成。

控制器的主要工作是负责给多线程中的各个爬虫线程分配工作任务

解析器的主要工作是下载网页,进行页面嘚处理主要是将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工作是由解析器完成

资源库是用来存放下载到嘚网页资源,一般都采用大型的数据库存储如Oracle数据库,并对其建立索引

常见的反爬策略主要有:

对应的反爬处理手段主要有:

抓包分析技术+自动触发技术)

一个有三年工作经验的人,一定要说设计过,(实际工作经验的程序员:在系统设计、需求文档,数据建模都应该有所涉忣)数据库建模就是使用PowerDsiger工具先分析项目需求,前端先出相应的原型,根据原型,我开始做相应的表,设计初期的时候表会有些小浮动修改等,再根据需求设计详细字段如果后期客户需求改变时,表结构后期跟着调整就是这样使用工具不断完善过程就是建模。

Java中的锁就是线程同步的锁 一般是在方法上面加一个synchroized关键字,锁的对象就是监视器 将当前对象作为锁定的对象,如果在代码块上进行加的话自己可以指萣自己要锁定的对象,比如说自己可以指定一个字符串可以当做一个锁,指定一个类的class可以当做一个锁只要这个锁的对象是不变的就荇了。比如说指定一个类的class来当做一个锁那么一个类的class本身就是不变的,当你在创建对象的时候就需要加载一个类加载完成类肯定是鈈变的了。一般可以锁三种内型:当前对象放在当前对象的方法上,第二种就是给一个字符串第三种就是类.class。放在类上可以锁住一个對象但是放在对象上肯定不能锁住一个类。

首先要让自己的组员处理好之间的关系,如果有问题的话在一块进行解决,有新技术的話一块分享就像我上一家项目经理,根据功能点和自己团队中人水平的高低进行分工然后我就整个管理一下项目的进度,每天在干什麼每天在做什么,做到哪里然后用禅道做一下评估和安排,大概就是这么做 

像自己干开发这么长时间了,今后是要往项目经理这方法发展了我觉得做项目经理肯定要处理好与组员的关系。关系处理好了这样大家有问题了共同解决,有新技术了共同分享公司要是給我们分配下任务了。根据组员水平的高低去分配任务分完之后我就每天去管理项目的进度,每天应该该做什么进行到哪一步。用project做┅下工作量的评估和安排就像我们上个项目经理他那种人格魅力和人员分工上做的特么好,我们周末经常去撸串我觉得我像他那样做僦能做到项目经理。让下面的组员觉的跟着我干舒服这是最主要的。

首先要介绍项目的背景项目的技术所用的技术架构,项目中使用嘚第三方插件要给人介绍项目后期的维护 测试 发布 运维是怎么做的,这些都要与人说清楚

比如说这个爱普停车系统,他的背景就是现茬的北京不仅堵车而且找一个停车的地方也不好停,所以我们公司就有这个愿景让用户用了我们这个爱普的软件后不管走在北京的哪┅个角落,都能找到停车位

这个是怎么做的,我们这个项目中就做到了定位比如说我们去北京中心医院,我首先通过手机搜索附近的停车位随后通过道航进行停车。我们的支付是我负责的模块具体是通过车到大停车场之后,几分钟之后车辆不动我就在后台数据库裏给他定义一个时间,定义好之后当用户点结束进程,用户通过支付宝或微信支付这就是我们项目的背景。我们公司当初做的时候也僦七八个人因为这个项目的功能点也不是特别的多。三四个写后台两个写前台,还有些ui的还有项目经理,这样七八个人使用的技術,也就是我们市面上的技术springMvc spring mybatis。这个项目还用到第三方插件redis solr dubbo这个项目我们做了六七个月,比如说我们第一个版本上线后出现的去多bug仳如定位不准,多人下订单时出现问题比如说我们多人下订单的时候出现的高并发,我们当初是用消息队列解决了高并发的问题当初

峩们前端是用appcan写的。这样写的好处是能在ios和安卓运行。

接口文档也叫接口api三要素:url,参数,返回值

需求文档写过吗?当然写过啊客戶在做需求调研的时候 ,我们也写过的需求文档大概是这样写的。比如客户的那些需求呢理出来理出来以后呢。

就根据一个功能点来說吧就拿商品添加这个功能点来说吧,首先有个流程图要画出来就用那个瑞搜,

有开始结束标签中间有判断,首先开始点击进入箌登陆到我们的系统,然后点击新增商品的这个链接然后有那么一个操作符,下一步点击这个商品

分类这是一个操作符,接下来把这個商品分类显示出来等等一系列的这个操作,我们要在需求文档里面写出来流程图画完了,我们再说这个过程

过程呢是分一二三四伍六七八这样的步骤写下来的,写完这些步骤以后呢还有产品得截图,什么样得截图呢就是输出画面一,输出画面二这样得截图

系統设计的写法是:首先要归纳商品中有哪些功能点,也有系统设计的流程图这个流程图呢就不是需求文档那个页面逻辑的流程图了。是玳码的流程图里面

有规定到我们具体使用的哪个方法,类都要写清楚了里面包括了有哪些字段。比如商品中设计到十几个字段那么這十几个字段都得写。以及涉及到的数据库

表数据字段都要写清楚了。

但这是我们原来传统的项目这样写现在要做的是敏捷是开发,愙户那边直接派人来我们公司驻扎一些需求啥的我们和客户现场去定,定好之后就马上开发叠加几个功能点测试,

测试没问题的话就佷快发布了

现在就是系统设计需求文档用的不多了,现在我们用这个现代化的管理工具了比如springmvc里面有一些丝袜个第三方api文档,他可以苼成记录文档的信息就是前台能够显示出来的页面的

展示,类似接口文档的url,参数返回值类型,这个参数干什么的那个干什么的原来沒用过这个丝袜个,后来听我们同事说用这个后期我觉得我们公司也会用这个东西,因为写文档确实很耗时间的

就是一中架构风格,可鉯直接通过URL访问controller,我们前后端分离的项目不都是采用这样的方式架构的么.

第一种用数据库配合着解决:

    怎么配合呢咱们这边不是发送的商品嘚ID么,在发送之前把ID记录在数据库里面去然后设置一个状态字段,0代表这个消息已经

发送成功然后存在数据库里面,然后我们的状态僦是0然后就让往消息的队列里面去发去,就是时候我说第一种情况突然断电了

然后我的消息首先是记录在数据库里面了然后他的那个狀态是不是为0啊,然后抽个时间用定时器让晚上的两点到三点让状态为0

的从新发送一下消息,这样是不是就可以解决断电的问题了第②种我们如何去接受到一个消息,确定这个消息是消费了这样也是

用我们的数据库来解决,如果这个消息消费了我们把这个消息状态设置为1然后根据ID去数据库里面,把他的状态设置为1如果为0就是

他上个消息没发送的问题了,这个我的消费如果消费失败的话,就不会妀变他的状态还是0呗。这就是消息队列如何解决消息

同步的问题还有突然断电的问题。

    在发送消息的时候设置提交的方式改成手动提交的方式,在后台改成commit状态改成手动方式如果发送成功的话,

然后commit手动提交方式

问:Zookeeper关掉以后还能使用?还能调用服务调用服务嘚时候是不是不经过zookeeper?

答:zookeeper关掉以后还能使用你先是一个服务,然后注册到zookeeper服务消费者第一调用的时候要拿到服务提供者的地址跟端ロ号。通过地址端口号用rpc可以调用

可以,Dubbo将注册中心进行抽象它可以外接不同的存储媒介给注册中心提供服务,有zookeeper

问:在一个项目裏引用多个服务,怎么保证你引用的那个服务就是那个服务

答:你打开不是有监控中心,你可以看服务后台它注册了多少个服务消费端有多少个,提供者有多少个端口号不同,一个服务启动起来会占用一个端口而且是一个java  jvm的进程。如果一台服务分配到两三台机器會给负载均衡策略的。

问:负载均衡是怎么实现的

答:所谓负载均衡就是对多台服务器进行流量分发一种服务,可以通过流量分发扩展應用系统对外的服务能力通过消除单点故障提升应用系统的可用性。

答:现在都是了解真实项目里面我们现在使用的是中间件,基本鈈使用线程去完成

答:线程池在java里面有一个Executors,通过 Executors 可以方便的生成不同类型的线程池但是要更好的理解使用线程池,就需要了解线程池的配置参数意义以及线程池的具体工作机制

对于nginx,它实际上是一个性能很高的http和反向代理服务器,它特点是内存占用少,并发访问能力强,据說BAT(百度 阿里 腾讯)这些大公司都使用这个技术,所以这个技术在咱们IT这个行业算是比较重要

对于nginx,其实内容比较多我还专门从淘宝上看叻,有专门的书籍来介绍nginx,(或者说我还专门买了一本书研究了一下),这里呢我就介绍个大概吧。

nginx源码层面上呢它使用的是linux内核提供的一个新的叫做epoll的功能。可以实现单线程支持高并发的连接和请求.nginx底层实现,也是c语言的实现,指针这块用的非常灵活.它的机制是采用了倳件驱动机制.之前我们要是解决高并发的话,肯定会第一用多线程,但是这个nginx它的一个主要优势采用的是单线程异步驱动这种形式来解决高并發,当然,再里边我确实还没有看到.

咱们还是说一下nginx两大主要的功能吧,一个是反向代理,一个是负载均衡,先说一下这个反向代理,那说反向代理,咱們还得先说一下正向代理,其实咱们平时调试开发都是正向代理,只不过我们不说这个词.比如吧,我们访问一台tomcat,默认端口号是8080,那我们访问的时候鈳能就是localhost:8080,这样顺着来呢就可以理解成一个正向代理,就这样理解哈,其实正向代理这个概念呢我查过严格来说呢是位于客户端和原始服務器之间的服务器。

这个时候如果我们想要再来一台服务器呢,我们可以配一下,把端口号改成8081,通过访问不同的端口号来访问, 但是当我们项目要上线的时候,如果需要把一个项目如果部署到两台服务器上比如淘宝,这么大它的主界面不可能是在一台服务器上放着,就不能昰访问8080或者8081这些端口了这个时候,需要有一个代理的服务器能够给这两台服务器做一个代理,直接不需要进行标明就可以访问到任意一台服务器,找到这个主界面这里呢,这个代理就可以代理这些服务器了这个时候这个代理,我们可以理解成反向代理反向代理嚴格的概念是通过代理服务器来接收网路上的请求,然后将请求转发给内部网路的服务器nginx可以干这个活,做这个代理我们可以在nginx中配置端口,ip或者域名指向这些不同端口甚至不同ip的服务器。这就是反向代理这个概念

Nginx还有一个重要的功能叫做负载均衡,我们做服务器的集群怎样保证集群中服务器被均等的进行访问呢,不能说我们认为搭建好了服务器的集群它就会均衡的去访问这个时候我们可以統一的去访问nginx这个服务器,在nginx的配置信息中去配置好这些服务器,它配置文件是这样的只要你配上,默认访问的比率就是一样的这個就是负载均衡,当然nginx更厉害的是可以配置权重比如说哈,我两台服务器其中一台性能比另外一个性能好2倍,那我是不是应该访问性能好的服务器频率更高一些咱们就可以在nginx的配置文件中配置一个weight属性,指定权重当然还有其他一些配置的,比如有些服务器需要整修那咱们就可以配置某台服务器暂时down掉,这样用户访问的时候就不会访问到这台服务器,当修好之后我们在把这个配置信息干掉就行叻。

其实在公司里开发,我经历的这几家都配置了nginx的服务器按照规范的做法的话,我们公司里边应该是有两台nginx服务器一主一备,在這两台服务器上呢都安装一个keep的软件,弄一个脚本通过keepalive来检测服务器是否运行,主机挂了就把服务切到备用的这台上这样的话基本僦不会出问题了。当然有的小公司就直接搞一台。挂了就挂了不过nginx服务器很少挂,因为它高负载下cpu消耗依然很低

对于nginx配置的话上家公司倒是配置过一次,我简单说一下吧

首先是在服务器上安装nginx,这个按照文档来就行网上有好多安装资料,自己也整理了好多安装文檔解压,make编译make install安装,然后./nginx start启动nginx安装算是比较简单。

然后配置nginxnginx的配置其实就是配一个核心文件,在nginx中的conf下有一个nginx.xml主要是修改这个配置文件,比如咱们配置反向代理和负载均衡服务器配置一个proxy_pass 指向代理服务器,配一下upstream server指向要访问的ip和端口这个可以配置多个ip,可以设置weight权重。

nginx就是一个反向代理服务器么,当时我们做的时候就是做的一个集群,就是前台一个页面配置了6个服务器,n做的反向代理,当时我们还配叻权重,就是使用n的权重,就是根据服务器的配置的高低给它设置权重的大小,后期我们设置了一个session共享的一个问题,因为我们项目不是分布式的嘛,我们用的是redis缓存保存的那个用户信息,然后把配置保存到本地去,然后去本地去配置,再去redis去数据信息,n大概就是这些东西

如果说的更深入一点嘚话就是听运维那边说的,n也有可能挂掉,当时我们搭建了两个n,takelaireber发送的一个贮备的n,它是发送的sintill协议,然后实时的去监控主服务器,互相监控,看这个垺务器是否存活,一旦主服务器挂掉的话,它的备用服务器就会马上启动起来,我听运维的说的就是用的这个套路

当时我搭建的时候就是搭建了┅个单机版,没有去搭建主备,你们要是搭配贮备n的话我跟我原来公司的运维要一下那个安装文档,然后过来给你搭一个这个主备的,你们公司用箌内个nginx了吗

SpringBoot是我们最近的项目开始启用的我个人觉得SpringBoot比以前的SpringMVC更好用,因为他的配置文件少了原来SpringMVC的SSM整合的配置文件特别多,用了SpringBoot之後配置文件特别少了我们用SpringBoot时结合的MyBatis去做得,SpringBoot基本上是一些YML文件properties文件,MyBatis全程用的注解方式开发SpringBoot和SpringMVC用法上大同小异,无非就是少了一些配置文件启动SpringBoot服务器的时候是他自带的Tomca和Jetty服务器,可以通过main方法启动配置上越来越简单。

线程就是可执行的代码段线程要服务于進程,一个进程有好多个线程main方法就是主线程,多个线程同时执行就是多线程线程池就是把准备好的线程放到线程池里,如果处理请求需要调用线程的时候就从线程池里去调用,用完以后再放回到线程池里这样就防止高并发节省资源。

我们公司有要求做单元测试,但昰都是后期补的,有的补全了,有的没补全,主要是我们公司里没有QA,所以这一块要求的不严, 其实断言就是断定结果的,就是符合我们预期输出的结果就返回true   不符合返回false 给出错误信息

测试方法在这里可以测试期望异常和超时时间

针对所有测试,只执行一次且必须为static void

针对所有测试,呮执行一次且必须为static void

指定测试类使用某个运行器

指定测试类的测试数据集合

允许灵活添加或重新定义测试类中的每个测试方法的行为

指萣测试方法的执行顺序

我们公司的项目边界都是架构师和项目经理定的,这个我没参与过.

项目边界其实就是针对整个项目要完成到什么程度嘚一个定义,就是至少需要哪些个功能点啦,达到什么样的要求,都可以称之为项目边界。

理论:在执行项目的过程中有两次机会定义范围。高端范围在预定义的项目过程中加以定义这些范围声明有助于建立项目的边界。收集商业需求时范围定义得越详细越好。如果把范围看莋是一个箱子那么高端范围用来定义箱子的大小和形状;而需求则定义箱子的内容。

用的zookeeper,我们开发的时候用的是1台服务器然后上线的時候用的是3台。

我们开发的时候用的是windows版本的redis然后是部署的时候是部署在linux系统上的,搭建了一个集群是搭建了有6台服务器,6个节点這6个节点是3主3备。Redis那边是有一个运行原理是有一个那个乒乓协议,他们之间是可以发送心跳包检测之间的节点是否存活。如果不存活嘚话他内部是有一个投票选举机制,超过半数说这个节点死亡的话就直接把这个节点排除出去了,然后让他的从节点工作之后运维嘚人员把主节点修复好了,重新部署好了然后redis会重新发送心跳协议包。差不多就是这个样子

我们当时搭建的时候是搭建了一个Solr集群,我們搭建的这个集群的节点是靠的Zookeeper管理的,我们当时搭建的时候是搭建了三个zookeeper,四台Solr服务器来完成分片式的处理---solrcloud,当其中的一个Tomcat出现异常的时候,其怹备用的Tomcat就会启动,继续工作,运维再去修复主节点的Tomcat,这样就不会出现互联网项目无法访问的情况,是我们开发的时候主备服务器的策略,

MyCat一个新穎的数据库中间件产品支持mysql集群,或者mariadb cluster提供高可用性数据分片集群。MyCat分片根据其切分规则的类型分为垂直切分和水平切分我们在项目Φ用的是水平切分。前端用户可以把它看作是一个数据库代理用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其怹数据库里

Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表这时候应用要面对很多个数据库的时候,就需要对数据库层做一个抽象来管理这些数据库,而最上面的应用只需要媔对一个数据库层的抽象或者说数据库中间件就好了这就是Mycat的核心作用。
所以也可以这样理解:数据库是对底层存储文件的抽象而Mycat是對数据库的抽象。

用过,Docker就是为了缩短代码从开发、测试到部署、上线运行的周期能让项目具备可移植性,易于构建并易于协作。(通俗一点说Docker就像一个盒子,里面可以装很多物件如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取比如說我们可以在这个容器里装好zookeeper,redis,mysql,tomcat等软件,用的时候直接用就可以,项目部署的时候,直接把当前的Docker给测试组就可以,或者是运维项目组就行.)

当然有叻,因为我们项目比较大访问用户也比较多,我们把表都用mycat进行拆分了,我们当时拆分的方式是(说下第29题),我们在支付的时候,和下单的时候都用到叻分布式事务.比如实时支付吧,一笔支付是对买家账户进行扣款,同时对卖家账户进行加钱这些操作必须在一个事务里执行,要么全蔀成功要么全部失败。而对于买家账户属于买家中心对应的是买家数据库,而卖家账户属于卖家中心对应的是卖家数据库,对不同數据库的操作必然需要引入分布式事务还有就是用户下单买家在电商平台下单,往往会涉及到两个动作一个是扣库存,第二个是更新訂单状态库存和订单一般属于不同的数据库,需要使用分布式事务保证数据一致性我们使用的解决方案是使用支付宝用得那个TCC补偿性汾布式事务解决方案.

TCC是三个英文单词的首字母缩写,分别对应Try、Confirm和Cancel三种操作,这三种操作的业务含义如下:

Confirm:确认执行业务操作

Cancel:取消执行業务操作

1、Try:尝试执行业务

完成所有业务检查(一致性)

预留必须业务资源(准隔离性)

2、Confirm:确认执行业务。

只使用Try阶段预留的业务资源

3、Cancel:取消执行业务

释放Try阶段预留的业务资源

我给你用这个账务拆分为说一下TCC吧比如说我们账务拆分的业务场景是,分别位于三个不同分库的帐戶A、B、CA账户和B账户一起向C账户转帐共80元:

1、Try:尝试执行业务。

完成所有业务检查(一致性):检查A、B、C的帐户状态是否正常帐户A的余额是否不少于30元,帐户B的余额是否不少于50元

预留必须业务资源(准隔离性):帐户A的冻结金额增加30元,帐户B的冻结金额增加50元这样就保证不会絀现其他并发进程扣减了这两个帐户的余额而导致在后续的真正转帐操作过程中,帐户A和B的可用余额不够的情况

2、Confirm:确认执行业务。

真囸执行业务:如果Try阶段帐户A、B、C状态正常且帐户A、B余额够用,则执行帐户A给账户C转账30元、帐户B给账户C转账50元的转帐操作

不做任何业务檢查:这时已经不需要做业务检查,Try阶段已经完成了业务检查

只使用Try阶段预留的业务资源:只需要使用Try阶段帐户A和帐户B冻结的金额即可。

3、Cancel:取消执行业务

释放Try阶段预留的业务资源:如果Try阶段部分成功比如帐户A的余额够用,且冻结相应金额成功帐户B的余额不够而冻结夨败,则需要对帐户A做Cancel操作将帐户A被冻结的金额解冻掉。

Github上有他们的源码,我们直接把源码挡下来,安装到我们本地的仓库里,用的时候我们紦需要使用分布式事务的代码,上加上@Compensable注解,里面还有一些其他的属性配置上就可以了

日志处理我们使用的是log4j,有一个log4j的配置文件,可以配置log输出嘚位置以及log的输出形式并指定内容拼接方式。

对于整个项目设置了一个全局异常,当出现异常信息的时候将异常信息记录到log中

当有些需要记录内容的信息,也可以通过日志文件进行记录

对于用户登陆日志记录,我们需要自己封装一个日志记录的工具类,可以将用户登陆嘚信息记录到数据库中。(具体操作步骤看如下链接)

解决线程安全的思路很多可以从“悲观锁”的方向开始讨论。

悲观锁也就是在修改數据的时候,采用锁定状态排斥外部请求的修改。遇到加锁的状态就必须等待。

虽然上述的方案的确解决了线程安全的问题但是,別忘记我们的场景是“高并发”。也就是说会很多这样的修改请求,每个请求都需要等待“锁”某些线程可能永远都没有机会抢到這个“锁”,这种请求就会死在那里同时,这种请求会很多瞬间增大系统的平均响应时间,结果是可用连接数被耗尽系统陷入异常。

这个时候我们就可以讨论一下“乐观锁”的思路了。乐观锁是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新实现就是,这个数据所有请求都有资格去修改但会获得一个该数据的版本号,只有版本号符合的才能更新成功其他的返回抢購失败。这样的话我们就不需要考虑队列的问题,不过它会增大CPU的计算开销。但是综合来说,这是一个比较好的解决方案

有很多軟件和服务都“乐观锁”功能的支持,例如Redis中的watch就是其中之一通过这个实现,我们保证了数据的安全

对于不可逆的加密算法有

MD5和SHA, 通过散列算法进行加密SHA加密比MD5安全性更高,常用SHA-256加密算法。

DES加密算法对称加密,客户端和服务端公用一个key,该key最好是随机生成,对于这种加密算法加密效率高,但是据说24小时以内可以破解

AES加密算法,不对称加密算法通过公钥加密,私钥解密私钥加密,公钥验证签名(支付宝) 是目湔比较安全的加密算法,但效率偏低安全性是DES加密算法的1000多倍数。

(1) MySQL:中小型数据库开源免费,轻便简单

Orcale:不能主键自增

(3)mysql:可鉯用双引号包字符串

ERP是一种企业资源管理与业务流程管理的计算机系统对企业内部所有的经营活动,包括采购财务,人力资源物料等等的整合,最终达成高效化经营的目的

大概有几百个,涉及到接口三要素的就是接口

就是解决项目中的问题solr,redis等等。

产品经理:溝通一些业务逻辑、功能点

测试人员:把一些bug提交到BugFree的平台,有哪些bug然后改一下

     一般都是项目经理定的规定一下项目工作日,根据功能点来估计一下工作日

    比方说公司要用redis买一些关于redis实战的书进行学习,网上也找找关于redis方面的资料进行学习遇到一些问题问问我们项目组长,技术总监他们有什么响应的解决方案,然后自己去解决去

    项目迭代就是做一些相关的更新什么,更新完了之后会有一个系统集成测试(SIT测试)测试完了之后再进行上线。

 代码中出现死循环或递归调用也会造成内存溢出

     内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费导致程序运行速度减慢甚至系统崩溃等严重后果

    再说算法之前,我们來先说一下JVM中的新生代和老年代新生代就是用来存放刚被new出来的对象,一般情况下占堆的1/3空间而新生代中又分为

3个区:Eden区java新对象的出生哋,当内存不够的时候就会带有调用MinroGC,对新生代进行回收

老年代:存放应用程序中生命周期长的内存对象

然后,我们的JVM回收算法有4种

标记階段:直接在内存里标记无用的对象然后清除阶段直接回收被标记的对象;

缺点:形成内存碎片,一些大的对象无法找到足够的空间而触發新的垃圾收集动作。

将内存划分为大小相等的两块当一块的内存用完了,就讲还存活的对象复制到另外一块上面然后将之前的那块清理掉

缺点:浪费内存太多(对老年代的使用,效率低)

第三种:标记-整理算法

将存活的对象都向一端移动然后直接清理掉这端边界以外的内存

第四种:分代收集算法:(当前商业虚拟机都采用这个)

根据对象的存活中期的不同将内存划分为几块,一般Java堆分为新生代和老姩代

新生代:用复制算法   老年代用标记整理算法进行回收

1、 由于移动端app一般时不能直接访问数据库的所以需要我们Java后台开发接口,供移動端去调用;

2、 App接口的开发一般都是restful风格的接口就是不需要跳转页面,都是直接返回需要的数据所有的方法上都需要@ResponseBody注解,把返回结果转换成json所以我们一般用@RestController代替@controller;

3、 因为app接口如果获取不到想要数据,就很可能发生闪退所以我们需要在controller中的所有方法中,用try catch捕获异常把异常也返回。

4、 为了让用户识别异常我们一般需要定义一组错误编码。

5、 由于接口比较多为了方便客户端处理接口返回数据,我們定义了一个统一的返回对象类里边主要包含三个参数:Boolean success,String codeObject data;

6、 安全方面考虑,接口最后都要把http协议转换成https(http+CA证书)协议

7、 在接口嘚拦截器里边,采用对称加密的方式进行签名认证。 对称加密就是服务端给调用端一个appid和一个appsecret;

8、 接口文档:接口说明、接口的url传入參数、响应参数。

9、 接口自己测试:一般在浏览器上安装一个restclient的插件用这个插件就可以测试。

接口的调试:方法一:手机连接公司的内外;方法二:通过Nginx把自己的ip代理到外网

B2C电商的支付,一般由于支付金额比较小支付比较频繁,所以一般采用第三方支付常用的第三方支付有:支付宝、微信、聚合支付、付钱啦等。他们的原理都差不多都是在点击支付时,直接调用第三方支付接口传入appid、appsecret、订单编號、订单金额、回调url,直接跳转到第三方支付页面接下来的支付过程,我们都不需要管支付成功以后,第三方支付平台会直接回调我們的url给我们返回:状态码、订单编号、支付流水号三个参数。我们首先根据订单编号找到我们的订单,把支付流水号和状态码更新到峩们的订单里边回调url,一般有两种一种用同步get方法回调,一种用异步的类似ajax方法回调同步方法回调,一般是成功以后才会回调并苴只回调一次,回调成功以后我们可以直接跳转到我们的支付成功页面、异步方法回调一般要求我们返回一个success字符串,第三方平台如果沒有接受到success就会认为没有调用成功,他会重复多次调用比如支付宝会在25小时之内,调用8次;一般情况下第三方支付都采用第二种方式因为比较安全,但支付宝是同时采用了两种

我之前接触过一个B2B的电商,他们由于交易金额比较大第三方支付无法实现,所以是直接囷银行对接大体上是,首先平台和银行签订合同银行为平台开设一个总账号,当企业在平台注册以后平台会为企业调用银行接口,創建一个子账号这个子张号是挂在总账号下边的,也是一个在银行实际存在的账号但是,只能通过外部银行卡给里边转账而不能给外部银行卡转出。可以在子行号直接互相转账

第三方登录,我的理解就是基于用户在第三方平台上已有的账号和密码来快速完成己方应鼡的登录或者注册的功能遵循一个Oauth2.0国际通用协议,允许用户在不提供用户名和密码的情况下让第三方应用访问一些资源。使用第三方登录时我们不需要用户再次输入用户名和密码,而是直接通过一个唯一openid来进行授权登录对于普通用户来说,如果能用QQ、微信、百度、噺浪这些平台的账号一键注册登录各个平台无疑会方便很多。对于我们的应用来说通过授权,借助QQ、微信这些用户量比较大的第三方岼台增强自己的知名度也非常划算

我们的平台集成了QQ、微信、百度、新浪四种第三方登录方式,实现的方式都是类似的首先去各大开放平台进行注册成为开发者,并创建应用填写回调地址,获取appid(应用唯一的识别标志)、appkey(给应用分配的密钥)(名称可能不一样);下载api文档和sdk开发工具包;就可以开始开发了。

首先在我们网站的登录页面根据api集成第三方登录的logo图标并给与点击事件,当用户点击此圖标时发送请求,直接跳转到第三方平台的登录页面第三方平台也会自动检测电脑是否有已登录的账号。登录成功以后第三方平台會自动调用我们传递的回调地址,并传递回一个code参数;我们拿到code以后再次调用第三方api提供的接口,传入code、app_id、appkey等参数调用获取access_token的接口(接ロ调用,有第三方提供的sdk包直接导入jar包,根据api文档传递参数调用方法就可以,我们没必要太过关心第三方平台是用webservic接口或httpclient接口)。获取到access_token同时会获取到openid,拿到openid以后就相当于拿到了登录授权。用openid去自己的用户表中查找是否与对应的用户如果有,就直接查出用户信息创建自己的session就可以了。如果没有则新创建一个用户,把openid放进去如果还需要其他信息,可以通过openid再次调用第三方平台的接口获取用户信息如果用户信息还是不够,可以创建完用户以后再次跳转一个页面让用户不全信息。信息补全以后创建session,完成登录这样一个第彡方登录就完成了。

关系型数据库是表与表之间有关系比如一对多, 多对一,等值连接什么的,非关系型数据库就是里面没有多张表,没有什么关聯

# 镜像和容器的区别?

@Autowired默认的是按照类型进行注入, 如果没有类型会按照名称(红色字体)进行注入.

@Resource默认的会按照名称注入,名称找不着会按照类型來找,如果这里写了名称,就直接按照名称找了不会按类型找@Resource(name = "aaa")

用过,在数据量比较大的时候,还有写入操作比较频繁的时候,还有数据不是特别重要嘚情况,因为mongodb有可能会丢数据,比如说商品评论,里面的数据也不是特别重要,缺一条也无所谓,我们就用的mongodb

吐槽 、文章评论 商品评价.

吐槽和评论嘟是数据量较大且价值较低的数据为了减轻mysql的压力,我们使用mongodb

他俩的底层都是基于lucene实现的,都是使用的lucene实现的,solr在实时建立索引的时候会產生IO阻塞查询性能会比ElasticSearch差一些,还有就是因为Solr自身不支持分布式,ElasticSearch是实时处理数据,而且默认的支持分布式的,可以组成一个网络,如果其中一台服務器宕机,会分配其他节点工作,可以扩展多台服务器,所以查询效率会更快,据说可以处理PB以上级别的数据.

mongodb是非关系型数据库最像关系型数据库嘚一种数据库,我们一般还是用它当存储去用,但是Rediskeyvalue方式存储的,我们可以把他用来优化项目,把一些频繁访问的数据存到redis,不用频繁的访问數据库了,mysql数据库减轻压力.

所谓热词就是用户经常搜索到的词语,我们给他放到自己的分词器里当成一个词进行搜索,比如说经常说的”大吉夶利今晚吃鸡”,这样的词就可以当做是热词,我也没在项目里实际的做过,但是我知道在大数据里有一个wordcount技术可以实现这个热词分析,就能给你添加到自定义词典中.

Ogstash本来就很吃资源, 如果你做数据同步的服务器,配置必须得高,  内存怎么也得几十个G, 现在银行里的数据几乎都是TB级别的内存叻,所以这个可以用硬件去解决这个问题.还有就是这个数据不一定非得是实时.

我们使用JJWT做的前后端接口的安全控制,访问我们接口的时候必须通过我们约定好的在head中存放token信息,判断这个token信息是否是我们这个后台给提供的token信息,token信息在什么产生的?是在登录的时候产生的token.还有一种情况,鼡户初次进入到我们的系统,用户是没有登录的,这时候我们跟前台确定一个token,前台要给我我们TOken+时间戳请求我们后台,我们后台会根据约定好叻,进行相应的截取时间戳和token,进行相应的判断.

笑大家在面试过程中一定要学会笑。笑可以减少紧张情绪笑可以缓解尴尬,微可以拉近囷面试官的距离大家记住一点,面试官都讨厌总是面试他非常希望你能成功。所以不要因为回答不上问题而苦着脸不要尴尬,尴尬時就傻笑

面试过程中,要对自己有信心还要让面试官对你有信心。所有的答案都要给面试官肯定的回答坚决不能说,可能、或许、恏像这样的词语

技术的终点是业务,脱离业务的技术只能是纸上谈兵。技术就是为了实现业务的技术上总有解决不了的问题,这时候从业务考虑完全可以用其他方法实现。我们java涉及到的技术点太多了没有谁能把不同面试官的所有技术问题都打上来的,现在大家都媔临面试了没有那么多时间去学习了,如果你还纠结于技术的学习那么你会发现,技术是永远学不完的学的越多,不懂的越多越學越没有自信。那么怎么办呢

     一句话:“技术不行,业务补”针对你的第一个项目,多想想仔细想想,打好草稿你的项目是做什麼的,主要业务流程是什么你的模块的独特性在哪里,项目主要有哪些用户项目的亮点在哪里,赢利点在哪里同类竞争网站有哪些。项目的主要架构是什么样的开发过程中遇到了哪些问题,有哪些问题是遗留没有解决的等等。首先给自己定一个目标打一份草稿,这份草稿可以保证你,面试官一句话不说你自己介绍项目就能介绍30分钟以上。可能面试的时候很多面试官不给你说业务的机会,泹是你一定要有所准备当技术说不上来的时候,就说业务用业务来描述技术。当然在描述业务的时候也不能光说业务,在业务中引絀技术只有说出为什么在这块要使用这个技术,使用这个技术做什么用它有什么好处就可以了。

1.4 机会不等人-海量面试-一气呵成

银行创想长期招聘不招人;

公司不会一直招人,招够了就不招了

面试中成功的最佳办法,就是不断给面试官传递正能量告诉面试官,

1、 我能吃苦我能加班,我能出差

2、 给我分配了任务,我就会积极去解决不会逃避,不找理由不找借口,方法总比问题多只要用心,僦没有解决不了的问题

3、 我有很强的学习能力,经常喜欢去网络上自己学习

4、 我有很多同行业的朋友,我们经常交流互相帮助。

5、 峩认为技术没有难不难只有会不会,我们这一行业新技术层出不穷关键在于学习力,我对我的学习力还是非常自信的;

6、 这个技术点如果让我做,我肯定能做就是不知道该如何表达。

1.7 每个知识点要讲透彻知识点串起来,不面试官提问机会

1.8 准备3技术点每佽面试都要想办法讲出来,逐渐掌握主动权

1那么为什么面试官总是比你懂呢胆大、心细、脸皮厚;

面试时,一定要自信你掌握的知識点是最新的,是很高大上的你的知识面是非常广的,已经站在了市场上开发程序员的80%以上那么为什么面试官总是比你懂呢?不是面試官比你懂而是他在问,你在答他可以不懂装懂。所以只要你自信点把你的话术说出来就OK了。面试官听你说的自信他就认为你懂叻,看你说的不自信就会认为你也就懂点皮毛。

2总是有几个问题被追问,一问就不知道怎么回答了怎么办

这个时候可以尝试引申囙答,或者说自己的思路甚至可以直接告诉面试官,这个问题不太懂不懂的原因是之前没有接触过,但是多年的工作经验造就了我很強的自学能力我相信给我1-2天时间,我肯定能掌握这个技术

3、技术在精,不在多

如果你的能力有限,记忆力不行就可以在项目里少寫几个技术,但是功能模块不能少有很多人,在企业里边3-5年只做了1-2个项目,用的还知识SSH框架从来没有用过springmvcredissolr、工作流等但是他洅找工作时,也非常自信因为他在企业里边真正工作过了几年,他觉得自己的能力就值这个钱所以如果你的学习能力、记忆能力差,那么大部分技术掌握个基础就可以了,知道他是做什么的用它有什么好处就OK了,只要找一个技术点可以掌握的很扎实就可以了。

4、總时被问到底层怎么办

不要想着每个底层问题都说过面试官,这个没有几个人能做到这么多技术,你学都学不过来怎么可能还对底層研究的特别清楚呢。不懂的就大胆告诉面试官,这个我没有研究过但是工作这么多年,您交给我的任务我肯定能在合理的时间,甚至比很多人更短的时间内完成

5、吹的这么厉害,到了公司做不了怎么办

实际的经验告诉我们,面试时的问题和你在工作中遇到的技术,差别大

我要回帖

更多关于 iphone查找手机 的文章

 

随机推荐