A. java web開發緩存方案,ehcache和redis哪個更好
這里就不再逐個討論了,我將會在一個實際應用程序開發場景中介紹其中的一些。使用Redis作為一個緩存解決方案我之前提到過,Redis可輕易地用作一個緩存解決方案,碰巧我現在正好需要這樣一個!在該應用程序示例中,我將Redis集成到我基於定位的移動Web服務中,稱之為Magnus。如果您沒有關注本系列,那麼我會先使用Play框架實現Magnus,從那時起我就已經在各種實現中開發和重構它了。Magnus是一個簡單服務,可以通過HTTPPUT請求使用JSON文檔。這些文檔描述了特定帳號的位置,表示持有移動設備的人。現在,我想要將緩存集成到Magnus,也就是說我想要通過將不常更改的數據存儲在內存中以減少I/O流量。Magnus緩存!在清單5中的第一步中,可以通過get調用了解新引入的帳戶名稱(一個鍵)是否為REdis中的一個鍵。get調用可以將帳戶ID作為一個值返回,或者將返回null。如果返回一個值,我將用其作為我的acctId變數。如果返回的是null(表明該帳戶名稱不是Redis中一個鍵),那麼我將在MongoDB查找該帳戶值,並通過set命令將其添加到Redis。這里的優勢是速度:接下來,被請求的帳戶將提交一個位置,這樣我就能夠從Redis中獲取其ID(作為內存緩存),而不是轉到MongoDB並帶來額外讀取I/O成本。清單5.使用Redis作為內存緩存"/location/:account"{put{defjacksonMapper=newObjectMapper()defjson=jacksonMapper.readValue(request.contentText,Map.class)defformatter=newSimpleDateFormat("dd-MM-yyyyHH:mm")defdt=formatter.parse(json['timestamp'])defres=[:]try{defjedis=pool.getResource()defacctId=jedis.get(request.parameters['account'])if(!acctId){defacct=Account.findByName(request.parameters['account'])jedis.set(request.parameters['account'],acct.id.toString())acctId=acct.id}pool.returnResource(jedis)newLocation(acctId.toString(),dt,json['latitude'].doubleValue(),json['longitude'].doubleValue()).save()res['status']='success'}catch(exp){res['status']="error${exp.message}"}response.json=jacksonMapper.writeValueAsString(res)}}注意,清單5中的aMagnus實現(使用Groovy編寫)仍然使用一個NoSQL實現作為數據模型存儲;它僅僅使用Redis作為一個緩存實現用於查詢數據。因為我的主要帳戶數據位於MongoDB中(事實上,它駐留在MongoHQ.com中),而我的Redis數據存儲在本地運行。在隨後查找帳戶ID時,Magnus速度將顯著提升。可是等等!我為什麼同時需要MongoDB和Redis?難道我就不能單獨使用一個嗎?ORM的Node.js很多項目均提供ORM類映射用於Redis,其中包括一個極富影響力的基於Ruby的備用方案,稱為Ohm。我檢查了該項目基於Java的派生產品(稱為JOhm),但是最終決定使用一個為Node編寫的派生產品。Ohm及其派生項目的妙處在於他們允許您將一個對象模型映射到一個基於Redis的數據結構。因此,您的模型對象是持久性的,同時在大多數情況下其讀取速度也非常之快。有了Nohm,我便能夠使用JavaScript快速重寫我的Magnus應用程序並能立即持久化Location對象。在清單6中,我已定義了一個Location模型,該模型包括3個屬性。(注意,我通過將timestamp設置為一個字元串而不是一個真實的時間戳,從而簡化我的示例。)清單6.Node.js中的RedisORMvarLocation=nohm.model('Location',{properties:{latitude:{type:'float',unique:false,validations:[['notEmpty']]},longitude:{type:'float',unique:false,validations:[['notEmpty']]},timestamp:{type:'string',unique:false,validations:[['notEmpty']]}}});Node的Express框架使NohmLocation對象的使用變得十分簡單。在我的應用程序PUT實現中,我可以捕獲正在進入的JSON值,並通過Nohm的p調用將其導入到一個Location實例。然後我再檢查該示例是否有效,如果有效,我會對其進行持久化。清單7.在Node的Express.js中使用Nohmapp.put('/',function(req,res){res.contentType('json');varlocation=newLocation;location.p("timestamp",req.body.timestamp);location.p("latitude",req.body.latitude);location.p("longitude",req.body.longitude);if(location.valid()){location.save(function(err){if(!err){res.send(JSON.stringify({status:"success"}));}else{res.send(JSON.stringify({status:location.errors}));}});}else{res.send(JSON.stringify({status:location.errors}));}});正如清單7所示,可以輕易地將Redis構建成一個極其快速的內存數據存儲。在一些案例中,它甚至是一個比memcached更好的緩存!結束語Redis對於許多數據存儲場景非常有用,因為它可以將數據持久化到磁碟(還因為它支持一個豐富的數據集),有時候,它是memcached的有力競爭對手。有些情況下,對於您的領域也是很有意義的,您可以使用Redis作為數據模型和隊列的一個備份存儲。Redis客戶端實現幾乎可被移植到任何編程語言中。Redis不是RDMBS的完全替代品,也不是一個重量級存儲,但是和MongoDB一樣擁有豐富的功能。然而,在很多情況下,它可與這些技術共存。
B. 用Java開發Web程序怎麼使用緩存
默認情況下。Java並不完成緩存,要安裝圓首URL類使用系統級緩存,需岩薯要有:
ResonseCache的一個具體子類。
CacheRequest的一個具體子類。
CacheResponse的一個具體子類。橘棗數
C. java為什麼使用緩存實現搶答
您是否在詢問為什麼使用緩存,緩存是用來存儲數據的。
FIFO先入先出,很好理解,就和隊列一樣,先進隊列的先出隊列,LRU 最近最少使用,意思就是最近讀取的數據放在最前面,最早讀取的數據放在最後面,如果這個時候有新的數據進來,那麼最後面存儲的數據淘汰,LFU最不常使用,意思就是對存儲的數據都會有一個計數引用,然後隊列按數據引用次數排序,引用數多的排在最前面,引用數少的排在後面。如果這個時候有新的數據進來,把最後面的數據刪除,把新進數據排在最後面,且引用次數為1。
D. Java的應用緩存cache如何入門
Java的應用緩存cache入門:
java常用的緩存有:ehcache, oscache,jcache,這些cache都是單機的,即存在本機的內存中,另外分布式的cache我用過memcache,它被獨立部署在一台伺服器上,可以實現多個客戶端共用緩存;
一般用到緩存的場景:
1.在處理並發請求,需要及時響應的。
2.加快系統響應速度。舉個例子:比如購物網站有 售賣物品的排行榜,這種數據都是由資料庫中N多表關聯查詢排序得到的,那麼就可以存在緩存當中,當頁面請求查看排行榜時直接取緩存中的數據。後台定時任務根據一定的時間間隔計算好排行結果,再替換到當前緩存中。
這就是一個簡單的緩存應用示例。