CAS,全稱爲Compare and Swap,即比較-替換。假設有三個操做數:內存值V、舊的預期值A、要修改的值B,當且僅當預期值A和內存值V相同時,纔會將內存值修改成B並返回true,不然什麼都不作並返回false。固然CAS必定要volatile變量配合,這樣才能保證每次拿到的變量是主內存中最新的那個值,不然舊的預期值A對某條線程來講,永遠是一個不會變的值A,只要某次CAS操做失敗,永遠都不可能成功。html
1.項目多大,分爲多少個系統,項目幾我的作的,大概作了多長時間mysql
答:項目分爲先後臺:nginx
前臺:門戶、商品搜索、商品詳情、購物車、用戶中心、單點登陸、訂單系統、支付系統等。web
後臺:商家管理系統,運營商管理系統,財務管理系統ajax
後臺:商品管理、活動管理、商品推薦、訂單管理、CMS、CRM、採購管理、WMS、財務管理、統計報表、系統管理、網絡管理。redis
項目是10-20人作的(在這個範圍裏選一個具體值),大概作了6-8個月(選具體值)。算法
2.前臺和後臺是分開的麼?先後臺數據是如何交互的。spring
答:先後臺分離,數據交互用的是ajax和http協議。sql
3.數據庫如何與redis同步?緩存須要去更新麼?如何刪除redis中的數據?其餘地方有用到過redis麼?數據庫
答:redis和mysql數據的同步,代碼級別大體能夠這樣作: 讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis 寫: 寫mysql->成功,寫redis
應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入mysql,此種狀況存在的問題主要是如何保證mysql與redis的數據同步,兩者數據同步的關鍵在於mysql數據庫中主鍵,方案是在redis啓動時去mysql讀取全部表鍵值存入redis中,往redis寫數據...
他們兩個之間沒有直接同步的方法,這個依賴於你的架構設計 1,插入時同步,好比先更新了oracle,再更新redis,這個要靠代碼邏輯來作。誰先誰後得看設計了。 2,查詢時同步,這時你的redis是作緩存來用,那麼它的更新依賴於你設定的邏輯
緩存通常不須要更新,若是有內容改變,經過主鍵來進行覆蓋。
用redis來生成惟一主鍵,用redis來存儲購物車信息。
4.Redis存儲的數據結構有哪些?
答: String類型是redis中默認的類型,對於任何沒有指定「類型」的數據結構,都是string.
list是一種最經常使用的線性存儲結構,基於list的各類優化算法也不少,redis使用list來存儲一些對插入順序/排序有要求的數據;同時由於list是一種最輕量級的數據結構,並且當list中數據較少時,其查詢複雜度接近o(1),所以對於一些hash結構,數據較少時redis也使用了list來表示它們。
Set經常使用來存儲不重複數據的數據結構,底層基於hashtable。
sortedset(zset):排序集合,集合中每一個元素都有「權重」。
Hsah。
5.前臺集羣搭了幾臺服務器,網站的併發量多大?
網站的併發量在1000之內。
6.後臺保存商品的時候圖片存儲在哪?fastDFS怎麼存儲?圖片服務器宕機如何處理?
答:FastDFS圖片服務器,它是用c語言編寫的一款開源的分佈式文件系統。
FastDFS架構包括 Tracker server和Storage server。客戶端請求Tracker server進行文件上傳、下載,經過Tracker server調度最終由Storage server完成文件上傳和下載。
使用nginx搭建集羣,若是所有宕機,重啓。
7.從服務器如何判斷主服務器是否宕機?3
答:爲了屏蔽負載均衡服務器的宕機,須要創建一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,經過傳送諸如「I am alive」這樣的信息來監控對方的運行情況。當備份機不能在必定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到「I am alive」這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
8.前臺作過靜態頁面麼?Freemark如何生成靜態頁面?生成模板的命令?
答:作過。
第一步:建立一個Configuration對象,直接new一個對象。構造方法的參數就是freemarker對於的版本號。
第二步:設置模板文件所在的路徑。
第三步:設置模板文件使用的字符集。通常就是utf-8.
第四步:加載一個模板,建立一個模板對象。
第五步:建立一個模板使用的數據集,能夠是pojo也能夠是map。通常是Map。
第六步:建立一個Writer對象,通常建立一FileWriter對象,指定生成的文件名。
第七步:調用模板對象的process方法輸出文件。
第八步:關閉流。
@Test public void genFile() throws Exception { // 第一步:建立一個Configuration對象,直接new一個對象。構造方法的參數就是freemarker對於的版本號。 Configuration configuration = new Configuration(Configuration.getVersion()); // 第二步:設置模板文件所在的路徑。 configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl")); // 第三步:設置模板文件使用的字符集。通常就是utf-8. configuration.setDefaultEncoding("utf-8"); // 第四步:加載一個模板,建立一個模板對象。 Template template = configuration.getTemplate("hello.ftl"); // 第五步:建立一個模板使用的數據集,能夠是pojo也能夠是map。通常是Map。 Map dataModel = new HashMap<>(); //向數據集中添加數據 dataModel.put("hello", "this is my first freemarker test."); // 第六步:建立一個Writer對象,通常建立一FileWriter對象,指定生成的文件名。 Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html")); // 第七步:調用模板對象的process方法輸出文件。 template.process(dataModel, out); // 第八步:關閉流。 out.close(); } |
9.作集羣的時候用的服務器?Nignx如何使用?
答:用的tomcat+nignx。Nginx的配置文件:/usr/local/nginx/conf/nginx.conf
10.Spring中AOP的應用場景?Aop原理、好處?Spring中IOC的做用?對象建立的過程。
答:AOP適合於那些具備橫切邏輯的應用:如性能監測,訪問控制,事務管理、緩存、對象池管理以及日誌記錄。
一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼。
Aop好處:將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,咱們但願能夠將它們獨立到非指導業務邏輯的方法中,進而改變這些行爲的時候不影響業務邏輯的代碼。
Ioc做用:解耦合,使用對象的時候不用在代碼裏每次都new一個對象,而是把對象的建立交給spring容器來管理。
建立對象的過程:當在main方法中建立對象時,JVM會先去方法區下找有沒有所建立對象的類存在,悠久建立,沒有就把該類加載到方法區;在建立類的對象時,首先去堆內存中開闢一塊空間,開闢完空間後分配該空間,當空間分配完成後,加載對象中全部的非靜態成員
變量到該空間下,全部的非靜態變量加載完成後,對全部的非靜態變量進行初始化,初始化完成後,調用相應的構造方法到棧中,在棧中執行構造函數時,先執行隱式,再執行構造方法中的代碼。
11.Spring常見建立對象的註解?
答:@Component web層 @Controller :業務層 @Service:持久層 @Repository
12.什麼是存儲過程?好處?
答:存儲過程能夠說是一個記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法同樣實現一些功能(對單表或多表的增刪改查),而後再給這個代碼塊取一個名字,在用到這個功能的時候調用他就好了。
好處:1.因爲數據庫執行動做時,是先編譯後執行的。然而存儲過程是一個編譯過的代碼塊,因此執行效率要比T-SQL語句高。2.一個存儲過程在程序在網絡中交互時能夠替代大堆的T-SQL語句,因此也能下降網絡的通訊量,提升通訊速率。3.經過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。
13.所作模塊有什麼功能?
後臺管理系統:管理商品、訂單、類目、商品規格屬性、用戶管理以及內容發佈等功能。
前臺系統:用戶能夠在前臺系統中進行註冊、登陸、瀏覽商品、首頁、下單等操做。
會員系統:用戶能夠在該系統中查詢已下的訂單、收藏的商品、個人優惠券、團購等信息。
訂單系統:提供下單、查詢訂單、修改訂單狀態、定時處理訂單。
搜索系統:提供商品的搜索功能。
單點登陸系統:爲多個系統之間提供用戶登陸憑證以及查詢登陸用戶的信息。
14.所作模塊用到多少張表?表與表之間的關係?
15.Shiro如何進行權限控制。
1.經過瀏覽器訪問路徑,配置文件查看,是否須要認證等,若是不須要,直接訪問controller
2.若是須要認證,經過配置文件的loginUrl,跳到這個地址,輸入用戶名、密碼等
3.登陸:1.訪問自定義的form表單過濾器FormAuthenticationFilter(本身起的名字和shiro同樣了,因此。。)的createToken方法,裝配token;若是沒有自定義表單過濾器,默認的FormAuthenticationFilter會自動裝配表單token2.訪問自定義realms的認證方法doGetAuthenticationInfo(),查庫(或者緩存),判斷用戶名和密碼是否正確。
4.若是登陸以後訪問的url,經過1配置文件裏的配置須要權限:調用自定義realms的受權方法:doGetAuthorizationInfo(),查庫(或者緩存),查出用戶權限,判斷是否擁有權限,沒權訪問,跳到響應的refuse配置的路徑,有權訪問,跳到響應的url
16.activeMQ的做用、原理?幾種模式,每種的特色及使用問題?在項目中如何應用?
答:Activemq的做用就是系統之間進行通訊。固然可使用其餘方式進行系統間通訊,若是使用Activemq的話能夠對系統之間的調用進行解耦,實現系統間的異步通訊。
原理就是生產者生產消息,把消息發送給activemq。Activemq接收到消息,而後查看有多少個消費者,而後把消息轉發給消費者,此過程當中生產者無需參與。消費者接收到消息後作相應的處理和生產者沒有任何關係。
Activemq在項目中主要是完成系統之間通訊,而且將系統之間的調用進行解耦。例如在添加、修改商品信息後,須要將商品信息同步到索引庫、同步緩存中的數據以及生成靜態頁面一系列操做。在此場景下就可使用activemq。一旦後臺對商品信息進行修改後,就向activemq發送一條消息,而後經過activemq將消息發送給消息的消費端,消費端接收到消息能夠進行相應的業務處理。
17.redis爲何能夠作緩存?項目中使用redis的目的是什麼?redis何時使用?
答:1)Redis是key-value形式的nosql數據庫。能夠快速的定位到所查找的key,並把其中的value取出來。而且redis的全部的數據都是放到內存中,存取的速度很是快,通常都是用來作緩存使用。2)項目中使用redis通常都是做爲緩存來使用的,緩存的目的就是爲了減輕數據庫的壓力提升存取的效率。3)在互聯網項目中只要是涉及高併發或者是存在大量讀數據的狀況下均可以使用redis做爲緩存。固然redis提供豐富的數據類型,除了緩存還能夠根據實際的業務場景來決定redis的做用。例如使用redis保存用戶的購物車信息、生成訂單號、訪問量計數器、任務隊列、排行榜等。還可使用redis來生成惟一主鍵。
18.solr的原理?分詞器的原理?
答:Solr是基於Lucene開發的全文檢索服務器,而Lucene就是一套實現了全文檢索的api,其本質就是一個全文檢索的過程。全文檢索就是把原始文檔根據必定的規則拆分紅若干個關鍵詞,而後根據關鍵詞建立索引,當查詢時先查詢索引找到對應的關鍵詞,並根據關鍵詞找到對應的文檔,也就是查詢結果,最終把查詢結果展現給用戶的過程。
IK分析器的分詞原理本質上是詞典分詞。如今內存中初始化一個詞典,而後在分詞過程當中逐個讀取字符,和字典中的字符相匹配,把文檔中的全部的詞語拆分出來的過程。
19.商品模塊用到幾張表?表與表之間的關係?
答:
用於存儲商品基本信息,商品自定義屬性。
某一種商品可能有多種規格,那麼每一種規格就是一個貨品。如某某襯衫是一個商品,他可能存在L號及白色和S號白色兩種貨品。
這個表是爲了定義多個庫房的貨品庫存狀況,其中depotid字段es_depot(庫房表)關聯。
此表定義了商品的分類。
類型和類別不一樣,類型定義了商品的特性,如手機有「網絡制式」、「機身內存」、「屏幕尺寸」等等屬性和參數,還要定義其「摩托羅拉」或是「諾基亞」的品牌,屬性和參數的字段是props、params。
商品的類型品牌表
詳細內容請看:https://wenku.baidu.com/view/90f2501a25c52cc58ad6be06.html
20.秒殺功能可否與正常的商品購買放在同一臺服務器上?
答:能夠,可是儘可能不要這麼作。由於秒殺商品,搶購的用戶會比較多,併發量太高容易引發宕機,致使正常購買商品功能也不能正常使用,因此建議放在不一樣服務器上。
21.activeMQ若是數據提交不成功怎麼辦?
答:Activemq有兩種通訊方式,點到點形式和發佈訂閱模式。若是是點到點模式的話,若是消息發送不成功此消息默認會保存到activemq服務端直到有消費者將其消費,因此此時消息是不會丟失的。
若是是發佈訂閱模式的通訊方式,默認狀況下只通知一次,若是接收不到此消息就沒有了。這種場景只適用於對消息送達率要求不高的狀況。若是要求消息必須送達不能夠丟失的話,須要配置持久訂閱。每一個訂閱端定義一個id,在訂閱是向activemq註冊。發佈消息和接收消息時須要配置發送模式爲持久化。此時若是客戶端接收不到消息,消息會持久化到服務端,直到客戶端正常接收後爲止。
--------------------- 本文來自 fulai0_0 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/fulai0_0/article/details/52127320?utm_source=copy
''22.reids在項目中如何使用?做用是什麼?
答:redis中存儲的都是key-value格式的。拿商品數據來講,key就是商品id,value是商品相關信息的json數據。
在商城系統中當併發量比較高,頻繁的對數據庫進行讀操做的時候都須要添加緩存。例如頁面中內容數據的緩存、商品數據的緩存以及用戶數據的緩存等。
作商品數據的緩存時,由於商品的數據量很大,並且緩存是把數據保存到內存中,此時不可能把全部的商品數據都放到緩存中。因此須要設置商品數據緩存的有效期,當用戶訪問到非熱點數據後,此數據放到緩存中,當緩存到期後就從緩存中刪除,並且長時間不會添加到緩存。而熱點數據一旦從緩存中刪除會立刻又添加到緩存。這樣能夠提升緩存的利用率,同時也減輕了數據庫的壓力。
23.redis是內存數據庫,若是宕機了,如何解決數據丟失的問題?
答:方案一:redis擁有兩種不一樣形式的持久化方法,它們均可以用小而緊湊的格式將存儲在內存中的數據寫入硬盤:第一種持久化方法爲時間點轉儲,轉儲操做既能夠在「指定時間段內有指定數量的寫操做執行」這一條件被知足時執行,又能夠經過條用兩條轉儲到硬盤中命令中的任何一條來執行;第二種持久化方法將全部修改了數據庫的命令都寫入一個只追加文件裏面,用戶能夠根據數據的重要程度,將只追加寫入設置爲從不一樣步、每秒同步一次或者每寫入一個命令就同步一次。
方案二:使用redis集羣。Redis實現了主從複製的特性:執行復制的從服務器會鏈接上主服務器,接受主服務器發送的整個數據庫的初始副本;以後主服務器執行的寫命令,都會被髮送給全部鏈接着的從服務器去執行,從而實時地更新從服務器的數據集。由於從服務器包含的數據會不斷地進行更新,因此客戶端能夠向任意一個從服務器發送讀請求,以此來避免對主服務器進行集中式的訪問。
24.單點登陸具體實現了什麼功能?
答:去登錄頁面,提交登錄頁面,用戶名、密碼、驗證碼的校驗,錯誤信息的回顯,保存用戶到Session中,重定向到登錄以前的訪問頁面,Ajax跨域判斷用戶是否登錄
25.商品存入數據庫怎麼保證數據庫數據安全?
答:1)對用戶安全管理
用戶操做數據庫時,必須經過數據庫訪問的身份認證。刪除數據庫中的默認用戶,使用自定義的用戶及高強度密碼。
2)定義視圖
爲不一樣的用戶定義不一樣的視圖,能夠限制用戶的訪問範圍。經過視圖機制把須要保密的數據對無權存取這些數據的用戶隱藏起來,能夠對數據庫提供必定程度的安全保護。實際應用中常將視圖機制與受權機制結合起來使用,首先用視圖機制屏蔽一部分保密數據,而後在視圖上進一步進行受權。
3)數據加密
數據加密是保護數據在存儲和傳遞過程當中不被竊取或修改的有效手段。bcrypt 加密 在須要加密的數據中加鹽
4)數據庫按期備份
5)審計追蹤機制
審計追蹤機制是指系統設置相應的日誌記錄,特別是對數據更新、刪除、修改的記錄,以便往後查證。日誌記錄的內容能夠包括操做人員的名稱、使用的密碼、用戶的IP地址、登陸時間、操做內容等。若發現系統的數據遭到破壞,能夠根據日誌記錄追究責任,或者從日誌記錄中判斷密碼是否被盜,以便修改密碼,從新分配權限,確保系統的安全。
26.第一個是當兩個客戶同時買一件商品時庫存只有一個了,怎麼控制?
答:可使用mysql的行鎖機制,實現樂觀鎖,在更新商品以前將商品鎖定,其餘用戶沒法讀取,當此用戶操做完畢後釋放鎖。當併發量高的狀況下,須要使用緩存工具例如redis來管理庫存。