當前位置:首頁 » 硬碟大全 » 緩存架構面試
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

緩存架構面試

發布時間: 2022-02-01 16:07:06

『壹』 Java軟體工程師的具體職責是什麼

Java軟體工程師運用Java開發工具去完成軟體產品的軟體程序設計、開發、測試、維護升級等工作。具體職責是:

1、按產品或項目要求進行技術開發,能獨立完成模塊分析設計。

2、根據開發規范與流程獨立完成詳細設計,編碼,測試及相關文檔。

3、負責信息系統(如OA、CRM等)持續優化,以及微信企業平台端的開發。

4、負責信息系統的推廣應用,數據管理及日常維護管理。

5、配合信息安全主任做好信息安全保密工作。



任職要求

1、計算機專業本科以上學歷,從事後台系統開發1年以上工作經驗;

2、熟練使用Java/.NET語言開發Web應用,熟悉主流技術框架;

3、熟悉資料庫理論,熟練掌握主流資料庫MySQL、SQL Server等的應用;

4、熟悉HTML、XML、JavaScprit、ajax、Web Servrice等WEB技術;

5、熟悉Linux操作系統者優先;有大型網站/系統開發經驗者優先。

『貳』 馬上就java面試了,不會介紹項目,咋辦我沒做過實際項目,是自學出來的,為了好找工作,我照別人的

沒實際開發過項目,你都敢寫上4,5個,我java干兩年大項目也就做過兩個, 通常干過4,5個的話那就可以面試高工,厲害的就是架構師了

『叄』 面試之mybatis和hibernate的區別

第一章Hibernate與MyBatis

Hibernate是當前最流行的O/R mapping框架,它出身於sf.net,現在已經成為Jboss的一部分。Mybatis是另外一種優秀的O/R mapping框架。目前屬於apache的一個子項目。

MyBatis參考資料官網:http://www.mybatis.org/core/zh/index.html

Hibernate參考資料:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/

1.1 Hibernate簡介

Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO和資料庫表之間的映射,以及SQL的自動生成和執行。程序員往往只需定義好了POJO到資料庫表的映射關系,即可通過Hibernate提供的方法完成持久層操作。程序員甚至不需要對SQL的熟練掌握,Hibernate/OJB會根據制定的存儲邏輯,自動生成對應的SQL並調用JDBC介面加以執行。

1.2 MyBatis簡介

iBATIS的著力點,則在於POJO與SQL之間的映射關系。然後通過映射配置文件,將SQL所需的參數,以及返回的結果欄位映射到指定POJO。 相對Hibernate「O/R」而言,iBATIS是一種「Sql Mapping」的ORM實現。

第二章 開發對比

開發速度

Hibernate的真正掌握要比Mybatis來得難些。Mybatis框架相對簡單很容易上手,但也相對簡陋些。個人覺得要用好Mybatis還是首先要先理解好Hibernate。

開發社區

Hibernate與Mybatis都是流行的持久層開發框架,但Hibernate開發社區相對多熱鬧些,支持的工具也多,更新也快,當前最高版本4.1.8。而Mybatis相對平靜,工具較少,當前最高版本3.2。

開發工作量

Hibernate和MyBatis都有相應的代碼生成工具。可以生成簡單基本的DAO層方法。

針對高級查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者無需關心SQL的生成與結果映射,可以更專注於業務流程。

第三章 系統調優對比

Hibernate的調優方案

  • 制定合理的緩存策略;

  • 盡量使用延遲載入特性;

  • 採用合理的Session管理機制;

  • 使用批量抓取,設定合理的批處理參數(batch_size);

  • 進行合理的O/R映射設計

  • Mybatis調優方案

    MyBatis在Session方面和Hibernate的Session生命周期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級緩存機制。MyBatis可以進行詳細的SQL優化設計。

    SQL優化方面

    Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有性能消耗。Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。

    Hibernate HQL語句的調優需要將SQL列印出來,而Hibernate的SQL被很多人嫌棄因為太丑了。MyBatis的SQL是自己手動寫的所以調整方便。但Hibernate具有自己的日誌統計。Mybatis本身不帶日誌統計,使用Log4j進行日誌記錄。

    擴展性方面

    Hibernate與具體資料庫的關聯只需在XML文件中配置即可,所有的HQL語句與具體使用的資料庫無關,移植性很好。MyBatis項目中所有的SQL語句都是依賴所用的資料庫的,所以不同資料庫類型的支持不好。

    第四章 對象管理與抓取策略

    對象管理

    Hibernate是完整的對象/關系映射解決方案,它提供了對象狀態管理(state management)的功能,使開發者不再需要理會底層資料庫系統的細節。也就是說,相對於常見的JDBC/SQL持久層方案中需要管理SQL語句,Hibernate採用了更自然的面向對象的視角來持久化Java應用中的數據。

    換句話說,使用Hibernate的開發者應該總是關注對象的狀態(state),不必考慮SQL語句的執行。這部分細節已經由Hibernate掌管妥當,只有開發者在進行系統性能調優的時候才需要進行了解。

    而MyBatis在這一塊沒有文檔說明,用戶需要對對象自己進行詳細的管理。

    抓取策略

    Hibernate對實體關聯對象的抓取有著良好的機制。對於每一個關聯關系都可以詳細地設置是否延遲載入,並且提供關聯抓取、查詢抓取、子查詢抓取、批量抓取四種模式。 它是詳細配置和處理的。

    而Mybatis的延遲載入是全局配置的。

    第五章 緩存機制對比

    Hibernate緩存

    Hibernate一級緩存是Session緩存,利用好一級緩存就需要對Session的生命周期進行管理好。建議在一個Action操作中使用一個Session。一級緩存需要對Session進行嚴格管理。

    Hibernate二級緩存是SessionFactory級的緩存。SessionFactory的緩存分為內置緩存和外置緩存。內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定SQL語句等),對於應用程序來說,它是只讀的。外置緩存中存放的是資料庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作為存儲介質外,還可以選用硬碟等外部存儲設備。二級緩存稱為進程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡。

    MyBatis緩存

    MyBatis包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定製。MyBatis 3中的緩存實現的很多改進都已經實現了,使得它更加強大而且易於配置。

    默認情況下是沒有開啟緩存的,除了局部的session緩存,可以增強變現而且處理循環 依賴也是必須的。要開啟二級緩存,你需要在你的SQL映射文件中添加一行: <cache/>

    字面上看就是這樣。這個簡單語句的效果如下:

  • 映射語句文件中的所有select語句將會被緩存。

  • 映射語句文件中的所有insert,update和delete語句會刷新緩存。

  • 緩存會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。

  • 根據時間表(比如no Flush Interval,沒有刷新間隔),緩存不會以任何時間順序 來刷新。

  • 緩存會存儲列表集合或對象(無論查詢方法返回什麼)的1024個引用。

  • 緩存會被視為是read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而 且可以安全地被調用者修改,而不幹擾其他調用者或線程所做的潛在修改。

  • 所有的這些屬性都可以通過緩存元素的屬性來修改。

    比如: <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

    這個更高級的配置創建了一個FIFO緩存,並每隔60秒刷新,存數結果對象或列表的512個引用,而且返回的對象被認為是只讀的,因此在不同線程中的調用者之間修改它們會 導致沖突。可用的收回策略有,默認的是LRU:

  • LRU–最近最少使用的:移除最長時間不被使用的對象。

  • FIFO–先進先出:按對象進入緩存的順序來移除它們。

  • SOFT–軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。

  • WEAK–弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。

  • flushInterval(刷新間隔)可以被設置為任意的正整數,而且它們代表一個合理的毫秒 形式的時間段。默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。

    size(引用數目)可以被設置為任意正整數,要記住你緩存的對象數目和你運行環境的 可用內存資源數目。默認值是1024。

    readOnly(只讀)屬性可以被設置為true或false。只讀的緩存會給所有調用者返回緩 存對象的相同實例。因此這些對象不能被修改。這提供了很重要的性能優勢。可讀寫的緩存 會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認是false。

    相同點

    Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,都可以通過實現你自己的緩存或為其他第三方緩存方案,創建適配器來完全覆蓋緩存行為。

    不同點

    Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,然後再在具體的表-對象映射中配置是那種緩存。

    MyBatis的二級緩存配置都是在每個具體的表-對象映射中進行詳細配置,這樣針對不同的表可以自定義不同的緩存機制。並且Mybatis可以在命名空間中共享相同的緩存配置和實例,通過Cache-ref來實現。

    兩者比較

    因為Hibernate對查詢對象有著良好的管理機制,用戶無需關心SQL。所以在使用二級緩存時如果出現臟數據,系統會報出錯誤並提示。

    而MyBatis在這一方面,使用二級緩存時需要特別小心。如果不能完全確定數據更新操作的波及范圍,避免Cache的盲目使用。否則,臟數據的出現會給系統的正常運行帶來很大的隱患。

    第六章Hibernate與Mybatis對比總結

    兩者相同點

  • Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然後由SessionFactory生成Session,最後由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

  • Hibernate和MyBatis都支持JDBC和JTA事務處理。

  • Mybatis優勢

  • MyBatis可以進行更為細致的SQL優化,可以減少查詢欄位。

  • MyBatis容易掌握,而Hibernate門檻較高。

  • Hibernate優勢

  • Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。

  • Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。

  • Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

  • Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

  • 他人總結

  • Hibernate功能強大,資料庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。

  • Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。

  • iBATIS入門簡單,即學即用,提供了資料庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。

  • iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。

『肆』 java開發工程師必須要學的技術有哪些

學習內容:

初級部分
Java 程序設計基礎,包括 J2sdk基礎、Java面向對象基礎、Java API使用、數據結構及演算法基礎、Java AWT圖形界面程序開發;
J2SE平台Java程序設計,包括Swing圖形程序設計, Socket網路應用程序設計,對象序列化,Java 常用數據結構,Applet,流和文件,多線程程序設計;
Java桌面系統項目開發,4~5人組成一個項目組,項目大小為(15人*工作日);
Linux的基本操作,Linux下的Java程序開發,Linux系統的簡單管理;
Oracle資料庫,包括SQL/PLSQL;資料庫和資料庫設計;簡單掌握ORACLE9i 資料庫的管理;[2]
中級部分
Java Web應用編程,包括 Java Oracle 編程,即JDBC;JavaWeb編程,包括JSP、Servlet,JavaBean;Java應用編程,包括Weblogic、Websphere、Tomcat;以及利用Jbuilder開發Java程序;
MVC與Struts,學習業界通用的MVC設計模式和Struts架構;
Java B/S商務項目開發,4~5人一個項目組,項目大小為(25人*工作日左右)
高級部分
J2ME程序設計,包括J2EE程序、J2ME;Java高級程序設計(J2EE),包括J2EE體系結構和J2EE技術、EJB;Weblogic使用、 JBuilder開發;
Java和XML,包括Java Web Service,JavaXML, 業界主流XML解析器程序設計;
軟體企業規范和軟體工程,包括UML系統建模型和設計(Rational Rose 200x)軟體工程和業界開發規范;CVS版本控制、Java Code書寫規范;
J2EE商務應用系統項目開發,4~5人一個項目組,項目大小為(25人*工作日左右)。
………………………………………………………………………………………………

看你問的問題,應該是對java很感興趣,其實你可以自學java。關於如何學習java,我剛才看到一篇很不錯的文章,是一個農民工介紹自己如何自學java,並找到Java的工作,裡面介紹了他的學習方法和學習過程,希望對你有幫助。
我是一名地地道道的農民工,生活在經濟落後的農村,有一個哥哥和一個弟弟,父母都是地道的農民,日出而作,日落而息,我從小到大學習一直很好,從小學到高一都,成績在全級一直名列前茅,這樣我也順利了考上省的重點高中,然而,每個學期開學是家裡最為難的時候,每次交學費都讓父母發愁許久,家裡為了給我籌錢讀書,都借了不少錢,才讓我讀上高中。我知道我讀到高中家裡已經欠了好多債,為了減輕家裡的負擔,我選擇了退學。
2009年我高一退學,為了給家裡還債,干過建築工地的小工,搞過塑料製品加工,送水工等等。很工資都很低,一個月也就1000多,加上加班費一個月能拿2000多一點,我每個月都向家裡寄回800-1000元,到了2011年末,一次偶然的機會我接觸了Java,聽說Java的前景挺不錯,工資相對於我一個農民工來說簡直是天文數字,於是我在新華書店買了幾本Java的書,盡管白天辛苦工作,晚上回來還是堅持看書,但有於基礎太差很多都很不明白,但還是堅持看,一有看1-2個小時Java的書,看著看著許多基礎都慢慢的學會了,但那些比較難的還是看不懂,後來還買了有些關於框架的書,還是看不懂,這樣斷斷續續的持續了半年多,覺得自己Java的基礎都差不多懂了,但框架還是看不懂,還有最缺的項目經驗,看了很多招聘Java程序員的簡介都要項目經驗,相對我一個農民工來連框架都弄不明白,想找一份Java工作對我來說簡直是奢侈。我只想學Java,並不敢想以後能從事Java的工作。
有一次,在網路上看到一篇讓我很鼓舞的文章,是一個Java高手介紹在沒有基礎的朋友怎麼自學入門Java,文章寫的很好,包含了如何學習,該怎麼學習,他提到一個方法就是看視頻,因為看書實在太枯燥和費解的,不少是我們也看不懂,這點我真的很認同,我自己看書都看了很久才學會基礎。曾經有想過參加培訓,但是上萬元的培訓費讓我望而卻步,我工資這么低,每個月還有向家裡匯錢,加上城市消費比較高,雖然每個月只有幾百剩下,但是相對於上萬萬學費和四個月的吃住費用逼我連想不敢想。 於是我決定看視頻,我就去搜索Java的視頻,雖然我零星的找到一些Java的視頻,但是都不系統。最重要連項目都沒有。後來我找到一份很好的視頻,是IT學習聯盟這個網站一套視頻叫<<零基礎Java就業班>>的教程還不錯,很完整。還贈送11個頂級企業項目。價格很合理,於是我買下來。
於是開始了我的自學Java的路,收到光碟後,我就開始學習,剛開始學習還不錯,是從零基礎教起,老師幽默風趣而又輕松的課堂教課,使我發現原來學習JAVA並不是一件很難的事情。因為我本來基礎還不錯,前面的基礎看一篇我就過去了,到了框架,我覺不又不是很難,可能老師太牛了,他能把復雜的問題講的比較通俗易懂,有些難點的地方我還是連續看了五六次,把他弄懂。每天下午6點下班後,吃了飯,馬上跑回家。看視頻,買了幾本筆記本。當時,為了編程還花幾百元了台二手的台式電腦,配置一般,但編程是足夠的。一邊看視頻,一邊記筆記,把重點都記下來,還一邊跟著老師敲代碼,為了能盡早學會Java。每天都堅持學5-6個小時。經常學到晚上一點多才睡覺。星期六,日不用上班,每天7點多起床,學到晚上11,12點。那段時間特別辛苦,特別累。在學習Java的三個多月里,除了吃飯睡覺工作,剩餘的時間都在學習,因為我知道自己的計算機基礎不是很好,也沒有學過什麼計算機,只是學了些Java基礎,相對於那些科班的人來說我要比他們付出更多的努力。我只能咬緊牙關,堅持下去,我不能放棄,我要完成我的夢想,我要讓我的家人過上好日子。終於三個多月後我把Java教程里的內容和項目都學完了,在學項目的過程中我發現項目特別重要,他能把你學過的知識全部聯系起來,能更好的理解你所學的知識。還有學習過程中,動手很重要,要經常跟著老師動手敲,動手吧,跟著做,一行一行的跟著敲,再試著加一些自己的功能,按照自己的思路敲一些代碼,收獲遠比干聽大的多。 如果遇到暫時對於一些思路不能理解的,動手寫,先寫代碼,慢慢你就會懂了。這套視頻還贈送了11個頂級企業項目,對於我沒有任何經驗的人來說,這個太重要了,還有在學習項目是提升能力最快的方法。項目能把所有的知識點全都連到一起了,不再是分散的,而是形成一個整體了。那種感覺是僅僅深入鑽研知識點而不寫真實項目的人所不能體會的。一個項目就是一根繩子可以把大片的知識串到一起。 就這樣,我用了兩個月也把項目給學完了。其實學完教程差不錯就達到就業水平,但是我可能覺得自己學歷低還是把那11個頂級企業項目才去找工作。
接著我就到51job瘋狂的投簡歷,因為我的學歷問題,初中畢業,說真的,大公司沒有人會要我。所以我頭的都是民營的小公司,我希望自己的努力有所回報。沒有想過幾天後,就有面試了,但是第一次面試我失敗了,雖然我自認為筆試很好,因為我之前做了准備,但是他們的要求比價嚴格,需要有一年的項目經驗,所以我沒有被選中。 後來陸續面試了幾加公司,終於功夫不負有心人,我終於面試上了一家民營的企業。公司規模比較小,我的職務是Java程序員。我想我比較幸運,經理看中我的努力,就決定呂勇我,開的工資是3500一個月,雖然我知道在北京3500隻能過溫飽的生化,但是我想我足夠了,比起以前的工資好了些,以後可以多寄些錢回家。我想只要我繼續努力。我工資一定會翻倍的。 把本文寫出來,希望能讓和我一樣的沒有基礎的朋友有信心,其實我們沒有自卑,我們不比別人笨,只有我們肯努力,我們一樣會成功。

『伍』 php面試題 memcache和redis的區別

Redis與Memcached的區別傳統MySQL+ Memcached架構遇到的問題實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。2.Memcached與MySQL資料庫數據一致性問題。3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。4.跨機房cache同步問題。眾多NoSQL百花齊放,如何選擇最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。Redis適用場景,如何正確的使用前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。2 Redis支持數據的備份,即master-slave模式的數據備份。3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。在Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability = age*log(size_in_memory)」計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存 中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。使用Redis特有內存模型前後的情況對比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。補充的知識點:memcached和redis的比較1 網路IO模型Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。(Memcached網路IO模型)Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。2.內存管理方面Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:/memcached/)。Memcached的客戶端軟體實現非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可以為其配置不同的啟動參數。1.1 Memcache配置Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。1)-p Memcached的TCP監聽埠,預設配置為11211;2)-U Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;3)-s Memcached監聽的UNIX套接字路徑;4)-a 訪問UNIX套接字的八進制掩碼,預設配置為0700;5)-l 監聽的伺服器IP地址,默認為所有網卡;6)-d 為Memcached伺服器啟動守護進程;7)-r 最大core文件大小;8)-u 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;9)-m 分配給Memcached使用的內存數量,單位是MB;10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;11)-c 最大並發連數,預設配置為1024;12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;13)-f 用於設置chunk大小的遞增因子;14)-n 最小的chunk大小,預設配置為48個位元組;15)-t Memcached伺服器使用的線程數,預設配置為4個;16)-L 嘗試使用大內存頁;17)-R 每個事件的最大請求數,預設配置為20個;18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;2. Redis簡介Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字元串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的緩存服務。Redis的安裝非常方便,只需從bin目錄下。在啟動Redis伺服器時,我們需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。php面試題 memcache和redis的區別

『陸』 java三大框架面試題

你只要去弄明白Struts控制頁面跳轉、spring管理映射、hibernate簡化資料庫操作,另外再背一下SSH的基本配置流程就行了,他真要問你深層的緩存之類的東西,你自己說不會就行,面試的傢伙其實很多都是被面試題問參加面試的人的,很多面試官都是虛張聲勢的。
有時我也覺得很有趣,面試官和參加面試的背面試題,這真要看緣分,如果都背一份面試題就好了..

『柒』 voliate怎麼保證可見性

上次我們學習了volatile是如何解決多線程環境下共享變數的內存可見性問題,並且簡單介紹了基於多核CPU並發緩存架構模型的Java內存模型。
詳情見文章:

volatile很難?由淺入深懟到CPU匯編,徹底搞清楚它的底層原理

在並發編程中,有三個重要的特性:

內存可見性
原子性
有序性
volatile解決了並發編程中的可見性和有序性,解決不了原子性的問題,原子性的問題需要依賴synchronized關鍵字來解決。

關於並發編程三大特性的詳細介紹,大家可以點擊下方卡片搜索查看:

搜更多精彩內容

並發編程三大特性

內存可見性在上一篇文章中已經驗證,本文我們繼續通過代碼學習如下內容:1、volatile為什麼解決不了原子性問題?2、緩存行、緩存行填充3、CPU優化導致的亂序執行4、經典面試題:DCL必須要有volatile關鍵字嗎?5、valatile關鍵字是如何禁止指令重排序的?

以上每一步都會有一段代碼來驗證,話不多說,開始輸出干貨!

1、volatile為什麼解決不了原子性問題?

如果你對volatile了解的還可以,那麼咱們繼續往下看,如果不是太熟悉,請先行閱讀上一篇文章。

老規矩,先來一段代碼:

volatile原子性問題代碼驗證

這段代碼的輸出結果是多少?10000?大於10000?小於10000?

程序執行10次輸出的結果如下:

join:10000
join:10000
join:10000
join:9819
join:10000
join:10000
join:10000
join:9898
join:10000
join:10000
會有小幾率的出現小於10000的情況,因此volatile是無法保證原子性的,那麼到底在什麼地方出問題了呢?
還是用上篇文章的圖來說明一下程序的整體流程:

當線程1從內存讀取num的值到工作內存,同時線程2也從內存讀取num的值到工作內存了,他倆各自操作自己的num++操作,但是關鍵點來了:

當線程1、2都執行完num++,線程1執行第五步store操作,通過匯流排將新的num值寫回內存,刷新了內存中的num值,同時觸發了匯流排嗅探機制,告知線程2其工作內存中的num不可用,因此線程2的num++得到的值被拋棄了,但是線程2的num++操作卻是執行了。

2、CPU緩存行

寫上篇文章的時候,有朋友問到了CPU的三級緩存以及緩存行相關的問題,然後我就找了一些資料學習,形成了下面的一張圖:

CPU緩存行

CPU和主內存RAM之間會有三級緩存,因為CPU的速度要比內存的速度要快的多,大概是100:1,也就是CPU的速度比內存要快100倍,因此有了CPU三級緩存,那為什麼是三級緩存呢?不是四級、五級呢?四個大字送給你:工業實踐!相關概念:

ALU:CPU計算單元,加減乘除都在這里算
PC:寄存器,ALU從寄存器讀取一次數據為一個周期,需要時間小於1ns
L1:1級緩存,當ALU從寄存器拿不到數據的時候,會從L1緩存去拿,耗時約1ns
L2:2級緩存,當L1緩存里沒有數據的時候,會從L2緩存去拿,耗時約3ns
L3:3級緩存,一顆CPU里的雙核共用,L2沒有,則去L3去拿,耗時約15ns
RAM內存:當緩存都沒有數據的時候,會從內存讀取數據
緩存行:CPU從內存讀取數據到緩存行的時候,是一行一行的緩存,每行是64位元組(現代處理器)
問題來了:

1、緩存行存在的意義?好處是什麼?

空間的考慮:一個地址被訪問,相連的地址很大可能也被訪問;

時間的考慮:最近訪問的會被頻繁訪問好處:比如相連的地址,典型的就是數組,連續內存訪問,很快!

2、緩存行會帶來什麼問題?

緩存行會導致緩存失效的問題,從而導致程序運行效率低下。例如下圖:

當x,y兩個變數在一個緩存行的時候:

1、線程1執行x++操作,將x和y所在的緩存行緩存到cpu core1裡面去,

2、線程2執行y++操作,也將x和y所在的緩存行緩存到cpu core2裡面去,

3、線程1執行了x++操作,寫入到內存,同時為了保證cpu的緩存一致性協議,需要使其他內核x,y所在的緩存行失效,意味著線程2去執行y++操作的時候,無法從自己的cpu緩存拿到數據,必須從內存獲取。

這就是緩存行失效!

一段代碼來驗證緩存行失效的問題:

緩存行失效常式

耗時:2079ms
這個時候我們做一個程序的改動,在x變數的前面和後面各加上7個long類型變數,如下:

再次運行,看耗時輸出:

耗時:671ms
大約三倍的速度差距!

關於緩存行的更多概念,大家也可以點擊下方卡片直接搜索更多信息:

搜更多精彩內容

緩存行

3、CPU優化導致的亂序執行

上文在說緩存行的時候,主要是因為CPU的速度大約是內存的速度的100倍,因此CPU在執行指令的時候,為了不等待內存數據的讀取,會存在CPU指令優化而導致亂序執行的情況。

看下面這段代碼:

cpu亂序執行常式

執行後輸出(我執行了900多萬次才遇到x=0,y=0的情況,可以試試你的運氣哦~):

因為CPU的速度比內存要快100倍,所以當有兩行不相關的代碼在執行的時候,CPU為了優化執行速度,是會亂序執行的,所以上面的程序會輸出:x=0,y=0的情況,也就是兩個線程的執行順序變成了:

x = b;
y = a;
a = 1;
b = 1;
這個時候我們就需要加volatile關鍵字了,來禁止CPU的指令重排序!

4、DCL單例模式需要加volatile嗎?

一道經典的面試題:DCL單例模式需要加volatile欄位嗎?先來看DCL單例模式的一段代碼:

DCL單例模式

DCL全稱叫做Double Check Lock,就是雙重檢查鎖來保證一個對象是單例的。

核心的問題就是這個INSTANCE變數是否需要加volatile關鍵字修飾?答案肯定是需要的。

首先我們來看new一個對象的位元組碼指令:

查看其位元組碼指令:

NEW java/lang/Object
DUP
INVOKESPECIAL java/lang/Object.<init> ()V
ASTORE 1
即:

1、創建並默認初始化Object對象;

2、復制操作數棧對該對象的引用;

3、調用Object對象的初始化方法;

4、將變數Object o指向創建的這個對象,此時變數o不再為null;

根據上文描述我們知道因為CPU和內存速度不匹配的問題,CPU在執行命令的時候是亂序執行的,即CPU在執行第3步初始化方法時候如果需要很長的時間,CPU是不會等待第3步執行完了才去執行第4步,所以執行順序可能是1、2、4、3。

那麼繼續看DCL單常式序,當線程1執行new DCLStudy()的順序是先astore再invokespecial,但是invokespecial方法還沒有執行的時候,線程2進來了,這個時候線程2拿到的就是一個半初始化的對象。

因此,DCL單例模式需要加volatile關鍵字,來禁止上述new對象的過程的指令重排序!

valatile關鍵字是如何禁止指令重排序的

JVM規范中規定:凡是被volatile修飾的變數,在進行其操作時候,需要加內存屏障!

JVM規范中定義的JSR內存屏障定義:

LoadLoad屏障:
對於語句Load1;LoadLoad;Load2;Load1和Load2語句不允許重排序。
StoreStore屏障:
對於語句Store1;StoreStore;Store2;Store1和Store2語句不允許重排序。
LoadStore屏障:
對於語句Load1;StoreStore;Store2;Load1和Store2語句不允許重排序。
StoreLoad屏障:
對於語句Store1;StoreStore;Load2;Store1和Load2語句不允許重排序。
JVM層面volatile的實現要求:

如果對一個volatile修飾的變數進行寫操作:

前面加StoreStoreBarrier屏障,保證前面所有的store操作都執行完了才能對當前volatile修飾的變數進行寫操作;

後面要加StoreLoadBarrier,保證後面所有的Load操作必須等volatile修飾的變數寫操作完成。

如果對一個volatile修飾的變數進行讀操作:

後面的讀操作LoadLoadBarrier必須等當前volatile修飾變數讀操作完成才能讀;

後面的寫操作LoadStoreBarrier必須等當前的volatile修飾變數讀操作完成才能寫。

上篇文章我們通過一定的方式看到了程序執行的volatile修飾的變數底層匯編碼:

0x000000010d3f3203: lock addl $0x0,(%rsp) ;*putstatic flag
; - com.java.study.VolatileStudy::lambda$main$1@9 (line 31)
也就是到CPU的底層執行的命令其實就是這個lock,這個lock指令既完成了變數的可見性還保證了禁止指令充排序:

LOCK用於在多處理器中執行指令時對共享內存的獨占使用。它的作用是能夠將當前處理器對應緩存的內容刷新到內存,並使其他處理器對應的緩存失效;另外還提供了有序的指令無法越過這個內存屏障的作用。
end

至此,對volatile的學習就到這里了,通過兩篇文章來對volatile這個關鍵字有了一個系統的學習。

學無止境,對volatile的學習還只是一個基礎學習,還有更多的知識等待我們去探索學習,例如:

什麼是as-if-serial?什麼是happens-before?
Java的哪些指令可以重排序呢?重排序的規則是什麼?
我們下期再見!

1372閱讀
搜索
java自學一般要學多久
volatile底層原理
匯編111條指令詳解
java必背100源代碼
volatile架構圖
嵌入式volatile詳解

『捌』 面試官要求我研究一個Java緩存框架,哪個比較好

緩存框架有ehcache、redis、memcached
現在大公司用的比較多的是memcached和redis,這也是分布式系統開發中常用的緩存中間件
個人比較推薦用redis,因為redis對於可支持的數據類型比memcached要多,而且redis是一個可持久化的緩存框架,在使用的時候還可以嘗試搭建redis集群環境。
如果你對redis深入研究,相信你的面試官會很樂意要你的。

『玖』 阿里巴巴資深java工程師什麼水平

你好,如阿里網路騰訊等互聯網大廠的工程師,資深(架構師水平)工程師是非常有實力的。

以阿里為例:

1、阿里工程師崗位職級

阿里巴巴集團採用雙序列職業發展體系:

一套體系是專家路線【P序列=技術崗】,程序員、工程師,某一個專業領域的人才,一共分為14級,從P1到P14,目前校招最低從P4開始。

一套體系是M路線,即管理者路線【M序列=管理崗】,從M1到M10。

考核因素是上一年的績效分數+直屬領導的打分+晉升委員會打分,這里的委員會一般由直屬領導+合作方的高管+懂業務的HRG組成。HRG:HR多面手,base在業務下面,在阿里話語權比別的互聯網HR高。

晉升標准:績效滿足3.75、主管提名、技術答辯通過。


P8架構師作為阿里「IT架構靈魂人物」的角色,他們不僅做著架構師的本職工作,還同時做程序開發,寫核心代碼的工作。另外,架構師依舊是技術高手,編程能力依然是一流的。

但根據當前的市場需求,互聯網大廠們對於普通Java開發人才需求逐年銳減,而對互聯網架構師人才的需求招聘量已經上升到50%,因此薪資更是不可同日而語。

對於想學習互聯網架構師的同學來說,北大青鳥、課工場等優秀品牌都是不錯的選擇。課程根據招聘需求制定,包含全部分布式微服務技術,對標阿里P8級別架構師。



希望我的回答對你有所幫助!