面試總結 别人的 非原創
1、面試指導方針
在面試官問到技術的時候
是什麼?有什麼特點? what
為什麼用它? why
在項目的哪一個地方用過? 使用的具體步驟?使用過程中問題總結? how
2、面試自我介紹之大套路
3、排序算法?
冒泡排序:
每次拿兩個數進行比較,總是把小的放在最前面,大的放在最後面,第二次是第二個數和第三個數比較,如果第三個小于第二個,那麼第三個和第二個替換位置,一次這樣比較替換,第一輪循環完了呢,放在最後面的那個數就是這 一串數字中最大的數。第二輪循環和第一輪一樣,第一個和第二個比較,最小的放在最前面,依次類推。如果有10個數字,那麼就進行9次循環,最小的在最前面,最大的放在最後面。
好處呢,就是查詢速度快
二分查找:
二分查找就是從一串數字中找到某個數字。
原理就是必須有一串數字是從小到大排序,把這串數字進行劃分,分為三段,前半段,中止段,和中止後半段。查找數字或者字元先從中止段查找,查到的數字或者字元和中止正好相等,那麼久直接取出來,如果比它大就從後半段查找,後半段在進行二分法,進行遞歸的調用查找,如果比中止小,走前面的中止段,在進行拆分,進行二分查找法。
4、說一下你對Spring的了解?
關于Spring的話,我們平時做項目一直都在用,不管是使用ssh還是使用ssm,都可以整合。Spring裡面主要的就三點,也就是核心思想,DI,IOC,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更簡單,快速,友善。
(然後就可以扯微服務,和spring boot、cloud)。。。
5、mybatis緩存?
mybatis一級緩存是SqlSession級别的緩存,預設支援一級緩存,不需要在配置檔案去配置。
mybaits的二級緩存是mapper範圍級别,,除了在SqlMapConfig.xml設定二級緩存的總開關<settingname=\'cacheEnabled\'value=\'true\'/>
,還要在具體的mapper.xml中開啟二級緩存:
<mappernamespace=\'cn.hpu.mybatis.mapper.UserMapper\'>
<!-- 開啟本mappernamespace下的二級緩存 -->
<cache></cache>
useCache配置禁用二級緩存(預設情況是true,即該sql使用二級緩存。)
<selectid=\'findOrderListResultMap\' resultMap=\'ordersUserMap\' useCache=\'false\'>
mybatis重新整理緩存(就是清空緩存flushCache=\'true\' 屬性,預設情況下為true即重新整理緩存,如果改成false則不會重新整理)
<insertid=\'insertUser\' parameterType=\'cn.itcast.mybatis.po.User\' flushCache=\'true\'>
6、說一下Angularjs中常用的指令是什麼?
ng-model雙向綁定,ng-controller指定子產品 ng-app ng-click ng-if ng-init初始化 ng-rpeat
7、簡單介紹下分布式
分部式項目就是項目中的子產品,把每一個子產品拆分成為一個個的工程,這樣我們各個子產品之間的耦合度不就降低了嘛,然後我們各個子產品之間通過dubbo架構來互相通訊,我們公司用到的是一個第三方的插件dubbo來實作項目之間通信,這樣我們的代碼的拓展性不就更好了嘛,最後我們在部署項目的時候,可以根據使用者的通路量來給各個子產品的伺服器增大配置,我們還可以采用nginx負載均衡來實作一個反向代理,當使用者請求背景伺服器的時候,有nginx來決定哪台伺服器空閑或者壓力小,來讓使用者通路。我們這樣做的目的不都是為了防止高并發嘛
8、單例和工廠是如何實作的?
單例:其實單例本質的就是控制對象的産出,要想産生一個唯一的執行個體,你就要私有化構造方法,然後私有化一個的靜态的全局變量,并且提供一個公共的靜态的方法供外界通路,單例大概就是這樣的。
工廠:它是 java設計模式的一種,工廠模式的優勢還是很多的,我舉一個簡單的共廠的例子吧,就是假如我們有好多接口,好多的接口的實作類,我們如果使用工廠模式的話,當我們有需求需要改變接口的實作類的話,直接在工廠裡面改變傳回的類型就好。這樣會應對不同的需求變化。
9、MyBatis中# 和 $ 的差別?
這兩個符号一般是在使用Mybatis編寫底層SQL語句時使用,#就是一個占位符,具體的使用是#{id},而$是一個原樣輸出的辨別,是${value},我在項目裡一直是使用#,因為這樣可以防止Sql注入,安全性高。
10、Hashmap的底層實作原理
Hashmap底層是通過數組和連結聯合實作的,當我們建立hashmap時會先建立一個數組,當我們用put方法存資料時,先根據key的hashcode值計算出hash值,然後用這個哈希值确定在數組中的位置,再把value值放進去,如果這個位置本來沒放東西,就會直接放進去,如果之前就有,就會生成一個連結清單,把新放入的值放在頭部,當用get方法取值時,會先根據key的hashcode值計算出hash值,确定位置,再根據equals方法從該位置上的連結清單中取出該value值。
11、簡單說一下ssm 整合?
答:簡單的說 springMVC在ssm中整合 就是 在 web.xml 裡邊配置springMVC的核心控制器:DispatcherServlet; 它就是對指定字尾進行攔截;然後在springMVC.xml裡邊配置掃描器,可以掃描到帶@controller注解的這些類,現在用springMVC都是基與注解式開發, 像@service,@Repository @requestmapping,@responsebody 啦這些注解标簽 等等 都是開發時用的,每個注解标簽都有自己的作用;它還配置一個視圖解析器,主要就是對處理之後的跳轉進行統一配置 ,大緻就是這些
12、Mybatis 和 Hibernate 的差別
Hibernate一個是全封裝,mybatis是半封裝,使用hibernate做單表查詢操作的時候比較簡單(因為hibernate是針對對象進行操作的),但是多表查詢起來就比較繁瑣了,比如說5張表10張表做關聯查詢,就算是有SQLquery那後續的維護工作也比較麻煩,還有就是Hibernate在Sql優化上執行效率上會遠低于MyBatis(因為hibernate會把表中所有的字段查詢出來,比較消耗性能)我們以前在做傳統項目方面用過hibernate,但是現在基本上都在用mybatis.
13、為什麼要離職?
1.我們公司的項目準備南遷,而我個人不喜歡去南方發展,我也想換個工作環境.
2.我們公司轉型做别的了,老闆做微商了,開發這一塊就不需要了,是以就離職了
3.合同正好到期了,我也想換個環境了.
4.老闆轉行做實體經濟去了,做出口貿易了.
14、給我介紹一下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會幫忙進行負載處理。 |
15、說一下springaop的實作原理
答:它的底層是通過動态代理實作的面向切面程式設計,主要用在管理事物這一塊,我們在配置檔案裡配置切入點,比如以save/insert/update等開頭的方法我們開啟事物,配置了一個REQUIRED開頭的事物特性,還可以用在日志管理,還有權限方面也可以用aop來實作,但現在基本上沒有人去這樣控制權限,都用shiro架構來實作權限管理,springaop大概就是這樣,咱們公司是用什麼來管理事物的,應該使用注解的方式來管理的吧。
16、說一下什麼事務?代碼中事務是如何控制的?
在資料庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務復原,隻有全部正确才完成送出,多表操作的時候會用到事務,我們在項目中直接配置到spring裡就用啦,用的注解式的事務,比如說銀行轉賬,從A賬戶向B賬戶轉賬,必須得兩條SQL語句同時執行成功.
Java中的事務主要有兩種,JDBC事務(本地事物)和JTA(Java Transaction API)事務(分布式事物);事務有四大特性ACID原子性、一緻性、隔離性和持久性。架構中,我們一般把事物交給spring來管理。spring配置事務的方式一般有兩種,一個是聲明式事務,一個是注解式事務。注解事務,比較簡單靈活,在spring配置檔案中配置一個<tx:annotation-driven> 餓裡忒甚的注解,然後在需要的方法上加@Transactional注解就可以了。聲明式事務,切點一般是掃描service層實作類,通過方法名比對配置傳播特性,決定哪些方法上加事務,哪些不需要事物。事務主要有五大隔離級别和7種傳播特性;五大隔離級别由低到高:主要控制是否出現髒讀,不可重複讀和幻覺讀;7種傳播特性主要決定是建立事務,還是取目前事務;
- 髒讀:
指當一個事務正在通路資料,并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時,另外一個事務也通路這個資料,然後使用了這個資料。因為這個資料是還沒有送出的資料, 那麼另外一個事務讀到的這個資料是髒資料,依據髒資料所做的操作可能是不正确的。
- 不可重複讀:
指在一個事務内,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也通路該同一資料。那麼,在第一個事務中的兩次讀資料之間,由于第二個事務的修改,那麼第一個事務兩次讀到的資料可能是不一樣的。這樣就發生了在一個事務内兩次讀到的資料是不一樣的,是以稱為是不可重複讀。
- 幻覺讀:
指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者
事物主要是為了保證一次操作裡邊涉及到多次增删改時,保證他們可以同步送出或復原。他有四大特性ACID(原子性、一緻性、隔離性、持久性)
我們架構中一般都通過Spring的AOP去管理事物;常用兩種有方式:聲明式事物和注解式事物; 聲明式事物就是通過在配置裡邊配置他的事物傳播特性和切入點的方式實作;切入點我們一般掃描所有的service層的方法做為切入點;事物傳播特性一般通過方法名稱判斷去使用隻讀事物還是可增删改事物; 注解式事物:在Spring配置檔案裡邊開啟以後,在需要事物增删改事物的方法上加上@Transactional注解就可以了; 事務的隔離級别也分為四種,四個級别可以逐個解決髒讀、不可重複讀、幻讀這幾類問題 7種事務傳播行為就是多個事務方法互相調用時,事務如何在這些方法間傳播 |
17、上家公司的位址?
上家公司是在上地那塊的嘉華大廈裡呢, HR還會聊你在哪住,每天坐幾号地鐵過去,這個一定要說清楚,我在沙河高教園住的呢,我每天直接坐昌平線到西二旗,換13号線人太多了我就直接騎個小黃車就過去.
18、如何解決高并發?
我在公司的時候,都是通過solr全文檢索、redis緩存,還有使用高性能的伺服器、高性能的資料庫、高效率的程式設計語言、高性能的Web容器等等來解決高并發的問題。
19、什麼是微服務?為什麼使用微服務
微服務就是一種分布式的架構
把項目中的每一個子產品采用單獨的業務邏輯封裝,每個項目都可以獨立部署和擴充,服務之間可以通過springCloud的Eureka元件作為注冊中心使用Feign元件進行服務間的互相通信,我個人認為使用了微服務架構可以降低我們代碼的耦合度,在開發的時候,比較好配置設定項目,還有就是後期再進行項目功能擴充的時候也比較靈活.
20、如何使用Spring Boot實作分頁和排序?
使用Spring Boot實作分頁非常簡單。使用Spring Data-JPA可以實作将可分頁的org.springframework.data.domain.Pageable傳遞給存儲庫方法。
21、圖檔是怎麼存儲的?
用的是FastDFS檔案伺服器,FastDFS架構包括一個Tracker server 和一個 Storage server 。
用戶端請求Tracker server 進行檔案上傳、下載下傳,通過Tracker server 調用Storage server完成檔案上傳和下載下傳。
Tracker server可以完成負載均衡,它其實是這樣的,這個Storage server 會定時的向tracker server 發送自己的狀态,tracker server就能知道那個storage server是空閑還是忙碌,當上傳下載下傳的時候,就會調用空閑的storage server ,當上傳或下載下傳的時候,這個storage server會生成filed id ,并将檔案寫到磁盤,傳回一個路徑資訊和檔案名,拿到路徑資訊我們就可以存到資料庫或調用了。
22、Spring常用的注解
1、@Component
是所有受Spring 管理元件的通用形式,@Component注解可以放在類的頭上,@Component不推薦使用。标注一個普通的spring Bean類。
2、@Controller對應表現層的Bean。标注一個控制器元件類。
3、@Service對應的是業務層Bean。标注一個業務邏輯元件類。
4、@Repository對應資料通路層Bean。标注一個DAO元件類。
在spring未來的版本中,@Controller,@Service,@Repository會攜帶更多語義。盡量考慮使用@Controller,@Service,@Repository代替通用的@Component。
5、@Transactional 應用事務的注解
1)定義到方法上: 目前方法應用spring的聲明式事務
2)定義到類上: 目前類的所有的方法都應用Spring聲明式事務管理;
3)定義到父類上: 當執行父類的方法時候應用事務。
在spring未來的版本中,@Controller,@Service,@Repository會攜帶更多語義。 盡量考慮使用@Controller,@Service,@Repository代替通用的@Component。
23、公司有技術分享嗎?
當然有啦,我們公司每周五的下午都會有一個小組做技術分享,分享一個技術,或者我們項目當中相關的新的業務,如遇到了什麼問題,是怎麼解決的。最新技術的分享 ,像springboot 微服務,分布式事務啦等等,他會問分布式事務,照着後面的說
24、你們項目中事務是怎麼配置的?
首先配置事物的管理器定義屬性聲明事物規則定義切面
然後将事物增強與切面組合
最後開啟事物注解标注
Transaction的類和方法将具有事物
25、線程之間可以共享記憶體嗎?
可以。在同一程序中的各個線程,都可以共享該程序所擁有的資源,這首先表現在:所有線程都具有相同的位址空間(程序的位址空間),這意味着,線程可以通路該位址空間的每一個虛位址;此外,還可以通路程序所擁有的已打開檔案、定時器、資訊量機構等。由于同一個程序内的線程共享記憶體和檔案,是以線程之間互相通信不必調用核心。
不同程序之間共享記憶體通常安排在同一段實體記憶體中,程序可以将同一段共享記憶體連接配接到他們自己的位址空間中 如果某個程序向共享記憶體寫入資料,所做的改動将立即影響到可以通路同一段共享記憶體的任何其他程序。
共享記憶體并未提供同步機制,就是說 在第一個程序結束對共享記憶體的寫操作之前 并沒有自動機制可以阻止第二個程序開始對它進行讀取,使用我們通常需要用其他的機制來同步對共享記憶體的通路。
26、session和cookie 差別
Session是在服務端儲存的一個資料結構,用來跟蹤使用者的狀态,這個資料可以儲存在叢集、資料庫、檔案中;
Cookie是用戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,也是實作Session的一種方式。
cookie資料存放在客戶的浏覽器上,session資料放在伺服器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session。
session會在一定時間内儲存在伺服器上。當通路增多,會比較占用你伺服器的性能考慮到減輕伺服器性能方面,應當使用COOKIE。
單個cookie儲存的資料不能超過4K,很多浏覽器都限制一個站點最多儲存20個cookie。
是以個人建議:
将登陸資訊等重要資訊存放為SESSION
其他資訊如果需要保留,可以放在COOKIE中
27、給我講一下ActiveMQ這個技術
(What ActiveMQ是什麼?)
先說jms規範
講這個ActiveMQ,需要先聊到java中有一個JMS規範,就是java 消息服務規範,這套規範包含點對點,訂閱兩種方式來收發消息,簡單來說的話,就是JMS制定了這樣一個規範,裡邊的API與具體的平台無關。
ActiveMQ是支援JMS規範的一個開源技術,它支援好多通訊協定,像我們最常用的TCP和UDP,它都支援,activeMQ支援多種通訊協定TCP/UDP等。對于TCP協定,我們知道TCP有一個三次握手,所謂的三次握手可以這樣來了解,比如A和B建立連接配接時,首先A向B發出一個同步請求,然後B回複一個同步請求應答,最後A回複一個确認資訊。
ActiveMQ消息如何發送接收
就拿ActiveMQ中所支援的TCP協定來說,ActiveMQ初始化時,通過類根據配置打開TCP偵聽端口,客戶通過該端口發起建立連結的動作。 生産者發送一個消息,進入到消息隊列中,然後消費者可以從隊列中取出消息
在ActiveMQ中分為生産者和消費者,生産者發送消息,消費者接受消息,裡邊有一個比較重要的機制叫做消息中轉器,它是activeMQ的核心,消息會先經過中轉器,然後再分發給消費者
發送消息方式
對于ActiveMQ發送消息的方式,是分為兩種的,其實它也是符合JMS規範的,就是點對點和訂閱消息類型,對于點對點,每個消息隻能有一個消費者,這種方式是基于隊列的,如果消息不被消費,就會一直阻塞在隊列中,隻有當消費者消費之後消息才會消失。
對于訂閱方式,它是基于主題topic的,可以有多個消費者,類似于廣播,隻要你訂閱了,就能夠收到這個消息,如果發的時候還沒啟動消費者,那這個消息就會被錯過。
心跳機制
還有這個ActiveMQ還有一個心跳的機制,這種機制可以判斷收發雙方鍊路是否通暢,它内部使用的機制是雙向心跳,也就是ActiveMQ的生産者和消費者都進行互相心跳。心跳這裡會産生兩個線程,一個是“ReadCheck”“WriteCheck”,它們都是timer類型,每隔一段時間都會被調用一次.
其實這個ActiveMQ的資訊還是挺多的,比如它發送消息能實作即時發送,還能實作定時,延時發送.
28、ActiveMQ原理
ActiveMQ收發消息的原理和具體流程大約是這樣的:
發送方:
建立一個連接配接消息中轉伺服器的連接配接工廠。
根據這個工廠擷取到一個具體的connection
啟動連接配接,建立session回話
設定發送消息的類型,可以指定topic也可以指定點對點
将消息發送出去
消費方:
也是建立一個連接配接消息中轉伺服器的連接配接工廠
根據這個工廠擷取到一個具體的connection
啟動連接配接,建立session會話
定義消息消費者,準備接收消息
設定一個消息接收的監聽者,當有消息回調接收到的時候,回調到onMessage方法中
(Why為什麼使用ActiveMQ)
我們做的項目由于是分布式項目,各個子產品之間都是互相獨立的,就會有這樣的需求,比如子產品之間的通信問題,或者高并發,就會用到消息隊列,消息隊列的話,常用的有RabbitMQ,ActiveMQ,阿裡的RocketMQ,rabbitmq支援的協定比較多,是一種重量級的消息架構,阿裡的rocketmq沒有用過,我們常用的是activeMQ,屬于輕量級的。
(How ActiveMQ怎麼用)
使用場景
對于ActiveMQ在我們開發中,主要應用到這麼幾個場景,比如,我們的項目現在都是分布式的,咱們不可能在一個子產品中實作所有的功能,就拿商品管理子產品來說,當對商品做添加,修改,删除操作時,其他子產品也有可能有相關連的變化,比如前台子產品中的搜尋,商品資訊變了,索引庫中内容也應該有相應的變化,這個時候呢,我們就需要用到一個通信機制,那ActiveMQ這種類型的架構我們就恰好需要的,可以在商品操作時,發送一個消息說我商品資訊改變了,當然需要指明哪一個商品發生了變化,發送對應的商品id就行,在前台子產品中,我們配置一個消息接收端,當接收到消息時,對索引庫做下修改就行。
當然,除了商品添加同步更新索引庫,像商品詳情子產品,在商品稽核通過以後,想消息隊列中發送了一個商品id到消息隊列中,pageService工程中有一個監聽類,可以生成相應的靜态頁面,,還有訂單子產品也有用到過,當執行生成訂單,進行銀行扣款,扣款成功,減庫存啊,這種類型的操作,都可以通過ActiveMQ發生消息來實行同步操作。
具體操作
以上呢,是介紹一下ActiveMQ,對于ActiveMQ的使用,我們是這樣來做的
,拷貝一個ActiveMQ壓縮包放到在Linux伺服器上,解壓,用./activemq啟動activemq,這個就是我剛才所說的消息中轉伺服器,我們還可以通路一個管理界面,能夠檢視收發消息的狀态。
在maven項目,我們需要在pom檔案中配置activemq的jar包資訊
在發送端的springmvc的配置檔案中配置mq的連接配接工廠,指定消息伺服器的ip端口,配置Spring提供的JMS模闆類工具類(jmsTemplate),配置發送消息的類型。在需要進行發送的代碼邏輯中,直接使用spring提供的模闆類 jmsTemplate.send就可以了,至于發送的内容,可以自己指定。是文本類型,還是消息對象消息,按需求指定就可以。
同樣的,在Springmvc配置工廠,服務ip端口,還需要額外指定一個監聽器,這個監聽器就是自己定義的一個類,實作MessageListener ,當收到消息時,就會觸發裡邊的一個回調方法,把消息取出來,執行相應邏輯就可以。
29、非關系型的資料庫; ( redis )Redis的運作原理,在哪個子產品用,有沒有出現什麼問題(話術總結)
Redis是一個非關系型的資料庫,以key-value的形式存儲在記憶體中的,
存儲的資料類型有字元串,清單類型還有散清單型,項目中常用string和hash這兩種類型;redis還可以将數存儲到磁盤中,
有兩種形式rdb和aof兩種,
rdb是以快照的形式來存儲資料的,
redis預設也是這種存儲形式,性能較好
aof是即時存儲,每個一秒存儲一次,性能比較差;
在項目中,網站的門戶通路量很高,是以其中的大廣告位商品的展示用到了redis緩存,以提高使用者的體驗度,還有單點登入也用到了redis緩存,使用者登入時生成一個不會重複的token,以此為key值,使用者的資訊為value值,來存儲資料,并且通過cookie把taken傳回給浏覽器,通路其他子產品是就可以從redis中取出使用者的資訊
Reids存在的問題就是記憶體中的資料還沒有儲存到磁盤上時,伺服器當機或者斷電,就會發生資料丢失,
解決的途徑是提高存儲的頻率。
30、給我介紹一下redis
Redis是一個繼memcached後的又一個第三方緩存資料庫,他比memcached強大很多,支援更多的資料類,它作為資料庫和應用程式直接的中間層來使用,已減輕資料庫壓力,提高運作效率。 我們項目中很多地方用到了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容災的最有效的方法還是搭建叢集。在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個key隻允許一個線程查詢資料和寫緩存,其他線程等待。:不同的key,設定不同的過期時間,讓緩存失效的時間點盡量均勻。 快照(RDB)方式,預設方式,檔案以二進制方式儲存到RDB檔案。 檔案追加(AOF)方式,檔案以協定文本的方式write到AOF檔案。 作用,重新開機後的資料恢複。當兩種方式都啟用時,redis會優先載入AOF檔案,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。 注意優先是指載入AOF檔案就不再加載RDB了,不管AOF是不是空檔案。 5. Redis和memcached的差別 1、Redis和Memcache都是将資料存放在記憶體中,都是記憶體資料庫。不過memcache還可用于緩存其他東西,例如圖檔、視訊等等; 2、Redis不僅僅支援簡單的k/v類型的資料,同時還提供list,set,hash等資料結構的存儲;redis支援事務 3、虛拟記憶體--Redis當實體記憶體用完時,可以将一些很久沒用到的value 交換到磁盤; 4、過期政策--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10; 5、分布式--設定memcache叢集,利用magent做一主多從;redis可以做一主多從。都可以一主一從; 6、存儲資料安全--memcache挂掉後,資料沒了;redis可以定期儲存到磁盤(持久化); 7、災難恢複--memcache挂掉後,資料不可恢複; redis資料丢失後可以通過aof恢複; 8、Redis支援資料的備份,即master-slave模式的資料備份; 9、應用場景不一樣:Redis出來作為NoSQL資料庫使用外,還能用做消息隊列、資料堆棧和資料緩存等;Memcached适合于緩存SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等。 |
31、redis的資料類型?
我了解的有
字元串類型、
list,我們可以向list的兩端添加資料
集合set,存放的資料是無序的,集合中的資料是不重複的,由于它是無序的,是以不能通過下标來擷取制定元素、
order set有序集合、
hash
實際上我們常用的也就是string 和hash
redis是通過key-value存儲的 set key value string
hset key value hget key value
32、redis的持久化方案有哪些
答案:RDB,AOF倆種,RDB是一種快照的方式來存儲的,這也是redis的預設的持久化方式,每隔一段對資料進行一次存儲,預設是15S。
AOF是即時性的持久化方式,這種方式對資料的儲存完整性比較高,但是性能比較差。
而RDB存在的問題主要是伺服器當機或者斷電,就會造成資料丢失,我們可以适當的把存儲間隔縮短一些
33、平常用什麼開發工具
IDEA,Eclipse,MyEclipse,資料庫操作用nvacat或者sqlyong,還有資料庫模組化用powerDesner
34、Redis是如何同步的?
讀取資料的時候先從redis裡面查,若沒有,再去資料庫查,同時寫到redis裡面,并且要設定失效時間。存資料的時候要具體情況具體分析,可以選擇同時插到資料庫和redis(要是存放到redis中,最好設定失效時間),也可以選擇直接插到資料庫裡面,少考慮一些問題,添加内容的,把對應的redis裡的資料的删除掉.第一個人查的時候從資料庫裡查詢,把資料放到的緩存中,第二個人通路就可以直接從緩存中通路資料了
35、java arrayList的存儲結構,初始化的時候建立多大的數組?
ArrayList是基于數組實作的,是一個動态數組,其容量能自動增長,類似于C語言中的動态申請記憶體,動态增長記憶體。
ArrayList不是線程安全的,隻能用在單線程環境下,多線程環境下可以考慮用Collections.synchronizedList(List l)函數傳回一個線程安全的ArrayList類,也可以使用concurrent并發包下的CopyOnWriteArrayList類。
36、 講一下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的差別;
- Lucene是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構
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
37、談談你上家公司的薪酬結構
答案:基本工資4000、崗位工資4000、績效工資2000,我們公司12薪,扣稅750,保險折現了給了500
38、說一下你們公司的離職流程
1.按勞動合同,必須得提前一個月提出離職申請(官方)
實際說法:手頭工作交接一下,大概一個星期左右就可以離職.
39、java中的泛型有哪些,為什麼要用(需要整理)
泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的資料類型被指定為一個參數。這種參數類型可以用在類、接口和方法的建立中,分别稱為泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。
在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實作參數的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。對于強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運作的時候才出現異常,這是一個安全隐患。
泛型還有接口、方法等等,内容很多,需要花費一番功夫才能了解掌握并熟練應用。
限制性:
1、泛型的類型參數隻能是類類型(包括自定義類),不能是簡單類型。
2、同一種泛型可以對應多個版本(因為參數類型是不确定的),不同版本的泛型類執行個體是不相容的。
3、泛型的類型參數可以有多個。
4、泛型的參數類型可以使用extends語句,例如<T extends superclass>。習慣上稱為“有界類型”。
5、泛型的參數類型還可以是通配符類型。例如Class<?> classType = Class.forName("java.lang.String");
簡單介紹:
在Java 5之前,為了讓類有通用性,往往将參數類型、傳回類型設定為Object類型,當擷取這些傳回類型來使用時候,必須将其“強制”轉換為原有的類型或者接口,然後才可以調用對象上的方法,強制類型轉換很麻煩,我還要事先知道各個Object具體類型是什麼,才能做出正确轉換。否則,要是轉換的類型不對,比如将“Hello Generics!”字元串強制轉換為Double,那麼編譯的時候不會報錯,可是運作的時候就挂了。那有沒有不強制轉換的辦法----有,改用 Java5泛型來實作。
40、全外連接配接 左右外連接配接 内連結相同條件下 查詢資料數量比較
全>左右>内
内聯接(INNER JOIN)
僅将兩個表中滿足連接配接條件的行組合起來作為結果集。在内連接配接中,隻有在兩個表中比對的行才能在結果集中出現
左外連接配接(LEFT JOIN)
左表的所有資料和右表符合條件的資料
右連接配接相對應 (RIGHT JOIN)
全外連接配接 (FULL JOIN)
傳回左表和右表中的所有行。當某行在另一個表中沒有比對行時,則另一個表的選擇清單列用null代替。如果表之間有比對行,則整個結果集行包含基表的資料值。
41、fastDFS下載下傳
檔案上傳後傳回一個路徑資訊和檔案名,拿到路徑資訊我們就可以存到資料庫或調用了。
42、感覺在開發中比較有成就的項目
我比較有成就感的項目是一個手機APP 叫 小象優品
它是一款以網絡購物為核心業務的app,一共分為兩大子產品,分别是用戶端和背景管理系統。
它的用戶端有商品搜尋,商品展示,購物車,支付等這些功能,對于客戶來說,可以浏覽并找到自己滿意的商品,這樣客戶會獲得便捷的購物方式和放心的服務。
而背景管理系統 有使用者管理,商品管理,訂單管理,店鋪管理等功能,對于賣家來說可以通過簡單的操作,就能實作商品的售賣和管理,非常大的便捷,簡單;
我主要負責商品子產品,包括搜尋商品和商品的展示。
我主要用到的技術有solr ,它實作所有商品的搜尋功能,Solr它是一個全文檢索伺服器,我們可以通過solr 設定 條件查詢,還有 高亮顯示啦 這些功能,現在不是都用solr來做嘛,它的查詢效率是比較高的; ,我還使用ActiveMQ這個消息隊列 它可以實作索引庫和緩存的同步,比如我們做商品添加時,用activeMQ可以把資料同步到solr上,還搭建了nginx+FastDFS伺服器來管理我們項目中圖檔和檔案的上傳及下載下傳;
43、消息隊列activeMQ怎麼使用的?
acticeMQ是消息隊列的一種,(RackMQ,阿裡的消息隊列,這種消息隊列聽過沒用過,)在解決solr搜尋時實作消息同步采用的方法,像解決添加商品的時候,往solr索引庫中添加一條記錄這種情況下使用(當然,像增删改這些都适用),在項目裡我是這樣使用的,先搭建一個activeMQ服務(從apache官網上下載下傳資源),引入相關的jar包,在添加商品的jar包工程裡(分布式開發)配置一個activeMQ的配置檔案,配置到spring的配置檔案中,當發生商品添加時,發送一個商品的id到activeMQ上,在搜尋服務的war包工程裡在配置一個activeMQ的配置檔案,在裡面設定監聽,(拓展:activeMQ釋出服務的方式為點對點式Queue和釋出訂閱式Topic,采用的是訂閱式釋出Topic(訂閱釋出式)釋出的服務沒有消費者消費的情況下是不會在伺服器端進行緩存的,直接就會找不到了,但是Queue(點對點)這種模式如果消費端沒有消費的話,是直都會儲存到伺服器端的.)當發生商品添加動作 時,會從activeMq中擷取到商品id,在監聽的類中調用相關的接口和方法向索引庫裡面添加相關的資訊,進而實作同步的功能。
44、你們公司的接口是怎麼管理的?
那個接口開發,我們就是這麼做的,就是用的那個springMVC結合swgger來做的那個接口開發,swgger提供一些注解,可以把接口文檔通過網頁的形式可以展示出來,上面能标清楚他的url,參數,傳回類型什麼的,比較友善,原來我們沒有用swgger的時候,用的都是那個word文檔,但是用容易丢,不好維護,後來才用的swgger,現在同類型的産品也挺多的,我們公司反正用的都是swgger。
45、簡單說一下sql語句是怎麼優化的
(01)選擇最有效率的表名順序(筆試常考) 資料庫的解析器按照從右到左的順序處理FROM子句中的表名, FROM子句中寫在最後的表将被最先處理, 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表放在最後, 如果有3個以上的表連接配接查詢,那就需要選擇那個被其他表所引用的表放在最後。1)如果三個表是完全無關系的話,将記錄和列名最少的表,寫在最後,然後依次類推 2)如果三個表是有關系的話,将引用最多的表,放在最後,然後依次類推
(02)WHERE子句中的連接配接順序(筆試常考) 資料庫采用自右而左的順序解析WHERE子句,根據這個原理,表之間的連接配接必須寫在其他WHERE條件之左, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的之右。
(04)用TRUNCATE替代DELETE
(05)盡量多使用COMMIT 因為COMMIT會釋放復原點
(06)用WHERE子句替換HAVING子句 WHERE先執行,HAVING後執行
(07)多使用内部函數提高SQL效率
(08)使用表的别名
46、pc端和app是不是共享一個接口,為什麼
一般得看需求因為controller不是一個的有可能pc端的是傳回頁面移動端的是傳回json資料格式根據實際的需求而定
47、跨域是怎麼解決的
跨域這塊呢,之前我們用過JSONP來解決跨域問題,現在項目用到springMVC了,它裡邊有個@CrossOrigin(origins="http://localhost:9105",allowCredentials="true")
開發時侯跨域調用這塊還用到過HttpClient這個技術,把它放到工具類裡變用的時候直接調用就行了,項目開發中也用到過一些其他這樣的技術,像遇到C語言向java語言這種跨語言的通信,就用到WebService技術,它的底層通信用的是soap協定,用的是cxf方式來發送的。
48、jdk1.8 和1.7差別
JDK1.8的新特性
一、接口的預設方法
Java 8允許我們給接口添加一個非抽象的方法實作,隻需要使用
default關鍵字即可,這個特征又叫做擴充方法。
二、Lambda 表達式
在Java 8 中你就沒必要使用這種傳統的匿名對象的方式了,
Java 8提供了更簡潔的文法,lambda表達式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
三、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?每一個lambda表達式
都對應一個類型,通常是接口類型。而“函數式接口”
是指僅僅隻包含一個抽象方法的接口,每一個該類型的lambda表達式
都會被比對到這個抽象方法。因為 預設方法 不算抽象方法,
是以你也可以給你的函數式接口添加預設方法。
四、方法與構造函數引用
Java 8 允許你使用 :: 關鍵字來傳遞方法或者構造函數引用,
上面的代碼展示了如何引用一個靜态方法,我們也可以引用一個對象的方法:
converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
五、Lambda 作用域
在lambda表達式中通路外層作用域和老版本的匿名對象中的方式很相似。
你可以直接通路标記了final的外層局部變量,或者執行個體的字段以及靜态變量。
六、通路局部變量
可以直接在lambda表達式中通路外層的局部變量:
七、通路對象字段與靜态變量
和本地變量不同的是,lambda内部對于執行個體的字段以及靜态變量是即可讀又可寫。
該行為和匿名對象是一緻的:
八、通路接口的預設方法
JDK 1.8 API包含了很多内建的函數式接口,在老Java中常用到的比如Comparator
或者Runnable接口,這些接口都增加了@FunctionalInterface注解以便能
用在lambda上。
49、使用者注冊怎麼知道誰有URL權限
給不同類型的使用者設定不同的狀态碼,通過狀态碼比對角色表,再通過角色表比對權限表 進而實作URL權限賦予功能
50、全文檢索誰來定?
由業務來定。比如說做商品檢索時,時搜尋商品的名稱,賣點,描述。以這些業務域進行所搜的
51、購物車子產品cookie被禁止了,怎麼解決?
URL重寫,對所有頁面涉及的連接配接都使用url重寫方式。進而将JsessionID
以參數的方式連結到URL後面。保證每次頁面送出時伺服器都能獲得sessionID進而維持和用戶端的狀态。
52、關于統計的sql語句?
count max min sum avg
53、js中的==和===的差別?
”==”與”===”是不同的,前者是判斷值是否相等,後者是判斷值及類型是否完全相等。
54、事務的傳播特性?
1.PROPAGATION_REQUIRED:支援目前事務,如果目前沒有事務,就建立一個事務。這是最常見的選擇。
2.PROPAGATION_SUPPORTS:支援目前事務,如果目前沒有事務,就以非事務方式執行。
3.PROPAGATION_MANDATORY:支援目前事務,如果目前沒有事務,就抛出異常。
4.PROPAGATION_REQUIRES_NEW:建立事務,如果目前存在事務,把目前事務挂起。
5.PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果目前存在事務,就把目前事務挂起。
6.PROPAGATION_NEVER:以非事務方式執行,如果目前存在事務,則抛出異常。
7.PROPAGATION_NESTED:支援目前事務,新增Savepoint點,與目前事務同步送出或復原。
55、在開發的時候設計過哪些文檔,有什麼規範嗎?
傳統方式: 接口文檔三要素:URL 、參數、傳回值
需求文檔: 客戶做需求調研的時候寫過,根據客戶的需求我們來寫文檔。畫流程圖、寫開發步驟、主要功能點的介紹等
系統設計:有哪些功能點、規定了具體方法、類、字段,涉及資料庫表、字段,後期編碼
網際網路項目:采用靈活式開發,利用swagger設計文檔,生成文檔的URL、參數、傳回類型。
56、 說一下FreeMarker這個技術吧
freemarker是一個模闆化引擎語言,傳統項目中,背景頁面基本上都是list清單,頁面都是類似的,隻是展示的資料不一樣。這樣我們就可以把他的樣式做成一個freemarker模闆,然後傳入資料就可以展示不同的頁面。他的模闆一般是以.ftl結尾的。如果使用這個呢,可以使我們開發人員不需要太關注前台。但是對于很多門戶或商城類項目,每個頁面都是不一樣,是以用他也不是很友善。另外,由于可以把freemarker模闆直接轉換成html、jsp、java、xml、word等各種文檔。是以我們經常使用他做代碼生成、word生成或者首頁靜态化等。我這裡就用到了首頁靜态化的功能。由于任何使用者通路時,首先會通路到我們的首頁,是以很多東西都希望能在首頁展示,但是放的東西多了,就會加載很慢。給使用者的體驗度很不好。是以我們在項目啟動時,直接把首頁需要的資料查詢出來,通過freemarker模闆生成靜态的html頁面,之後使用者通路時,都去通路這個靜态頁面,這樣就不需要頻繁通路資料庫,減輕了資料庫壓力,提高了使用者體驗度。但是缺點是,資料庫資料資料變換了以後,資料無法實時更新。我們一般通過定時器的方式,每天淩晨重新生成。
還有就是熱銷商品的商品詳情頁面也做了靜态化處理,首頁我們是通過定時器每天淩晨一點,去重新生成;商品詳情我們是在商品資訊修改以後,給定時器表(id,業務id、type,remark)中推送一條資訊,到第二天淩晨一點時,定時任務掃描表,發現有需要重新生成的頁面,就調用freemarker模闆,重新生成html頁面,以商品id作為html頁面名稱,然後删除任務表中的資料。為了預防大量靜态頁面給伺服器造成壓力,我們把html頁面直接生成到Nginx的靜态頁面伺服器上。通路時,不用經過Tomcat,直接通過Nginx通路。
57、有一個新的頁面(或者子產品)讓你開發,需要多長時間:
您能給我說一說這頁面或者子產品要實作的功能,它要實作什麼樣的效果,還有它的需求文檔等等一些資料,這樣我才能根據這些資料,來大緻算一算要多長時間能完成。
58、Spu和Sku分别是什麼意思?
sKU是庫存量機關,區分單品,.另外還有SPU,是标準化的産品單元,區分品種,
例如 iphon8這是一個SPU 蘋果8 (64G 黑色 移動) 這就是一個SKU.
59、你們solr有專門的地方維護嗎?是手動添加還是?(同步問題)
我們用的是SpringDataSolr來操作的Solr索引庫.
我們項目在第一次上線的時候,會手動往solr索引庫導入一批資料,後期就不用人工幹預了,我們背景添加了相應的商品之後,商品稽核通過的時候,用的ActiveMQ往裡面發送一條消息,商品的ID,然後在solr這個search這個工程中,我們會接收到這個id,然後把這個id從資料庫裡面查詢出來該商品資訊,把資料添加到我們的索引庫裡邊去。維護大概就是這樣。
60、項目中的管理工具用的什麼
你是說的項目版本管理,還是項目進度管理,我們項目版本管理用的是SVN,我們項目進度管理項目經理用的是禅道,還有那個project軟體管理的進度.
61、項目中用的什麼做的壓力測試
LoadRunner: 是Windows系統下的一個測試工具。是一種預測系統行為和性能的負載測試工具。通過以模拟上千萬使用者實施并發負載及實時性能監測的方式來确認和查找問題,LoadRunner能夠對整個企業架構進行測試。企業使用LoadRunner能最大限度地縮短測試時間,優化性能和加速應用系統的釋出周期。 LoadRunner可适用于各種體系架構的自動負載測試,能預測系統行為并評估系統性能
62、項目當中的多線程,線程池是怎麼回事
項目中的多線程,線程池是怎麼回事
多線程:解決多任務同時執行的需求,合理使用CPU資源。多線程的運作是根據CPU切換完成,如何切換由CPU決定,是以多線程運作具有不确定性。
線程池:現在伺服器端的應用程式幾乎都采用了“線程池”技術,這主要是為了提高系統效率。因為如果伺服器對應每一個請求就建立一個線程的話,在很短的一段時間内就會産生很多建立和銷毀線程動作,導緻伺服器在建立和銷毀線程上花費的時間和消耗的系統資源要比花在處理實際的使用者請求的時間和資源更多。線程池就是為了盡量減少這種情況的發生。(适用于短時間内多任務的情況,如果線程執行時間較長不适用線程池)
63、什麼是死鎖
(1) 打個比方,假設有P1和P2兩個程序,都需要A和B兩個資源,現在P1持有A等待B資源,而P2持有B等待A資源,兩個都等待另一個資源而不肯釋放資源,就這樣無限等待中,這就形成死鎖,這也是死鎖的一種情況。給死鎖下個定義,如果一組程序中每一個程序都在等待僅由該組程序中的其他程序才能引發的事件,那麼該組程序是死鎖的。
(2) 競争不可搶占資源引起死鎖
(3) 也就是我們說的第一種情況,而這都在等待對方占有的不可搶占的資源。
64、死鎖的發生必須具備4個條件
(4) 互斥條件: 其實就是程序對所配置設定到的資源進行排它性使用,是指在一段時間内某個資源隻能由一個程序占用。如果此時還有其它程序請求資源,那麼其它線程隻能等待,直到占有資源的程序用完被釋放掉。
(5) 請求和保持條件: 指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
(6) 不剝奪條件: 指程序已獲得的資源,在未使用完之前,不能被剝奪,隻能在使用完時由自己釋放。
(7) 環路等待條件: 指在發生死鎖時候,一定存在一個程序相當于資源的環形鍊,也就是程序的集合像{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源
65、如何避免死鎖四種方法
(1) 檢測死鎖
這種方法并不須事先采取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運作過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,并精确地确定與死鎖有關的程序和資源,然後采取适當措施,從系統中将已發生的死鎖清除掉。
(2) 解除死鎖。
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須将程序從死鎖狀态中解脫出來。常用的實施方法是撤銷或挂起一些程序,以便回收一些資源,再将這些資源配置設定給已處于阻塞狀态的程序,使之轉為就緒狀态,以繼續運作。死鎖的檢測和解除措施,有可能使系統獲得較好的資源使用率和吞吐量,但在實作上難度也最大。
66、IO和NIO的差別?
它們的主要差別是:io 是面向流,阻塞io,而nio是面向緩沖,非阻塞的io;
io的話每次從流中讀取一個或多個位元組,直到讀取完所有的位元組,沒有緩存到任何地方.nio讀取的是資料是有緩存,就是說他讀取的資料是在緩沖裡讀的.
另外的話,java中的各種io是阻塞的.就是說一個線程調用read或者write()時,這個線程就已經被阻塞了,直到讀取到一些資料為止,或者是完全寫入.在此期間不能幹其他的
事情. nio的非阻塞模式,當發送一個讀取資料的請求的時候,如果沒有讀取到可用的資料,就什麼也不會擷取,且不會讓線程阻塞.非阻塞寫也是這樣.非阻塞的IO的空閑時間可用用來做其他的操作是以,一個單獨的非阻塞線程可以管理多個輸入和輸出通道(chanel)
另外NIO還有一個selector(選擇器),它是可以管理多個輸入輸出的通道.大概就是這樣
67、資料庫視圖?
原來我們公司做某某某項目的時候呢,用的是5張表的聯查,然後用sql語句來寫的話,比較慢,比較麻煩,然後我們把這5張表的聯查建立了了視圖,然後就直接查找的是視圖,查詢速度快,這個視圖就是隻能做查詢,而不能做增删改操作。還有就是 Oracle 裡面視圖用的是CREATE VIEW 後面跟視圖的名字,然後跟上sql語句
其實視圖就是當成一張表進行操作了。
68、項目中你主要負責那塊?
這就集思廣益了,按照自己履歷上的項目,然後針對性的找出自己要說哪幾點,首先介紹這個是幹什麼的,然後這個是怎麼用的,然後在哪裡用的。
69、 關于推送消息是怎麼做到的?現在的推送消息插件:
首先呢,不推薦在web架構下在消息,效率低,可以使用一個開源的消息伺服器,jmq,mqtt,xmpp協定都可以。
http長連接配接基本采用websocket實作,http協定的本身就比較複雜,websocket實作開銷很高,而專用的消息協定簡單了很多。如果每個人的消息都不同,建議采用xmpp。常用的插件有極光推送,信鴿推送,Kindle推送
以下了解:
XMPP是一種基于标準通用标記語言的子集XML的協定,它繼承了在XML環境中靈活的發展性。是以,基于XMPP的應用具有超強的可擴充性。經過擴充以後的XMPP可以通過發送擴充的資訊來處理使用者的需求,以及在XMPP的頂端建立如内容釋出系統和基于位址的服務等應用程式。而且,XMPP包含了針對伺服器端的軟體協定,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程式或給一個配好系統添加功能。
WebSocket協定是基于TCP的一種新的網絡協定。它實作了浏覽器與伺服器全雙工(full-duplex)通信——允許伺服器主動發送資訊給用戶端。
70、Js中的基本資料類型?
- Undefined:隻有一個值,就是undefined
- Null;隻有一個值,就是null,邏輯角度看,null值表示一個空對象指針
- Boolean:類型隻有兩個值:true 和 false
- Number:使用IEEE754格式來表示整數和浮點數值
- String:由單引号或雙引号括起來的字元序列,任何字元串的長度都可以通過通路length屬性獲得
71、專業書籍你都看過那些?
<<java 程式設計思想>> :作者是埃克爾,譯者是陳昊鵬
這本書講的是java基礎文法到最進階的特性(有深入的面向對象概念,多線程,自動項目建構、單元測試和調試,等等等等,)這本書一共共22章,包括(多态、接口、通過異常處理錯誤、字元串、泛型、數組、容器深入研究、JavaI/O系統、并發以及圖形化使用者界面等一些内容)。這些豐富的内容都适合我們去學習,适合各個層次的Java程式員閱讀;
《大型網站系統與Java中間件實踐》作者曾憲傑: 它是淘寶的技術總監
這本書主要突出的重點是中間件三個字,中間件是分布式系統中一個非常重要的東西,它最重要的作用應該就是降低子產品與子產品之間的那種強依賴,然後不同的子產品之間的依賴度降低了,就可以各自獨立地開發自己的功能,這也可以說是軟體工程發展的目标和驅動力。
這本書适合對分布式系統比較熟悉并且想要往中間件方面有一定研究的讀者。
72、用過叢集嗎
solrCloud 是solr提供的分布式搜尋方案 solrClund 是基于solr和zookeeper的分布式搜尋方案, 主要思想是使用zookeeper作為叢集的配置中心 特色功能: 1.集中式的配置資訊 2.自動容錯 3.近實時搜尋 4.查詢時自動負載均衡 。SolrCloud結構 需要由多台伺服器共同完成索引和搜尋任務 實作的思路是将索引資料進行shard(分片) 拆分,每個分片由多台的伺服器共 同完成。當一個索引或搜尋請求過來時會分别從不同的shard的伺服器中操作 索引。 solrCloud需要 solr基于zookeeper部署,zookeeper是一個叢集管理軟體, 由solrCloud需要由多台伺服器組成。由zookeeper來進行協調管理
73、項目中共部署了幾個項目
我們的項目采用分布式的架構,每一個子產品都可以作為一個項目,每一個項目都可以分為服務端和消費端,按照其功能分可以分為7個,分别是e3-web-manager,cart,item,portal,
Search,sso,order.這幾個項目組成
74、有哪些需求文檔?
根據項目的需求來做 一般是用線上的需求文檔 就是用的石墨文檔 是支援雲端實時協作的企業辦公軟體 我們一般是這上頭寫需求 改需求的。
75、平常有自己搭伺服器嘛?
有 dubbo solr Redis 都是我們自己搭建的 這些都是最基本的
76、你們公司有沒有專門的測試環境,專門有一個位址 釋出項目進行内部測試的?
有 我們有專門測試的服務 專門測試的服務 有一個測試的版本 有一個環境 比如說連接配接資料庫 測試環境無非就是把配置變一下,一般都是有生成環境 開發環境 還有測試環境 一般都是這麼分的 咱們公司是這樣的嗎 測試是怎麼做的呢?
77、HTTP和HTTPS的差別
我們公司用的是HTTPS協定 他倆一個是加密 一個不加密 HTTPS是基于http開發的 是http的安全版 HTTPS協定需要到ca申請證書 一般免費證書很少 需要交費 他們兩個連結的端口引入不一樣 http是80 https是443
http是超文本傳輸協定 資訊是明文傳輸的 HTTPS則是具有安全性的ssl加密傳輸協定
78、TCP協定,UDP協定,RPC協定,JMS協定?
都是通信協定
Tcp:tcp跟udp都是傳輸協定 主要差別是tcp協定連接配接需要3次握手 斷開需要四次握手 是通過流來傳輸的就是确定連接配接後一直發送資訊 傳完後斷開
Udp:udp不需要進行連接配接 直接把資訊封裝成多個封包直接發送 是以速度更快
Rpc:一種通過網絡從遠端計算機程式上請求服務 不需要了解底層網絡技術的協定
Jms:(java mSSessaging service)是java的消息服務 jms的用戶端之間通過jms服務進行異步的消息傳輸
79、庫存警告是怎麼使用的?
答:一般我們都是去,恩,就是說當我們每次做完出庫後,都會有一個計算,比如說當我們的庫存量小于100,或者是小于50,然後說就是會有相應的短信提醒,告訴庫管這個商品少了,或者就是專門有一個預存資訊的功能,就是定時的點選那個就可以知道哪些庫存少了,就應該及時的去補充這個庫存,其實就是查詢庫存數量小于多少的庫存數就行
80、權限管理你們是單獨的一個呀,還是怎麼弄的?
我們之前做過權限管理,我們做的時候使用的五張表去做的這樣的權限管理,有一張使用者表,一張角色表,一張權限表,還有一張使用者角色的橋表和角色權限的橋表。
我們是通過使用者的id查詢它所對應的角色,通過角色查詢他所對應的權限,通過權限找到相對應的url.不知道咱們公司關于權限管理這塊是怎麼做的?
81、解釋一下單鍊索引和聯合索引?索引什麼時候失效?
單鍊索引是指在表的某一列上建立索引,聯合索引是在多個列上聯合建立索引。單一索引可以出現在where條件的任何位置,而聯合索引需要按照一定的順序來寫。在多條件查詢的時候,聯合索引的效率更高。我大概就了解這麼多了。
索引并不是時時都會生效的,比如以下幾種情況,将導緻索引失效:
- 如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因)
注意:要想使用or,又想讓索引生效,隻能将or條件中的每個列都加上索引
- 對于多列索引,不是使用的第一部分,則不會使用索引
- like查詢是以%開頭,會導緻索引失效
- 如果列類型是字元串,那一定要在條件中将資料使用引号引用起來,否則不使用索引
- 如果mysql估計使用全表掃描要比使用索引快,則不使用索引
此外,檢視索引的使用情況
show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數
handler_read_rnd_next:這個值越高,說明查詢低效
82、靜态變量與非靜态變量的差別如下:
1.記憶體配置設定
靜态變量在應用程式初始化時,就存在于記憶體當中,直到它所在的類的程式運作結束時才消亡;
而非靜态變量需要被執行個體化後才會配置設定記憶體。
2.生存周期
靜态變量生存周期為應用程式的存在周期;
非靜态變量的存在周期取決于執行個體化的類的存在周期。
3.調用方式
靜态變量隻能通過“類.靜态變量名”調用,類的執行個體不能調用;
非靜态變量當該變量所在的類被執行個體化後,可通過執行個體化的類名直接通路。
4.共享方式
靜态變量是全局變量,被所有類的執行個體對象共享,即一個執行個體的改變了靜态變量的值,其他同類的執行個體讀到的就是變化後的值;
非靜态變量是局部變量,不共享的。
5.通路方式
靜态成員不能通路非靜态成員;
非靜态成員可以通路靜态成員。
靜态變量在類裝載的時候配置設定記憶體,以後建立的對象都使用的該記憶體,相應的操作也就是對這塊記憶體進行操作。也可以看作是另類的全局變量。
在WebSerivice中想隻進行一次初始化,而不用每次都進行初始化這樣占用大量資源。還可以對調用的服務進行管理,比如想把每次調用的服務進行排隊執行,可以将想應資訊放到Arraylist中,靜态時鐘中排隊執行。
83、單點登入session共享是如何做的?
單點登入:
因為我們的項目是分布式的,我們單點登入使用cas做的,使用者在cas系統中一次登入後,在其他項目中也能通路到該使用者的資訊
如果不用cas 的話怎麼實作單點登入?
我們可以結合的redis一塊使用,使用者登入-->成功則存入redis,設定有效期,儲存。進入首頁面。并向cookie發送一個token值,當中包含使用者資訊。使用者如果需要執行其他操作,需要攜帶token值去redis中進行校驗,驗證成功則繼續下一步操作,不成功則重新進行登入操作。
84、MQ用過哪些?了解哪些?
我們常用的有 ActiveMQ、Redis
了解:RabbitMQ、ZeroMQ、Jafka/Kafka
ActiveMQ:它是apache下的一個子項目,類似于ZeroMQ ,是以點對點的技術實作隊列,又有點類似于RabbitMQ,可以高效實作進階應用場景
有兩種消息傳遞類型:
- 點對點,一個生産者隻負責一個消費者,就相當于銀行的一對一會員制度服務
- 釋出/訂閱模式: 也就是說一個生産者 多個消費者,相當于銀行業務的普通制度
作用: 為了解決高并發
好處:支援多種語言和協定的,支援多種傳送協定,提供高速消息持久化
怎麼配置以及安裝調用
安裝:基于jdk,把ActiveMQ 的壓縮包上傳到Linux系統上,進行解壓,使用bin目錄下的 . /activemq start 指令啟動
配置:springMVC.xml檔案中引入activeMQ的xml檔案
activeMQ.xml 檔案中配置JMS 工具類,進行消息的接收發送等,再配置隊列目的地已經訂閱方式
Redis: 以key-value形式存在的非關系型資料庫,本身支援MQ功能,我們可以把它當做一個輕量級隊列服務;
安裝:複制redis壓縮包到Linux系統是哪個,進行解壓,調用bin目錄下 ./redis-server redis.conf ./redis-cli 進行啟動。
配置:commons工程下配置xml文檔 連接配接redis單機/叢集版,導入工具包
RabbitMQ:開源的消息隊列,支援很多協定,是以會非常重量級,适用于企業級的開發,對路由,負載均衡或者資料持久化有很好的支援。
ZeroMQ:具有獨特的非中間件模式,最快的消息隊列系統,主要是針對大吞吐量的需求場景,能實作複雜隊列。
缺點:非持久化,電腦當機資料會丢失。需要開發人員自己組合技術架構
Jafka/Kafka: apache下子項目,輕量級的高性能跨語言分布式消息隊列系統
特性:快速持久化;高吞吐;完全分布式;支援Hadoop資料并行加載
85、開發環境是否統一
我們在開發項目時主要用到IDEA 、JDK1.7、 Maven、 Solr、 nginx、 Tomcat7.0、 MySql、 redis等開發工具或環境搭建,那麼我們在開發同一項目的時候 開發環境必須統一,
公司項目的開發主要還是基于maven管理的聚合工程,分布式架構項目,我們每個人負責的功能子產品都不相同,如果開發環境不統一,可能導緻我們項目合并時候出現版本沖突,或者jar包等不相容之類的事
86、資料庫表縱表轉橫表
a)表結構
1、橫表: 主鍵、字段1、字段2……
如:姓名 國文 英語……
優點:一行表示了一個實體記錄,清晰可見,一目了然。
缺點:如果現在要給這個表加一個字段,那麼就必須重建表結構。
2、縱表:主鍵、字段1/2/3、字段值。
如:姓名 課程 成績
優點:如果現在要給這個表加一個字段,隻需要添加一些記錄。
缺點:資料描述不是很清晰,而且會造成資料庫資料很多。另如果需要分組統計,要先group by,較繁瑣。
b )方法一:
聚合函數(max或者sum)配合case語句
例子:select 姓名,sum(case 課程 where ’國文’ then 成績 end)as 國文 from 表名 group by 姓名
方法二:
使用pivot
select * from 表名 pivot (max(成績)for 課程 in(國文,數學,英語)) 臨時表
c) oracle SQL 實作豎表轉橫表
方法一:
--用decode實作,
SELECT 姓名,
SUM(DECODE(課程, \'國文\', 成績)) 國文FROM 表名GROUP BY 姓名
方法二:
--用case when 實作
SELECT 姓名,
SUM(CASE 課程 WHEN \'國文\' THEN 成績 ELSE 0 END) 國文 FROM 表名GROUP BY 姓名
差別:如果條件是單一值時,用decode比較簡便,如果判斷條件比較複雜是用case when實作
87、接口和抽象類的差別?
使用interface來定義一個接口,接口定義和類的定義差不多,也是分為接口的聲明和接口體,其中接口體由常量定義和方法定義兩部分組成。
[修飾符] interface 接口名 [extends 父接口名清單]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修飾符:可選,用于指定接口的通路權限,可選值為public。如果省略則使用預設的通路權限。
接口名:必選參數,用于指定接口的名稱,接口名必須是合法的Java辨別符。一般情況下,要求首字母大寫。
extends 父接口名清單:可選參數,用于指定要定義的接口繼承于哪個父接口。當使用extends關鍵字時,父接口名為必選參數。
方法:接口中的方法隻有定義而沒有被實作。
88、多線程怎麼解決高并發?
synchronized關鍵字主要解決多線程共享資料同步問題。
ThreadLocal使用場合主要解決多線程中資料因并發産生不一緻問題。
ThreadLocal和Synchonized都用于解決多線程并發通路。但是ThreadLocal與synchronized有本質的差別:
synchronized是利用鎖的機制,使變量或代碼塊在某一時該隻能被一個線程通路。而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間通路到的并不是同一個對象,這樣就隔離了多個線程對資料的資料共享。而Synchronized卻正好相反,它用于在多個線程間通信 時能夠獲得資料共享。
Synchronized用于線程間的資料共享, 而ThreadLocal則用于線程間的資料隔離。當然ThreadLocal并不能替代synchronized,它們處理不同的問題域。Synchronized用于實作同步機制,比ThreadLocal更加複雜。
89、使用ActiveMQ的好處?
減輕伺服器壓力,降低項目之間的耦合度(解耦),是做異步的.
90、索引用過哪些?
索引可以了解為資料1 的查詢目錄,建索引的目的就是 提高對表的查詢速度;沒有索引時,查詢時全表檢索,有了索引就可以根據索引快速查找需要的資料;但是索引也不能亂建,因為索引需要維護,會導緻增删改的效率降低。會使資料的維護變的複雜,影響開發的效率,索引也會占用資料庫的實體空間;是以我們一般在項目的開發階段、測試階段、試運作階段都很少去建立索引,因為有了索引,系統bug造成垃圾資料特别不好删除。隻有在項目正式上線後才去增加索引,以提高項目運作速度。索引我們一般都建立在經常作為查詢條件的字段、排序的字段和作為關聯關系的字段上邊。盡量避免在大文本字段、資料量比較小的字段(比如性别),增删改性能大于檢索性能的字段上邊;另外,有些情況,即使增加了索引,索引也不會生效,比如:索引字段使用了不等于(!=或者<>)符合,用了函數、進行了運算,使用了is null或is not null, 和不比對的資料類型進行比較、like查詢時兩邊都用了%等;還有一個要注意的地方是,如果在多個字段上建立聯合索引,那麼組合索引的第一個列被where子句引用時,索引才會起作用。因為想要使用索引增加查詢效率,必然要犧牲增删改效率,為了解決這個問題,我們經常對資料庫做主從複制,讀寫分離。同時建立兩個資料庫,一主一從,兩個資料庫資料完全一緻,主的資料庫用來進行寫的操作,操作後資料庫會自動把資料同步到從的資料庫,從的資料庫用來執行讀的操作。這樣我們建立索引時,就可以隻在讀的資料庫建立就可以了。這樣就索引即能增加查詢效率,有不影響增删改效率。這樣做了之後,我們還可以對他進一步優化,比如資料庫引擎的優化,主資料庫因為執行增删改操作,是以用事務型引擎Innodb, 讀的資料庫,不需要事務,就可以用效率更高的MyIASM引擎。同時根據實際情況,也可以配置一主多從或者多主多從。索引的建立常用的有2中方式:CREATE 【UNIQUE】INDEX index_name ON table_name (column_list);或者ALTER TABLE table_name ADD INDEX index_name (id,name);修改用:ALTER TABLE table_name REBUILD INDEX index_name (column_list);删除用:DROP INDEX index_name ON talbe_name 或者:ALTER TABLE table_name DROP INDEX index_name 檢視用:select * from all_indexes where table_name=\'student\'; Conlum_list中多個字段用”,”号分割。 |
91、Mysql優化方案?
1. 使用支援mysql主從複制的版本
2. 在使用MySQL時使用索引
3. 優化sql語句
4. 優化MySQL服務,修改MY.INI檔案,根據伺服器配置緩存的大小
5. 根據伺服器配置索引的緩存
6. 使用視圖,将備援字段放在一張表裡
7. 使用第三方技術mycat,對資料庫拆分,水準拆分和垂直拆分,我們用的水準拆分
8. 設定表記憶體放資料上限,同時通過mycat配置讀寫分離
92、Jvm記憶體結構
1.方法區(原資料區,永久區) 應用程式所有的類, 常量(不會變化的量)
2.棧:調用方法的 裡面有 方法的形參和局部變量 方法的傳回值
3.堆:new出來的對象
裡面分為 新生代和老年代
新生代:eden from to 三個區 from 和to 是存活區 剛new出來的對象都放在eden區
from和 to 用來轉儲的記憶體
老年代:被垃圾回收很多次都沒有回收(有沒有被引用)
4.本地方法棧:虛拟機使用Native方法服務
5.Pc寄存器:目前執行的方法的位址,記憶體中速度最高的位置
93、Jvm優化?
1> 代碼上盡量避免不必要的全局變量的使用,避免多層循環疊代,去除不必要的jar包,避免封裝太多不必要的類的封裝
2> JDK中自帶的JMap檢視記憶體資訊,下載下傳GC日志資訊,,檢視當機資訊,在Linux上設定tomcat上面catalina.bat檔案設定Xms初始化堆的大小(128m)和XMx最大允許配置設定對記憶體(按需,一般根據我們項目的需要和記憶體的80%大小,如果不是強需修改,一般設定這兩個參數大小相等)。在eclips上preferences-tomcat-jvm Settings中添加JVM參數,或者windows采用service.bat 中install Tomcat指令 裡面有JVM的參數設定。
94、什麼是讀寫分離?
這個我們項目中使用MyCat來做的,在mycat裡配置好主庫和從庫,做增删改的時候是對主庫進行操作,查詢的時候是對從庫進行操作,其實mysql本身從5.6以後的版本就帶主從複制的功能了,他們是利用mysql裡的log檔案進行的資料同步.
95、線程和多線程話術?
線程就是一段可執行的代碼塊。
因為線程要服務于程序,一個程序有多個線程。
main方法就是主線程。多個線程一起執行就是多線程。
我們處理每一個請求就是一個線程,處理完請求就要被銷毀。如果說有好多個請求,那麼就要不停的建立并銷毀。比較浪費資源。
那我們就用到了線程池,把準備就緒的線程放到線程池裡面。需要處理請求的時候就調用線程。用完後再放回去,這樣就可以防止高并發節省資源。
96、解決hashmap線程不安全問題?
可以通過collections集合工具類對不安全的線程進行包裝,使其變成線程安全的,也可以在使用其時加synchronized關鍵字進行同步
97、如何實作爬蟲的?
爬蟲工具我們一般這樣用 用的 HTTrack JSpider 結合使用的, HTTrack它是模拟一個浏覽器比如說我要爬取京東資料 我就把京東的URl網址寫上然後我們就去通路他HTTrack get請求回來 他就把Html\'頁碼中所有代碼都回來了然後分析Html代碼 分析好用JSpider 它就是模拟的jquery 讓jquery裡面的選擇器然後擷取文本框,标簽裡面的内容 想擷取商品名稱,價格 還有圖檔等,都能趴下來,還有就是我從網上搜下來一個 它采用的線程池的方式 當時我們用這個,爬的京東資料,不知道多長時間 爬取了10~20G多。用寫的帶線程池的方式 咱們公司是用這樣的工具呢 還是用市面上那些開源工具呢? 看是自己寫呢 還能是成形的八爪魚呢 這寫我也都做過了了解。
括号附帶:話術中沒有
(在網絡爬蟲的系統架構中,主過程由控制器,解析器,資源庫三部分組成。
控制器的主要工作是負責給多線程中的各個爬蟲線程配置設定工作任務。
解析器的主要工作是下載下傳網頁,進行頁面的處理,主要是将一些JS腳本标簽、CSS代碼内容、空格字元、HTML标簽等内容處理掉,爬蟲的基本工作是由解析器完成。
資源庫是用來存放下載下傳到的網頁資源,一般都采用大型的資料庫存儲,如Oracle資料庫,并對其建立索引。
常見的反爬政策主要有:
IP限制
UA限制
Cookie限制
資源随機化存儲
動态加載技術
……
對應的反爬處理手段主要有:
IP代理池技術
使用者代理池技術
Cookie儲存與處理
自動觸發技術
抓包分析技術+自動觸發技術)
98、你有沒有做過資料庫模組化,自己設計表和子產品
一個有三年工作經驗的人,一定要說設計過,(實際工作經驗的程式員:在系統設計、需求文檔,資料模組化都應該有所涉及)資料庫模組化就是使用PowerDsiger工具,先分析項目需求,前端先出相應的原型,根據原型,我開始做相應的表,設計初期的時候表會有些小浮動修改等,再根據需求設計詳細字段。如果後期客戶需求改變時,表結構後期跟着調整,就是這樣使用工具不斷完善過程就是模組化。
99、鎖?
Java中的鎖就是線程同步的鎖 ,一般是在方法上面加一個synchroized關鍵字,鎖的對象就是螢幕 ,将目前對象作為鎖定的對象,如果在代碼塊上進行加的話,自己可以指定自己要鎖定的對象,比如說自己可以指定一個字元串,可以當做一個鎖,指定一個類的class可以當做一個鎖,隻要這個鎖的對象是不變的就行了。比如說指定一個類的class來當做一個鎖,那麼一個類的class本身就是不變的,當你在建立對象的時候就需要加載一個類,加載完成類肯定是不變的了。一般可以鎖三種内型:目前對象,放在目前對象的方法上,第二種就是給一個字元串,第三種就是類.class。放在類上可以鎖住一個對象,但是放在對象上肯定不能鎖住一個類。
100、團隊管理?
首先,要讓自己的組員處理好之間的關系,如果有問題的話,在一塊進行解決,有新技術的話一塊分享。就像我上一家項目經理,根據功能點和自己團隊中人水準的高低進行分工,然後我就整個管理一下項目的進度,每天在幹什麼,每天在做什麼,做到哪裡,然後用禅道做一下評估和安排,大概就是這麼做。
101、職業發展規劃?
像自己幹開發這麼長時間了,今後是要往項目經理這方法發展了。我覺得做項目經理肯定要處理好與組員的關系。關系處理好了,這樣大家有問題了共同解決,有新技術了共同分享。公司要是給我們配置設定下任務了。根據組員水準的高低去配置設定任務,分完之後我就每天去管理項目的進度,每天應該該做什麼,進行到哪一步。用project做一下工作量的評估和安排。就像我們上個項目經理他那種人格魅力和人員分工上做的特麼好,我們周末經常去撸串。我覺得我像他那樣做就能做到項目經理。讓下面的組員覺的跟着我幹舒服。這是最主要的。
102、項目描述流程?
首先要介紹項目的背景,項目的技術所用的技術架構,項目中使用的第三方插件要給人介紹。項目後期的維護 測試 釋出 運維是怎麼做的,這些都要與人說清楚。
比如說這個愛普停車系統,他的背景就是現在的北京不僅堵車,而且找一個停車的地方也不好停,是以我們公司就有這個願景,讓使用者用了我們這個愛普的軟體後不管走在北京的哪一個角落,都能找到停車位。
這個是怎麼做的,我們這個項目中就做到了定位,比如說我們去北京中心醫院,我首先通過手機搜尋附近的停車位,随後通過道航進行停車。我們的支付是我負責的子產品,具體是通過車到大停車場之後,幾分鐘之後車輛不動,我就在背景資料庫裡給他定義一個時間,定義好之後。當使用者點結束程序,使用者通過支付寶或微信支付,這就是我們項目的背景。我們公司當初做的時候也就七八個人,因為這個項目的功能點也不是特别的多。三四個寫背景,兩個寫前台,還有些ui的,還有項目經理,這樣七八個人。使用的技術,也就是我們市面上的技術,springMvc spring mybatis。這個項目還用到第三方插件redis solr dubbo。這個項目我們做了六七個月,比如說我們第一個版本上線後出現的去多bug。比如定位不準,多人下訂單時出現問題。比如說我們多人下訂單的時候出現的高并發,我們當初是用acticveMQ消息隊列解決了高并發的問題。當初
我們前端是用appcan寫的。這樣寫的好處是,能在ios和安卓運作。
103、需求文檔設計,接口文檔設計,系統設計文檔?
接口文檔也叫接口api,三要素:url,參數,傳回值。
需求文檔寫過嗎?當然寫過啊。客戶在做需求調研的時候 ,我們也寫過的。需求文檔大概是這樣寫的。比如客戶的那些需求呢理出來,理出來以後呢。
就根據一個功能點來說吧,就拿商品添加這個功能點來說吧,首先有個流程圖要畫出來,就用那個瑞搜,
有開始結束标簽,中間有判斷,首先開始,點選進入到登陸到我們的系統,然後點選新增商品的這個連結,然後有那麼一個操作符,下一步點選這個商品
分類,這是一個操作符,接下來把這個商品分類顯示出來,等等一系列的這個操作,我們要在需求文檔裡面寫出來。流程圖畫完了,我們再說這個過程,
過程呢是分一二三四五六七八這樣的步驟寫下來的,寫完這些步驟以後呢,還有産品得截圖,什麼樣得截圖呢?就是輸出畫面一,輸出畫面二這樣得截圖。
系統設計的寫法是:首先要歸納商品中有哪些功能點,也有系統設計的流程圖,這個流程圖呢就不是需求文檔那個頁面邏輯的流程圖了。是代碼的流程圖。裡面
有規定到我們具體使用的哪個方法,類都要寫清楚了。裡面包括了有哪些字段。比如商品中設計到十幾個字段,那麼這十幾個字段都得寫。以及涉及到的資料庫
表,資料字段都要寫清楚了。
但這是我們原來傳統的項目這樣寫。現在要做的是靈活是開發,客戶那邊直接派人來我們公司駐紮,一些需求啥的我們和客戶現場去定,定好之後就馬上開發,疊加幾個功能點測試,
測試沒問題的話就很快釋出了。
現在就是系統設計需求文檔用的不多了,現在我們用這個現代化的管理工具了,比如springmvc裡面有一些絲襪個第三方api文檔,他可以生成記錄文檔的資訊,就是前台能夠顯示出來的頁面的
展示,類似接口文檔的url,參數,傳回值類型,這個參數幹什麼的那個幹什麼的,原來沒用過這個絲襪個,後來聽我們同僚說用這個,後期我覺得我們公司也會用這個東西,因為寫文檔确實很耗時間的。
104、什麼是RestFull風格架構?
就是一中架構風格,可以直接通過URL通路controller,我們前後端分離的項目不都是采用這樣的方式架構的麼.
105、ActiveMQ消息發送失敗解決方案?
第一種用資料庫配合着解決:
怎麼配合呢咱們這邊不是發送的商品的ID麼,在發送之前把ID記錄在資料庫裡面去,然後設定一個狀态字段,0代表這個消息已經
發送成功。然後存在資料庫裡面,然後我們的狀态就是0,然後就讓往消息的隊列裡面去發去,就是時候我說第一種情況突然斷電了
然後我的消息首先是記錄在資料庫裡面了,然後他的那個狀态是不是為0啊,然後抽個時間用定時器讓晚上的兩點到三點,讓狀态為0
的從新發送一下消息,這樣是不是就可以解決斷電的問題了,第二種我們如何去接受到一個消息,确定這個消息是消費了,這樣也是
用我們的資料庫來解決,如果這個消息消費了我們把這個消息狀态設定為1,然後根據ID去資料庫裡面,把他的狀态設定為1,如果為0就是
他上個消息沒發送的問題了,這個我的消費。如果消費失敗的話,就不會改變他的狀态,還是0呗。這就是消息隊列如何解決消息
同步的問題,還有突然斷電的問題。
第二種解決:
在發送消息的時候設定送出的方式,改成手動送出的方式,在背景改成commit狀态改成手動方式,如果發送成功的話,
然後commit手動送出方式。
106、解釋下dubbo,雲服務,和zookeeper?
問:Zookeeper關掉以後還能使用?還能調用服務?調用服務的時候是不是不經過zookeeper?
答:zookeeper關掉以後還能使用,你先是一個服務,然後注冊到zookeeper,服務消費者第一調用的時候要拿到服務提供者的位址跟端口号。通過位址端口号用rpc可以調用。
不使用zookeeper服務可以調用dubbo架構麼?
可以,Dubbo将注冊中心進行抽象,它可以外接不同的存儲媒介給注冊中心提供服務,有zookeeper,
問:在一個項目裡引用多個服務,怎麼保證你引用的那個服務就是那個服務?
答:你打開不是有監控中心,你可以看服務背景它注冊了多少個服務,消費端有多少個,提供者有多少個。端口号不同,一個服務啟動起來會占用一個端口,而且是一個java jvm的程序。如果一台服務配置設定到兩三台機器,會給負載均衡政策的。
問:負載均衡是怎麼實作的?
答:所謂負載均衡就是對多台伺服器進行流量分發一種服務,可以通過流量分發擴充應用系統對外的服務能力,通過消除單點故障提升應用系統的可用性。
問:用過線程池麼?
答:現在都是了解,真實項目裡面我們現在使用的是中間件,基本不使用線程去完成。
問:線程池怎麼配的?
答:線程池在java裡面有一個Executors,通過 Executors 可以友善的生成不同類型的線程池。但是要更好的了解使用線程池,就需要了解線程池的配置參數意義以及線程池的具體工作機制。
107、給我介紹一下Nginx
(What Nginx是什麼)
對于nginx,它實際上是一個性能很高的http和反向代理伺服器,它特點是記憶體占用少,并發通路能力強,據說BAT(百度 阿裡 騰訊)這些大公司都使用這個技術,是以這個技術在咱們IT這個行業算是比較重要。
對于nginx,其實内容比較多,我還專門從淘寶上看了,有專門的書籍來介紹nginx,(或者說我還專門買了一本書,研究了一下),這裡呢,我就介紹個大概吧。
在nginx源碼層面上呢,它使用的是linux核心提供的一個新的叫做epoll的功能。可以實作單線程支援高并發的連接配接和請求.nginx底層實作,也是c語言的實作,指針這塊用的非常靈活.它的機制是采用了事件驅動機制.之前我們要是解決高并發的話,肯定會第一用多線程,但是這個nginx它的一個主要優勢采用的是單線程異步驅動這種形式來解決高并發,當然,再裡邊我确實還沒有看到.
(Why 為什麼用到nginx)
咱們還是說一下nginx兩大主要的功能吧,一個是反向代理,一個是負載均衡,先說一下這個反向代理,那說反向代理,咱們還得先說一下正向代理,其實咱們平時調試開發都是正向代理,隻不過我們不說這個詞.比如吧,我們通路一台tomcat,預設端口号是8080,那我們通路的時候可能就是localhost:8080,這樣順着來呢,就可以了解成一個正向代理,就這樣了解哈,其實正向代理這個概念呢我查過,嚴格來說呢是位于用戶端和原始伺服器之間的伺服器。
這個時候,如果我們想要再來一台伺服器呢,我們可以配一下,把端口号改成8081,通過通路不同的端口号來通路, 但是當我們項目要上線的時候,如果需要把一個項目如果部署到兩台伺服器上,比如淘寶,這麼大,它的主界面不可能是在一台伺服器上放着,就不能是通路8080或者8081這些端口了,這個時候,需要有一個代理的伺服器,能夠給這兩台伺服器做一個代理,直接不需要進行标明,就可以通路到任意一台伺服器,找到這個主界面。這裡呢,這個代理就可以代理這些伺服器了,這個時候這個代理,我們可以了解成反向代理。反向代理嚴格的概念是通過代理伺服器來接收網路上的請求,然後将請求轉發給内部網路的伺服器。而nginx可以幹這個活,做這個代理,我們可以在nginx中配置端口,ip或者域名指向這些不同端口,甚至不同ip的伺服器。這就是反向代理這個概念。
Nginx還有一個重要的功能叫做負載均衡,我們做伺服器的叢集,怎樣保證叢集中伺服器被均等的進行通路呢,不能說我們認為搭建好了伺服器的叢集它就會均衡的去通路,這個時候我們可以統一的去通路nginx這個伺服器,在nginx的配置資訊中,去配置好這些伺服器,它配置檔案是這樣的,隻要你配上,預設通路的比率就是一樣的,這個就是負載均衡,當然nginx更厲害的是可以配置權重,比如說哈,我兩台伺服器,其中一台性能比另外一個性能好2倍,那我是不是應該通路性能好的伺服器頻率更高一些,咱們就可以在nginx的配置檔案中配置一個weight屬性,指定權重。當然還有其他一些配置的,比如有些伺服器需要整修,那咱們就可以配置某台伺服器暫時down掉,這樣使用者通路的時候,就不會通路到這台伺服器,當修好之後,我們在把這個配置資訊幹掉就行了。
(How 怎麼配置Nginx)
其實,在公司裡開發,我經曆的這幾家都配置了nginx的伺服器,按照規範的做法的話,我們公司裡邊應該是有兩台nginx伺服器,一主一備,在這兩台伺服器上呢,都安裝一個keep的軟體,弄一個腳本,通過keepalive來檢測伺服器是否運作,主機挂了就把服務切到備用的這台上,這樣的話基本就不會出問題了。當然,有的小公司就直接搞一台。挂了就挂了,不過nginx伺服器很少挂,因為它高負載下cpu消耗依然很低
對于nginx配置的話,上家公司倒是配置過一次,我簡單說一下吧。
首先是在伺服器上安裝nginx,這個按照文檔來就行,網上有好多安裝資料,自己也整理了好多安裝文檔,解壓,make編譯,make install安裝,然後./nginx start啟動,nginx安裝算是比較簡單。
然後配置nginx,nginx的配置其實就是配一個核心檔案,在nginx中的conf下有一個nginx.xml,主要是修改這個配置檔案,比如咱們配置反向代理和負載均衡伺服器,配置一個proxy_pass 指向代理伺服器,配一下upstream server指向要通路的ip和端口,這個可以配置多個ip,可以設定weight權重。
108、Nginx使用方法?
nginx就是一個反向代理伺服器麼,當時我們做的時候就是做的一個叢集,就是前台一個頁面配置了6個伺服器,用n做的反向代理,當時我們還配了權重,就是使用n的權重,就是根據伺服器的配置的高低給它設定權重的大小,後期我們設定了一個session共享的一個問題,因為我們項目不是分布式的嘛,我們用的是redis緩存儲存的那個使用者資訊,然後把配置儲存到本地去,然後去本地去配置,再去redis去資料資訊,n大概就是這些東西
如果說的更深入一點的話就是聽運維那邊說的,n也有可能挂掉,當時我們搭建了兩個n,takelaireber發送的一個貯備的n,它是發送的sintill協定,然後實時的去監控主伺服器,互相監控,看這個伺服器是否存活,一旦主伺服器挂掉的話,它的備用伺服器就會馬上啟動起來,我聽運維的說的就是用的這個套路
當時我搭建的時候就是搭建了一個單機版,沒有去搭建主備,你們要是搭配貯備n的話我跟我原來公司的運維要一下那個安裝文檔,然後過來給你搭一個這個主備的,你們公司用到内個nginx了嗎
109、SpringBoot話術?
SpringBoot是我們最近的項目開始啟用的。我個人覺得SpringBoot比以前的SpringMVC更好用,因為他的配置檔案少了。原來SpringMVC的SSM整合的配置檔案特别多,用了SpringBoot之後配置檔案特别少了。我們用SpringBoot時結合的MyBatis去做得,SpringBoot基本上是一些YML檔案,properties檔案,MyBatis全程用的注解方式開發。SpringBoot和SpringMVC用法上大同小異,無非就是少了一些配置檔案。啟動SpringBoot伺服器的時候是他自帶的Tomca和Jetty伺服器,可以通過main方法啟動。配置上越來越簡單。
110、什麼是多線程?在哪裡應用過?
線程就是可執行的代碼段,線程要服務于程序,一個程序有好多個線程,main方法就是主線程,多個線程同時執行就是多線程,線程池就是把準備好的線程放到線程池裡,如果處理請求需要調用線程的時候,就從線程池裡去調用,用完以後再放回到線程池裡,這樣就防止高并發節省資源。
111、用過Junit的斷言嗎?
我們公司有要求做單元測試,但是都是後期補的,有的補全了,有的沒補全,主要是我們公司裡沒有QA,是以這一塊要求的不嚴, 其實斷言就是斷定結果的,就是符合我們預期輸出的結果就傳回true 不符合傳回false 給出錯誤資訊
@Before | 初始化方法 |
@After | 釋放資源 |
@Test | 測試方法,在這裡可以測試期望異常和逾時時間 |
@Ignore | 忽略的測試方法 |
@BeforeClass | 針對所有測試,隻執行一次,且必須為static void |
@AfterClass | 針對所有測試,隻執行一次,且必須為static void |
@RunWith | 指定測試類使用某個運作器 |
@Parameters | 指定測試類的測試資料集合 |
@Rule | 允許靈活添加或重新定義測試類中的每個測試方法的行為 |
@FixMethodOrder | 指定測試方法的執行順序 |
112、你們項目的邊界是什麼?
我們公司的項目邊界都是架構師和項目經理定的,這個我沒參與過.
項目邊界其實就是針對整個項目要完成到什麼程度的一個定義,就是至少需要哪些個功能點啦,達到什麼樣的要求,都可以稱之為項目邊界。
理論:在執行項目的過程中,有兩次機會定義範圍。高端範圍在預定義的項目過程中加以定義。這些範圍聲明有助于建立項目的邊界。收集商業需求時,範圍定義得越詳細越好。如果把範圍看作是一個箱子,那麼高端範圍用來定義箱子的大小和形狀;而需求則定義箱子的内容。
113、你們公司的double注冊中心用的什麼?
用的zookeeper,我們開發的時候用的是1台伺服器,然後上線的時候用的是3台。
114、Redis做得時候用的是幾台伺服器?
我們開發的時候用的是windows版本的redis,然後是部署的時候是部署在linux系統上的,搭建了一個叢集,是搭建了有6台伺服器,6個節點。這6個節點是3主3備。Redis那邊是有一個運作原理,是有一個那個乒乓協定,他們之間是可以發送心跳包,檢測之間的節點是否存活。如果不存活的話,他内部是有一個投票選舉機制,超過半數說這個節點死亡的話,就直接把這個節點排除出去了,然後讓他的從節點工作,之後運維的人員把主節點修複好了,重新部署好了。然後redis會重新發送心跳協定包。差不多就是這個樣子。
115、開發的時候Solr是怎麼用的?
我們當時搭建的時候是搭建了一個Solr叢集,我們搭建的這個叢集的節點是靠的Zookeeper管理的,我們當時搭建的時候是搭建了三個zookeeper,四台Solr伺服器來完成分片式的處理---solrcloud,當其中的一個Tomcat出現異常的時候,其他備用的Tomcat就會啟動,繼續工作,運維再去修複主節點的Tomcat,這樣就不會出現網際網路項目無法通路的情況,是我們開發的時候主備伺服器的政策,
116、項目中有沒有涉及到分庫分表,怎麼拆分的?(MyCat)
MyCat一個新穎的資料庫中間件産品支援mysql叢集,或者mariadb cluster,提供高可用性資料分片叢集。MyCat分片根據其切分規則的類型,分為垂直切分和水準切分我們在項目中用的是水準切分。前端使用者可以把它看作是一個資料庫代理,用MySQL用戶端工具和指令行通路,而其後端可以用MySQL原生協定與多個MySQL伺服器通信,也可以用JDBC協定與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即将一個大表水準分割為N個小表,存儲在後端MySQL伺服器裡或者其他資料庫裡。
它支援MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支援MongoDB這種新型NoSQL方式的存儲,當我們的應用隻需要一台資料庫伺服器的時候我們并不需要Mycat,而如果你需要分庫甚至分表,這時候應用要面對很多個資料庫的時候,就需要對資料庫層做一個抽象,來管理這些資料庫,而最上面的應用隻需要面對一個資料庫層的抽象或者說資料庫中間件就好了,這就是Mycat的核心作用。
是以也可以這樣了解:資料庫是對底層存儲檔案的抽象,而Mycat是對資料庫的抽象。
117、說一下Docker
用過,Docker就是為了縮短代碼從開發、測試到部署、上線運作的周期,能讓項目具備可移植性,易于建構,并易于協作。(通俗一點說,Docker就像一個盒子,裡面可以裝很多物件,如果需要這些物件的可以直接将該大盒子拿走,而不需要從該盒子中一件件的取。比如說我們可以在這個容器裡裝好zookeeper,redis,mysql,tomcat等軟體,用的時候直接用就可以,項目部署的時候,直接把目前的Docker給測試組就可以,或者是運維項目組就行.)
118、你們項目是分布式的,那你有了解過分布式事務麼?
當然有了,因為我們項目比較大通路使用者也比較多,我們把表都用mycat進行拆分了,我們當時拆分的方式是(說下第29題),我們在支付的時候,和下單的時候都用到了分布式事務.比如實時支付吧,一筆支付,是對買家賬戶進行扣款,同時對賣家賬戶進行加錢,這些操作必須在一個事務裡執行,要麼全部成功,要麼全部失敗。而對于買家賬戶屬于買家中心,對應的是買家資料庫,而賣家賬戶屬于賣家中心,對應的是賣家資料庫,對不同資料庫的操作必然需要引入分布式事務。還有就是使用者下單買家在電商平台下單,往往會涉及到兩個動作,一個是扣庫存,第二個是更新訂單狀态,庫存和訂單一般屬于不同的資料庫,需要使用分布式事務保證資料一緻性。我們使用的解決方案是使用支付寶用得那個TCC補償性分布式事務解決方案.
(what TCC是什麼?)
TCC是三個英文單詞的首字母縮寫,分别對應Try、Confirm和Cancel三種操作,這三種操作的業務含義如下:
Try:預留業務資源
Confirm:确認執行業務操作
Cancel:取消執行業務操作
1、Try:嘗試執行業務。
完成所有業務檢查(一緻性)
預留必須業務資源(準隔離性)
2、Confirm:确認執行業務。
真正執行業務
不做任何業務檢查
隻使用Try階段預留的業務資源
3、Cancel:取消執行業務
釋放Try階段預留的業務資源
TCC的原理
我給你用這個賬務拆分為說一下TCC吧,比如說我們賬務拆分的業務場景是,分别位于三個不同分庫的帳戶A、B、C,A賬戶和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被當機的金額解凍掉。
(How TCC 怎麼用的)
Github上有他們的源碼,我們直接把源碼擋下來,安裝到我們本地的倉庫裡,用的時候我們把需要使用分布式事務的代碼,上加上@Compensable注解,裡面還有一些其他的屬性配置上就可以了
119、關于日志處理
日志處理我們使用的是log4j,有一個log4j的配置檔案,可以配置log輸出的位置以及log的輸出形式,并指定内容拼接方式。
對于整個項目,設定了一個全局異常,當出現異常資訊的時候,将異常資訊記錄到log中
Logger logger = LoggerFactory.getLogger(GloableException.class);
logger.error("-------------出錯了------------------");
當有些需要記錄内容的資訊,也可以通過日志檔案進行記錄。
對于使用者登陸日志記錄,我們需要自己封裝一個日志記錄的工具類,可以将使用者登陸的資訊記錄到資料庫中。(具體操作步驟看如下連結)
http://www.cnblogs.com/marcello/articles/4501479.html
120、關于悲觀鎖和樂觀鎖
悲觀鎖思路
解決線程安全的思路很多,可以從“悲觀鎖”的方向開始讨論。
悲觀鎖,也就是在修改資料的時候,采用鎖定狀态,排斥外部請求的修改。遇到加鎖的狀态,就必須等待。
雖然上述的方案的确解決了線程安全的問題,但是,别忘記,我們的場景是“高并發”。也就是說,會很多這樣的修改請求,每個請求都需要等待“鎖”,某些線程可能永遠都沒有機會搶到這個“鎖”,這種請求就會死在那裡。同時,這種請求會很多,瞬間增大系統的平均響應時間,結果是可用連接配接數被耗盡,系統陷入異常。
樂觀鎖思路
這個時候,我們就可以讨論一下“樂觀鎖”的思路了。樂觀鎖,是相對于“悲觀鎖”采用更為寬松的加鎖機制,大都是采用帶版本号(Version)更新。實作就是,這個資料所有請求都有資格去修改,但會獲得一個該資料的版本号,隻有版本号符合的才能更新成功,其他的傳回搶購失敗。這樣的話,我們就不需要考慮隊列的問題,不過,它會增大CPU的計算開銷。但是,綜合來說,這是一個比較好的解決方案。
有很多軟體和服務都“樂觀鎖”功能的支援,例如Redis中的watch就是其中之一。通過這個實作,我們保證了資料的安全。
121、JAVA中常用的加密算法
對于不可逆的加密算法有
MD5和SHA, 通過雜湊演算法進行加密SHA加密比MD5安全性更高,常用SHA-256加密算法。
DES加密算法,對稱加密,用戶端和服務端公用一個key,該key最好是随機生成,對于這種加密算法加密效率高,但是據說24小時以内可以破解。
AES加密算法,不對稱加密算法,通過公鑰加密,私鑰解密,私鑰加密,公鑰驗證簽名。(支付寶) 是目前比較安全的加密算法,但效率偏低。安全性是DES加密算法的1000多倍數。
122、MySQL和Oracle差別
(1) MySQL:中小型資料庫,開源免費,輕便簡單
Orcale:大型資料庫,價格高昂,性能好,支援大并發,大通路量
(2) MySQL:主鍵自增
Orcale:不能主鍵自增
(3)mysql:可以用雙引号包字元串
Orcale:要用單引号
(4)MySQL:分頁關鍵字 limit實作
Orcale:用ROWNUM,實作複雜
123、ERP系統裡主要是幹什麼?
ERP是一種企業資源管理與業務流程管理的計算機系統,對企業内部所有的經營活動,包括采購,财務,人力資源,物料等等的整合,最終達成高效化經營的目的。
124、什麼是接口
前後端互動會用到接口,三要素:URL,參數,傳回值類型,請求方式get,post
125、你們做的這個項目大概有多少接口?
大概有幾百個,涉及到接口三要素的就是接口
126、什麼是政策?
就是解決項目中的問題,solr,redis,等等。
127、你平常和哪幾個部門進行溝通?協調哪些内容?
産品經理:溝通一些業務邏輯、功能點。
測試人員:把一些bug送出到BugFree的平台,有哪些bug然後改一下
128、開發過程中你是如何確定開發的進度和品質的?
一般都是項目經理定的,規定一下項目工作日,根據功能點來估計一下工作日
129、項目中遇到的難點你們是怎麼克服的,有什麼固定的标準流程嗎?
比方說公司要用redis,買一些關于redis實戰的書進行學習,網上也找找關于redis方面的資料進行學習,遇到一些問題問問我們項目組長,技術總監,他們有什麼響應的解決方案,然後自己去解決去。
130、項目疊代是怎麼實作?
項目疊代就是做一些相關的更新什麼,更新完了之後會有一個系統內建測試(SIT測試),測試完了之後再進行上線。
131、記憶體溢出,記憶體洩漏
記憶體溢出指的是jvm記憶體溢出,通過調整堆,棧的大小來解決。
代碼中出現死循環或遞歸調用也會造成記憶體溢出。
記憶體洩漏(Memory Leak)是指程式中己動态配置設定的堆記憶體由于某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導緻程式運作速度減慢甚至系統崩潰等嚴重後果
132、GC過程
再說算法之前,我們來先說一下JVM中的新生代和老年代,新生代就是用來存放剛被new出來的對象,一般情況下占堆的1/3空間。而新生代中又分為
3個區:Eden區java新對象的出生地,當記憶體不夠的時候就會帶有調用MinroGC,對新生代進行回收。
ServivorTo:保留MinroGC一次的幸存對象
ServivorFrom:上次的幸存者,被這次gc的對象
老年代:存放應用程式中生命周期長的記憶體對象
然後,我們的JVM回收算法有4種
第一種:标記-清除法
分為:标記,請除
标記階段:直接在記憶體裡标記無用的對象,然後清除階段直接回收被标記的對象;
缺點:形成記憶體碎片,一些大的對象無法找到足夠的空間而觸發新的垃圾收集動作。
第二種:複制算法:
将記憶體劃分為大小相等的兩塊,當一塊的記憶體用完了,就講還存活的對象複制到另外一塊上面,然後将之前的那塊清理掉
缺點:浪費記憶體太多(對老年代的使用,效率低)
第三種:标記-整理算法
将存活的對象都向一端移動,然後直接清理掉這端邊界以外的記憶體
第四種:分代收集算法:(目前商業虛拟機都采用這個)
根據對象的存活中期的不同将記憶體劃分為幾塊,一般Java堆分為新生代和老年代
新生代:用複制算法 老年代用标記整理算法進行回收
133、App接口開發
1、 由于移動端app一般時不能直接通路資料庫的,是以需要我們Java背景開發接口,供移動端去調用;
2、 App接口的開發一般都是restful風格的接口。就是不需要跳轉頁面,都是直接傳回需要的資料。所有的方法上都需要@ResponseBody注解,把傳回結果轉換成json。是以我們一般用@RestController代替@controller;
3、 因為app接口如果擷取不到想要資料,就很可能發生閃退,是以我們需要在controller中的所有方法中,用try catch捕獲異常,把異常也傳回。
4、 為了讓使用者識别異常,我們一般需要定義一組錯誤編碼。
5、 由于接口比較多,為了友善用戶端處理接口傳回資料,我們定義了一個統一的傳回對象類。裡邊主要包含三個參數:Boolean success,String code,Object data;
6、 安全方面考慮,接口最後都要把http協定轉換成https(http+CA憑證)協定。
7、 在接口的攔截器裡邊,采用對稱加密的方式,進行簽名認證。 對稱加密就是服務端給調用端一個appid和一個appsecret;
8、 接口文檔:接口說明、接口的url,傳入參數、響應參數。
9、 接口自己測試:一般在浏覽器上安裝一個restclient的插件,用這個插件就可以測試。
接口的調試:方法一:手機連接配接公司的内外;方法二:通過Nginx把自己的ip代理到外網。
134、第三方支付
B2C電商的支付,一般由于支付金額比較小,支付比較頻繁,是以一般采用第三方支付,常用的第三方支付有:支付寶、微信、聚合支付、付錢啦等。他們的原理都差不多。都是在點選支付時,直接調用第三方支付接口,傳入appid、appsecret、訂單編号、訂單金額、回調url,直接跳轉到第三方支付頁面,接下來的支付過程,我們都不需要管,支付成功以後,第三方支付平台會直接回調我們的url。給我們傳回:狀态碼、訂單編号、支付流水号三個參數。我們首先根據訂單編号,找到我們的訂單,把支付流水号和狀态碼更新到我們的訂單裡邊。回調url,一般有兩種,一種用同步get方法回調,一種用異步的類似ajax方法回調,同步方法回調,一般是成功以後才會回調,并且隻回調一次,回調成功以後我們可以直接跳轉到我們的支付成功頁面、異步方法回調,一般要求我們傳回一個success字元串,第三方平台如果沒有接受到success,就會認為沒有調用成功,他會重複多次調用。比如支付寶會在25小時之内,調用8次;一般情況下第三方支付都采用第二種方式,因為比較安全,但支付寶是同時采用了兩種。
我之前接觸過一個B2B的電商,他們由于交易金額比較大,第三方支付無法實作,是以是直接和銀行對接。大體上是,首先平台和銀行簽訂合同,銀行為平台開設一個總賬号,當企業在平台注冊以後,平台會為企業調用銀行接口,建立一個子賬号,這個子張号是挂在總賬号下邊的,也是一個在銀行實際存在的賬号,但是,隻能通過外部銀行卡給裡邊轉賬,而不能給外部銀行卡轉出。可以在子行号直接互相轉賬。
135、第三方登入
第三方登入,我的了解就是基于使用者在第三方平台上已有的賬号和密碼來快速完成己方應用的登入或者注冊的功能。遵循一個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,完成登入。這樣一個第三方登入就完成了。
136、關系型資料庫和非關系資料庫的差別?
關系型資料庫是表與表之間有關系比如一對多, 多對一,等值連接配接什麼的,非關系型資料庫就是裡面沒有多張表,沒有什麼關聯
137、docker容器常用的指令
# 鏡像和容器的差別?
- 鏡像可以了解為java類, 容器了解成為java中的對象.
# 指令總結
- 啟動docker指令: systemctl start docker 停止 stop 狀态 status
- 檢視鏡像檔案指令: docker images
- 搜尋鏡像: docker search 搜尋名字
- 拉取鏡像: docker pull 鏡像名字
- 删除鏡像: docker rmi 鏡像Id
- 删除所有鏡像 docker rmi `docker images -q`
- 建立互動式容器: docker run -it --name=mycentos centos:7 /bin/bash
- 退出容器: exit
- 建立了守護式容器: docker run -di --name=mycentos2 centos:7
- 進入守護容器: docker exec -it mycentos2 /bin/bash
- 查詢所有的容器: docker ps -a
- 查詢正在運作的容器: docker ps
- 查詢最後一次運作的容器 docker ps -l
- 查詢已經停止的容器: docker ps -f status=exited
- 啟動容器: docker run 容器id/容器名字
- 檔案複制(主控端與容器檔案的複制): docker cp 本地目錄 容器名稱:目錄 docker cp /usr/local mycentos2:/usr/local
- 目錄挂載(建立容器的時候,把主控端的一個檔案目錄,與容器中的某一個目錄進行映射,達到的目的是我們往主控端的目錄中添加了檔案,他會直接自動複制到對應的容器目錄中,): docker run -di -v /usr/local/myhtml:/usr/local/mh --name=mycentos3 centos:7
- 查詢容器中的ip位址(因為我們後期會建立多個容器,容器與容器之間要進行同行,就得依靠這個IP位址): docker inspect 容器名稱
- 删除容器: docker rm 容器名稱
- 删除全部容器: docker rm `docker ps -a -q`
# 備份和恢複流程
- 備份流程: 容器-->(docker commit yizhigou_nginx mynginx)-->鏡像-->tar壓縮包docker save -o mynginx.tar mynginx
-
- 恢複流程 壓縮包--(docker load -i mynginx.tar)--> 鏡像--(docker run -di --name=yizhigou_nginx -p 80:80 mynginx)-->容器
138、Spring中@Autowired和@Resource的差別?
@Autowired預設的是按照類型進行注入, 如果沒有類型會按照名稱(紅色字型)進行注入.
如果想直接按照名稱注入需要加入@Qualifier("gatheringDao")
@Autowired
@Qualifier("gatheringDao")
private GatheringDao gatheringDao;
@Resource預設的會按照名稱注入,名稱找不着會按照類型來找,如果這裡寫了名稱,就直接按照名稱找了不會按類型找@Resource(name = "aaa")
@Resource
private GatheringDao gatheringDao;
139、你在項目中有沒有使用到mongodb?
用過,在資料量比較大的時候,還有寫入操作比較頻繁的時候,還有資料不是特别重要的情況,因為mongodb有可能會丢資料,比如說商品評論,裡面的資料也不是特别重要,缺一條也無所謂,我們就用的mongodb
140、你的工程是如何操作MongoDB的?
我們使用spring data mongodb
141、在項目的哪些場景下使用MongoDB ?
吐槽 、文章評論 、商品評價.
142、為什麼在吐槽和文章評論中使用Mongodb而不使用mysql?
吐槽和評論都是資料量較大且價值較低的資料,為了減輕mysql的壓力,我們使用mongodb
143、SpringBoot和SpringMVC與springCloud關系?
1.springboot是springmvc的更新版,其實就把springmvc裡的配置檔案,改為全注解的開發
2.SpringCloud通過Springboot把其他的通信元件等等進行了封裝,你如果使用SpringCloud的,那就必須得使用SpringBoot,使用SpringBoot的話不一定非得使用SpringCloud.
144、Solr與ElasticSearch的差別?
他倆的底層都是基于lucene實作的,都是使用的lucene的反向索引實作的,solr在實時建立索引的時候會産生IO阻塞查詢性能會比ElasticSearch差一些,還有就是因為Solr自身不支援分布式,ElasticSearch是實時處理資料,而且預設的支援分布式的,可以組成一個網絡,如果其中一台伺服器當機,會配置設定其他節點工作,可以擴充多台伺服器,是以查詢效率會更快,據說可以處理PB以上級别的資料.
145、redis和mongoDB的差別?
mongodb是非關系型資料庫最像關系型資料庫的一種資料庫,我們一般還是用它當存儲去用,但是Redis是key和value方式存儲的,我們可以把他用來優化項目,把一些頻繁通路的資料存到redis中,不用頻繁的通路資料庫了,給mysql資料庫減輕壓力.
145、關于IK分詞器擴充詞彙實作自動添加使用者搜尋熱詞的方法.你有什麼見解?
所謂熱詞就是使用者經常搜尋到的詞語,我們給他放到自己的分詞器裡當成一個詞進行搜尋,比如說經常說的”大吉大利今晚吃雞”,這樣的詞就可以當做是熱詞,我也沒在項目裡實際的做過,但是我知道在大資料裡有一個wordcount技術可以實作這個熱詞分析,就能給你添加到自定義詞典中.
146、logstash定時任務去執行同步索引庫,每次去讀取掃描表,千萬級别的資料會不會突然當機啊?
Ogstash本來就很吃資源, 如果你做資料同步的伺服器,配置必須得高, 記憶體怎麼也得幾十個G, 現在銀行裡的資料幾乎都是TB級别的記憶體了,是以這個可以用硬體去解決這個問題.還有就是這個資料不一定非得是實時.
147、前後端通過接口調用的時候,接口安全如何做的?
我們使用JJWT做的前後端接口的安全控制,通路我們接口的時候必須通過我們約定好的在head中存放token資訊,判斷這個token資訊是否是我們這個背景給提供的token資訊,token資訊在什麼産生的?是在登入的時候産生的token碼.還有一種情況,使用者初次進入到我們的系統,使用者是沒有登入的,這時候我們跟前台确定一個token碼,前台要給我我們TOken碼+時間戳請求我們背景,我們背景會根據約定好了,進行相應的截取時間戳和token碼,進行相應的判斷.
147、SpringCloud的常用元件挨個介紹一下?
148、面試心得
1.1 面試終極秘籍:笑
笑。大家在面試過程中一定要學會笑。笑可以減少緊張情緒,笑可以緩解尴尬,微可以拉近和面試官的距離。大家記住一點,面試官都讨厭總是面試,他非常希望你能成功。是以不要因為回答不上問題而苦着臉,不要尴尬,尴尬時就傻笑。 |
1.2 給予面試官信心
面試過程中,要對自己有信心,還要讓面試官對你有信心。所有的答案都要給面試官肯定的回答。堅決不能說,可能、或許、好像這樣的詞語。 |
1.3 技術不行業務補
技術的終點是業務,脫離業務的技術,隻能是紙上談兵。技術就是為了實作業務的。技術上總有解決不了的問題,這時候從業務考慮,完全可以用其他方法實作。我們java涉及到的技術點太多了,沒有誰能把不同面試官的所有技術問題都打上來的,現在大家都面臨面試了,沒有那麼多時間去學習了,如果你還糾結于技術的學習,那麼你會發現,技術是永遠學不完的,學的越多,不懂的越多,越學越沒有自信。那麼怎麼辦呢? 一句話:“技術不行,業務補”,針對你的第一個項目,多想想,仔細想想,打好草稿,你的項目是做什麼的,主要業務流程是什麼,你的子產品的獨特性在哪裡,項目主要有哪些使用者,項目的亮點在哪裡,赢利點在哪裡,同類競争網站有哪些。項目的主要架構是什麼樣的,開發過程中遇到了哪些問題,有哪些問題是遺留沒有解決的。等等。首先給自己定一個目标,打一份草稿,這份草稿,可以保證你,面試官一句話不說,你自己介紹項目就能介紹30分鐘以上。可能面試的時候,很多面試官不給你說業務的機會,但是你一定要有所準備,當技術說不上來的時候,就說業務,用業務來描述技術。當然在描述業務的時候,也不能光說業務,在業務中引出技術,隻有說出為什麼在這塊要使用這個技術,使用這個技術做什麼,用它有什麼好處就可以了。 |
1.4 機會不等人-海量面試-一氣呵成
銀行創想,長期招聘不招人; 公司不會一直招人,招夠了就不招了 |
1.5 項目介紹半小時
1、 項目架構 2、 項目架構 |
1.6 傳遞正能量
面試中,成功的最佳辦法,就是不斷給面試官傳遞正能量,告訴面試官, 1、 我能吃苦,我能加班,我能出差。 2、 給我配置設定了任務,我就會積極去解決,不會逃避,不找理由,不找借口,方法總比問題多。隻要用心,就沒有解決不了的問題。 3、 我有很強的學習能力,經常喜歡去網絡上自己學習。 4、 我有很多同行業的朋友,我們經常交流,互相幫助。 5、 我認為技術沒有難不難,隻有會不會,我們這一行業新技術層出不窮,關鍵在于學習力,我對我的學習力還是非常自信的; 6、 這個技術點,如果讓我做,我肯定能做,就是不知道該如何表達。 |
1.7 每個知識點要講透徹,把知識點串起來,不給面試官提問的機會
1.8 準備3個技術點,每次面試都要想辦法講出來,逐漸掌握主動權
1.9 畢業生分享心得
1、那麼為什麼面試官總是比你懂呢?膽大、心細、臉皮厚; 面試時,一定要自信,你掌握的知識點是最新的,是很高大上的,你的知識面是非常廣的,已經站在了市場上開發程式員的80%以上。那麼為什麼面試官總是比你懂呢?不是面試官比你懂,而是他在問,你在答,他可以不懂裝懂。是以隻要你自信點,把你的話術說出來就OK了。面試官聽你說的自信,他就認為你懂了,看你說的不自信,就會認為你也就懂點皮毛。 2、總是有幾個問題,被追問,一問就不知道怎麼回答了怎麼辦? 這個時候可以嘗試引申回答,或者說自己的思路。甚至可以直接告訴面試官,這個問題不太懂。不懂的原因是之前沒有接觸過,但是多年的工作經驗造就了我很強的自學能力,我相信給我1-2天時間,我肯定能掌握這個技術。 3、技術在精,不在多。 如果你的能力有限,記憶力不行,就可以在項目裡少寫幾個技術,但是功能子產品不能少,有很多人,在企業裡邊3-5年,隻做了1-2個項目,用的還知識SSH架構,從來沒有用過springmvc,redis、solr、工作流等,但是他再找工作時,也非常自信,因為他在企業裡邊真正工作過了幾年,他覺得自己的能力就值這個錢。是以如果你的學習能力、記憶能力差,那麼大部分技術,掌握個基礎就可以了,知道他是做什麼的,用它有什麼好處就OK了,隻要找一個技術點,可以掌握的很紮實就可以了。 4、總時被問到底層怎麼辦? 不要想着每個底層問題都說過面試官,這個沒有幾個人能做到,這麼多技術,你學都學不過來,怎麼可能還對底層研究的特别清楚呢。不懂的,就大膽告訴面試官,這個我沒有研究過,但是工作這麼多年,您交給我的任務,我肯定能在合理的時間,甚至比很多人更短的時間内完成。 5、吹的這麼厲害,到了公司做不了怎麼辦? 實際的經驗告訴我們,面試時的問題,和你在工作中遇到的技術,差别大部分時候是差别很大的。之前畢業的學長都告訴我們,面試時問了一大堆,結果到了公司,做的項目中沒有用到幾個高大上的技術,即使使用了,也都是别人已經封裝配置好了,你隻需要直接使用就可以了,并且還有使用的例子。 6、總是被查學曆怎麼辦? 八維的學生,沒有幾個是有學曆的,即使有學曆,也很少能排上用場。能排上用場的也大多數都是找的非專業或者是朋友推薦、實習生等工作。有能力的人,很少有因為學曆原因出問題的。之前有個學生是這樣的。面試邀請上,明确硬性要求必須是“大學計算機相關專業”;這個學生辦的是假學曆,面試過程中,面試官當場百度後, 問;“你這個學曆是14年的大學,但是我網上查到,你這個學校是15年才從大專轉成大學的啊”? 學生答;“您是百度查的吧”; 面試官:“是”; 學生答;“那就對了”; 面試官:“嗯,怎麼就對了?”; 學生官:“之前也有人問過我這個問題,我也不知道怎麼回事,學校申請升本很多年了,有些專業是大學,有些是專科的,我也不知道怎麼回事,我讀大學時,學校告訴我大學比專科會多次2000元學費,我肯定就學大學了啊”; 面試官:"還能這樣,你怎麼上的大學?"; 學生答;“考上的啊,我也不知道怎麼回事”; 之後這個學生就收到了offer,入職時,學生辦理入職手續。hr給了學生一張表,讓學生填寫,hr直接上網去查學生的學曆,問學生:“你的學曆怎麼差不到呢”? 學生答:“您是不是查錯了,再查查”; hr:"還是查不到,你自己查過嗎?"; 學生答:“沒有啊,都是國家給的,我也不太清楚”; hr:“那你明天把原件帶過來吧?”; 學生答:“好”; 結果幾個月過去了,學生一直沒有帶原件過來,hr也沒有再問過。 7、面試了很多家,還是沒有成功?我是不是該降低标準呢? 降低标準可以,但是不能太離譜了,履歷相應要進行修改。工作是自己争取來的,絕對不是請求别人施舍過來的,做軟體的公司都不缺錢,但是絕不會施舍。你履歷包裝1年,企業不給你面試機會,很正常,企業不需要初級的開發人員,企業不缺錢,是希望能招到能幹活的人,而不是不能幹活,還會拖慢進度的人。但是你包裝了3年,有面試機會了,你本來說的還可以,問你要多少錢,你說我要8k,那麼你作為一個面試官你會怎麼想,10K以下的程式員都是初級的,工作3年了,還是一個初級,你敢相信嗎?你會懷疑嗎?。第二個問題,問你期望多少,你說15k,面試官問,能談嗎,10K接受嗎?你說可以。這時候面試官怎麼想?你會相信這是真的嗎?是以,萬事一定要把握一個度。 8、白天面試了一天很累,面試回來就回去休息了,或者打幾把遊戲。背話術時總是走神,心裡總是惦記着遊戲、小說或者電視劇,這樣能被會嗎?是以面試時,一定不能分心。白天去面試,面試必錄音,面試結束後就回學校,回教室,找同學、找老師、百度、聽錄音,把自己面試中遇到的問題,總結一下,彌補自己的不足。這樣,你第二天再去面試時,肯定會更有信心。如果能堅持這樣,面試一次學到至少1個技術點,面試10家以後,還有什麼理由不成功呢。10個技術點不夠,面試20家,是不是就能學到20個知識點,還不夠30、40、50、呢? 隻要我們堅持,不放棄,認證對待。那麼世上無難事,隻怕有心人。 9、有些人有說了,老師我非要找工作嗎?找不到這個工作,我就不行了嗎? 請你想想你來八維花了父母多少錢,父母掙錢容易嗎?人活一輩子,總是要有一段時間吃苦的,與其到老了後悔,不如年輕時經曆了,到以後回憶起來,年輕的一切都是那麼幸福。人必須學會堅持,沒有堅持,有再好的條件,你也很難成功。一但有了第一次放棄,那麼你就可能習慣放棄。當你第一次享受到堅持的果實以後,你就成長了,你就會發現:世上無難事,隻怕有心人。 最後送大家一句話:學校就是你們的家,我就是你們的後盾,面試過程中,一定要經常回學校來做複盤,工作中遇到問題,也要首先想到學校,想到 穆總。沒有任何一所學校能向八維這麼對每一個學生負責,希望大家學會感恩, 穆志軍 |
1.10 面試切忌問題
1、 面試中,切忌懷疑自己:即使說錯了,也要堅持。隻能說,可能是我了解的不夠深,不太了解您的意思,不過這個使用肯定是沒有問題。 2、 面試中,切忌靠大牛:千萬不要說,這個問題是我和另一個大牛一起做的,他主要我輔助這種話。如果不太懂,可以直接說,這個不太了解,之前項目中隻是根據網上的一些方法或者api直接copy做的,或者直接網上找的一個工具類,直接調用。還沒有來的及去深入了解。 3、 面試中,切忌太多的可能、好像、不肯定語句: 面試過程中,你一定要給面試官肯定的答案,會就是會,不會就是不會。不要說太多可能、好像等話。除非你是在說思路。 4、 面試中,不要因為怕自己了解的太淺,而不說:面試過程中,一定要懂多少,就要盡可能的說出來,不要怕說錯,更不要怕追問。被質疑了或者追問了,再說可能了解的不夠深,最好能反過來向面試官請教; 5、 面試中,切忌一問一答方式:把面試一定要當成一場聊天,每個問題就是一個話題,不是面試官在問,你在答,你也可以反問,可以轉移話題,最好的方式是把問題展開來聊,不要局限于問題本身,加入一些業務,加入一些開發中間遇到問題、解決問題的過程。你隻要把面試官聊開心了,你的面試也就成功了。哪怕面試過程中,都是你在請教面試官在答。 6、 面試中,切忌和面試官較真:當然如果你能在面試中,和面試官因為一個問題争吵起來,那麼說明你離面試成功已經很近了,隻要稍微注意謙虛點,讓一讓面試官就OK了。 7、 面試中,切忌懷疑自己說的太low,而不好意思說:面試過程中,要把面試官當成小孩,耐心的給他講解你這個知識點的開發過程,不要把面試官想的太高大上,等面試官的思想和你同步。一定要多說,不厭其煩的說,等面試官不想聽了,去打斷你。 8、 面試中,切忌太長時間的沉默:面試過程中,切完不要和面試官長時間的沉默,當面試官暫停提問,想着接下來問你什麼問題時,一定要主動引起話題。有以下幾個個方法:1、說自己的擅長技術點;2、說自己的項目特色業務;3、說自己最近關注的新技術;4、說工作中遇到的一些問題和解決過程的故事。5、主動想面試官提問(貴公司主要做什麼項目、用什麼架構、主要用到什麼技術、公司的文化、團隊的組成、請假面試官貴姓、什麼職位、招聘人的标準等等) 9、 面試結束後,必問問題:如果自己感覺回到的不太好,可以說:您好,今天的面試我感覺表現的非常差,請問我是不是沒有機會和您共事了,都是做開發的,能不能交個朋友,加個微信呢。 如果自己感覺回答的還可以:就說,您好,如果我有幸能進入咱們公司,那麼您覺得我哪方面需要加強或補充呢。 咱們最快能什麼時間通知我面試結果呢。如果面試官說1-2天,就說:“好,那我就回去等通知了,今天和您聊的很開心,學到了不少東西,很期望和您能成為同僚,無論成功或者失敗,您是否都能給我一個通知呢”。 如果面試官說:3天内或者一周内,那麼就說:“這個能不能稍微快點呢,我之前面試了一家,讓我明(後)天就去入職,就是離我家太遠了,我也不想再多面試了”; |
1.11 面試不能等
1、 現場要offer,如果面試時間在30分鐘以上,自己感覺不錯,一定要現場要offer,讓面試官盡快給答複,要不當天,要不第二天。告訴面試官我已經有了一個offer準備入職;因為好事多磨,面試官可能開始覺得你還不錯,但很可能一會就會有個比你更好的。 2、 複試一定要先拒絕一次,直接問面試官,可不可以馬上進行複試,我可能沒有時間再來參加複試了。 |
posted on
2020-10-28 14:58
周曉楠
閱讀(134)
評論(0)
編輯
收藏
舉報