今天面試的時(shí)候,被問(wèn)到跟你類似的問(wèn)題,上網(wǎng)搜一下只搜到這個(gè)問(wèn)題,就來(lái)說(shuō)一下我的情況吧。
我的想法和其他人也一直,就是在保證入庫(kù)的前提下(也就是事務(wù)完成之后)再進(jìn)行緩存的更新,或者對(duì)緩存進(jìn)行CAS校驗(yàn)。
但是面試官說(shuō),這樣做無(wú)疑增加了開發(fā)的復(fù)雜性,因?yàn)榘迅戮彺婧蛯?shí)際業(yè)務(wù)邏輯分離了,有沒(méi)有更好的方法。
我覺(jué)得他說(shuō)的也對(duì),但最后也沒(méi)想到什么好點(diǎn)子,原本以為面試官會(huì)有很棒的解題思路。
結(jié)果他的回答讓我崩潰,他說(shuō):
1,在事務(wù)中的時(shí)候不做更新緩存操作,而是用刪除緩存的操作
2,在讀數(shù)據(jù)的時(shí)候,才去判斷緩存時(shí)候過(guò)期或者是否需要更新。
3,為了保證刪除緩存的操作萬(wàn)無(wú)一失,進(jìn)行雙刪除操作,同步刪一次,異步刪一次。
我勒個(gè)去,先不提讀數(shù)據(jù)時(shí)也是存在數(shù)據(jù)不一致的隱患,我一直沒(méi)想去刪除緩存這個(gè)方法,就是因?yàn)橐坏﹦h除緩存之后,萬(wàn)一突然來(lái)了個(gè)高并發(fā)請(qǐng)求,是會(huì)造成緩存穿透的,而緩存穿透的危害比數(shù)據(jù)不一致要大得多。他說(shuō)這個(gè)是內(nèi)部系統(tǒng)不會(huì)有很大的訪問(wèn)量,這種解釋簡(jiǎn)直無(wú)語(yǔ),他的這種做法和hack沒(méi)任何區(qū)別。
@Autowired 如字面意思是自動(dòng)注入,而@Resource,需要注入一個(gè)命名的bean,它們的查找機(jī)制不同,@Autowired需要掃描項(xiàng)目,查找相關(guān)Bean自動(dòng)注入,是自動(dòng)的,無(wú)須操心怎么注入。而@Resource需要手動(dòng)指定一個(gè)Bean,如果是spring boot項(xiàng)目,需要配置一個(gè)配置文件,用@Bean('xxx')返回命名Bean,如果不是spring boot,那么需要在xml配置。一個(gè)自動(dòng)一個(gè)手動(dòng),不會(huì)產(chǎn)生沖突。
應(yīng)該為多重?cái)?shù)組。
"data":[
{
"ID":"2",
"name": "梅西還是那個(gè)梅西!",
"info":"阿根廷也許16強(qiáng)走的更遠(yuǎn)!",
"img":[
{"imgs1":"img/photo/20180521-01.jpg"},
{"imgs2": "img/photo/20180521-02.jpg"},
{"imgs3": "img/photo/20180521-03.jpg"}
]
},
{
"ID":"1",
"name": "梅西還是那個(gè)梅西!",
"info":"阿根廷也許16強(qiáng)走的更遠(yuǎn)!",
"imgs":[{"img/photo/20180521-02.jpg"}]
},
] 如果你是 Maven 導(dǎo)入的包,那么選中 pom.xml,右鍵選擇 Maven - Download Sources 就可以下載到源碼包 ( 如果發(fā)行方有提供的話 ),Idea 會(huì)自動(dòng)導(dǎo)入,你就可以點(diǎn)進(jìn)源碼下斷點(diǎn)了。
如果不是 Maven 包,那就需要自己找這個(gè) sources 包,舉個(gè)栗子:something.jar,會(huì)有個(gè) something-sources.jar
如果發(fā)行方?jīng)]有提供這個(gè)源碼包,那就沒(méi)辦法了,不過(guò)一般來(lái)說(shuō)都會(huì)有的。
我是存在localstorage里,然后進(jìn)入最外層的路由時(shí)判斷:
let routes = [{
path: '/login',
component: Login,
name: 'login'
},{
path: '/admin',
component: Admin,
beforeEnter: (to, from, next) => {
if(!localStorage.ACCOUNT || localStorage.ACCOUNT == ''){
next({
name: 'login'
})
}else{
next()
}
}
}]$.cookie("key","value");
使用瀏覽器的檢查功能看看人家怎么做的
又到了自問(wèn)自答環(huán)節(jié) 前幾天沒(méi)連vpn 翻不了墻 進(jìn)入help網(wǎng)站后 下個(gè)chorme idea插件就能解決了
后面不要加g,全局匹配會(huì)保留上一次匹配到的index,并且下一次從index才開始匹配,會(huì)導(dǎo)致間歇性錯(cuò)誤。
補(bǔ)充:
第一個(gè)匹配成功后的表達(dá)式對(duì)象截圖
你這里選了 xhr 過(guò)濾器, 切換到 all 或者 img.
對(duì),是博文貼的有問(wèn)題,應(yīng)該是返回包裝后的。這個(gè)才是正解,大廠前后端都會(huì)約定一個(gè)格式,類似這里的
{
"code": 1,
"msg": "這個(gè)id必傳",
"data": 數(shù)據(jù)
}
沒(méi)有看到過(guò)直接返回data的
local peer主動(dòng)調(diào)用close后,此時(shí)的TCP連接進(jìn)入TIME_WAIT狀態(tài),處于該狀態(tài)下的TCP連接不能立即以同樣的四元組建立新連接,即發(fā)起active close的那方占用的local port在TIME_WAIT期間不能再被重新分配。由于TIME_WAIT狀態(tài)持續(xù)時(shí)間為2MSL,這樣保證了舊TCP連接雙工鏈路中的舊數(shù)據(jù)包均因過(guò)期(超過(guò)MSL)而消失,此后,就可以用相同的四元組建立一條新連接而不會(huì)發(fā)生前后兩次連接數(shù)據(jù)錯(cuò)亂的情況。
想辦法先讀出來(lái)二維數(shù)組比如:
[
["1", "機(jī)械", null, null, null],
["1.1", null, "材料", null, null],
["1.1.1", null, null, "材料1", "12"],
["1.1.1.1", null, null, "材料2", "11"],
["1.2", null, "設(shè)備", null, null],
["1.2.1", null, null, "設(shè)備1", "33"],
]
這個(gè)應(yīng)該通過(guò)獲得poi的cell的列號(hào)能夠讀出來(lái)。
然后把數(shù)組下標(biāo)1~3的合并一下變成下面這樣:
[
["1", "機(jī)械", null],
["1.1", "材料", null],
["1.1.1", "材料1", "12"],
["1.1.1.1", "材料2", "11"],
["1.2", "設(shè)備", null],
["1.2.1", "設(shè)備1", "33"],
]
最后把這個(gè)數(shù)組寫到新的excel里
list.forEach(value -> { System.out.println(value.getClass()) })
不知道是不是你想要的
在spring mvc的配置文件中加上:<mvc:default-servlet-handler/> 試試!
Web應(yīng)用程序的缺省Servlet
在<tomcat的安裝目錄>confweb.xml文件中,注冊(cè)了一個(gè)名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個(gè)Servlet設(shè)置為了缺省Servlet,映射路徑為一個(gè)正斜杠(/)。
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問(wèn)請(qǐng)求都將交給缺省Servlet處理,也就是說(shuō),缺省Servlet用于處理所有其他Servlet都不處理的訪問(wèn)請(qǐng)求。
例如:當(dāng)訪問(wèn)Tomcat服務(wù)器中的某個(gè)靜態(tài)HTML文件和圖片時(shí),實(shí)際上是在訪問(wèn)這個(gè)缺省Servlet。
你現(xiàn)在在web.xml中配置的一個(gè)映射路徑為/的servlet,這個(gè)servlet就成為默認(rèn)的servlet了。就不能訪問(wèn)原來(lái)的tocmat提供的servlet了(其他服務(wù)器類似),自然就不能處理靜態(tài)的HTML文件訪問(wèn)了。
<mvc:default-servlet-handler/>
如果將DispatcherServlet請(qǐng)求映射配置為"/",則Spring MVC將捕獲Web容器所有的請(qǐng)求,包括靜態(tài)資源的請(qǐng)求,Spring MVC會(huì)將它們當(dāng)成一個(gè)普通請(qǐng)求處理,因此找不到對(duì)應(yīng)處理器將導(dǎo)致錯(cuò)誤。
在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,會(huì)在Spring MVC上下文中定義一個(gè)org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會(huì)像一個(gè)檢查員,對(duì)進(jìn)入DispatcherServlet的URL進(jìn)行篩查,如果發(fā)現(xiàn)是靜態(tài)資源的請(qǐng)求,就將該請(qǐng)求轉(zhuǎn)由Web應(yīng)用服務(wù)器默認(rèn)的Servlet處理,如果不是靜態(tài)資源的請(qǐng)求,才由DispatcherServlet繼續(xù)處理。
一般Web應(yīng)用服務(wù)器默認(rèn)的Servlet名稱是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web應(yīng)用服務(wù)器的默認(rèn)Servlet名稱不是"default",則需要通過(guò)default-servlet-name屬性顯示指定:
<mvc:default-servlet-handler default-servlet-name="所使用的Web服務(wù)器默認(rèn)使用的Servlet名稱" />
可以參考下面的文章:
https://www.cnblogs.com/dflmg...
如果是系統(tǒng)安裝,可以直接用服務(wù)管理腳本進(jìn)行管理,
如ubuntu下/etc/init.d/tomcat8
使用命令
$ sudo service tomcat8 restart
腳本內(nèi)容如下:
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
set +e
if [ -f "$CATALINA_PID" ]; then
start-stop-daemon --stop --pidfile "$CATALINA_PID" \
--user "$TOMCAT8_USER" \
--retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg "$DESC is not running but pid file exists, cleaning up"
elif [ $? -eq 3 ]; then
PID="`cat $CATALINA_PID`"
log_failure_msg "Failed to stop $NAME (pid $PID)"
exit 1
fi
rm -f "$CATALINA_PID"
rm -rf "$JVM_TMP"
else
log_progress_msg "(not running)"
fi
log_end_msg 0
set -e
;;
基本的思路是先用start-stop-daemon發(fā)停止信號(hào)給tomcat進(jìn)程, 如果進(jìn)程不能順利結(jié)束,再用kill殺掉. 這里TERM/20/KILL/5意思是先發(fā)送TERM信號(hào)20秒沒(méi)有結(jié)束接著發(fā)送KILL信號(hào),超時(shí)時(shí)間為5秒.
如果你自己管理,也可以參考上面腳本來(lái)完成.
ROOT是tomcat默認(rèn)的項(xiàng)目部署目錄,在這個(gè)目錄里tomcat會(huì)讀取war包并解壓,然后裝載項(xiàng)目文件到tomcat容器,如果你的tomcat沒(méi)有手動(dòng)修改過(guò),那么要注意你的項(xiàng)目配置了,如果沒(méi)有額外指定servlet,那么tomcat配置可能有問(wèn)題可以查看tomcat配置文件
$ vim conf/server.xml #切換到tomcat家目錄后
在配置文件下半部分有關(guān)于項(xiàng)目部署的容器配置
substring方法會(huì)創(chuàng)建一個(gè)新的String對(duì)象,這里判斷下標(biāo)是為了盡量減少對(duì)象的創(chuàng)建,避免浪費(fèi)內(nèi)存。
db.<coll>.update({條件}, {$set: {字段}, $setOnInsert: {date: new Date()}}, {upsert: true});
加上$setOnInsert表示只有在插入的時(shí)候才帶這個(gè)字段。跟關(guān)系數(shù)據(jù)庫(kù)不同的是,這個(gè)時(shí)間來(lái)自你的應(yīng)用,而不是數(shù)據(jù)庫(kù)加上去的默認(rèn)值。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。