版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、您的位置:咨詢直通車崗位入門知識IT類JAVA例子模糊與銳化 發(fā)布時間:2009-01-25 10:33:36來源:網(wǎng)絡(luò)點(diǎn)擊數(shù):683import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;import java.io.*;/ 圖像的模糊與銳化public class BlurAndSharpenDemo extends JFrame implements ActionListener private JPanel jPanel = new JPanel(); /面板jPane
2、l用于容納模糊、銳化、還原圖像按鈕private JButton buttonFile; /打開圖像文件按鈕private JButton buttonBlur; /模糊圖像按鈕private JButton buttonSharpen; /銳化圖像按鈕private JButton buttonReset; /還原圖像按鈕ImagePanel imagePanel = new ImagePanel(); /創(chuàng)建ImagePanel對象用于繪制圖像public BlurAndSharpenDemo() super(圖像的模糊與銳化演示); /調(diào)用父類構(gòu)造函數(shù)Container contentP
3、ane = getContentPane(); /得到容器buttonFile = new JButton(打開圖像文件); /實(shí)例化組件buttonFile.addActionListener(this); /增加事件監(jiān)聽buttonBlur = new JButton(模糊圖像);buttonBlur.addActionListener(this);buttonSharpen = new JButton(銳化圖像);buttonSharpen.addActionListener(this);buttonReset = new JButton(還原圖像);buttonReset.addAct
4、ionListener(this);jPanel.add(buttonBlur); /增加組件到面板上jPanel.add(buttonSharpen);jPanel.add(buttonReset);contentPane.add(jPanel, BorderLayout.SOUTH); /增加組件到容器上contentPane.add(buttonFile, BorderLayout.NORTH);contentPane.add(imagePanel, BorderLayout.CENTER);/設(shè)置窗口this.setSize(280, 230); /設(shè)置窗口大小this.setVisi
5、ble(true); /設(shè)置窗口可見this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /關(guān)閉窗口時退出程序public void actionPerformed(ActionEvent e) JButton button = (JButton)e.getSource(); /獲取事件源 /打開圖像文件按鈕buttonFile事件處理 if(button=this.buttonFile) JFileChooser chooser = new JFileChooser(); /實(shí)例化文件選擇器chooser.setFileSelectionM
6、ode(JFileChooser.FILES_ONLY); /設(shè)置文件打開模式為僅打開文件chooser.setCurrentDirectory(new File(.); /設(shè)置文件選擇器當(dāng)前目錄/設(shè)置圖像文件過濾器chooser.setFileFilter(new javax.swing.filechooser.FileFilter() public boolean accept(File file) /可接受的文件類型String name = file.getName().toLowerCase();return name.endsWith(.gif)| name.endsWith(.j
7、pg)| name.endsWith(.jpeg)| file.isDirectory();public String getDescription() /文件描述return 圖像文件;);int result = chooser.showOpenDialog(this); /顯示文件選擇對話框if (result = JFileChooser.APPROVE_OPTION) /得到用戶行為String fileName = chooser.getSelectedFile().getAbsolutePath();/得到選擇的文件名imagePanel.loadImage(fileName);
8、 /截入圖像并顯示 /模糊圖像按鈕buttonBlur事件處理else if(button=this.buttonBlur) imagePanel.blur(); /模糊圖像buttonReset.setEnabled(true); /設(shè)置還原圖像按鈕可用/銳化圖像按鈕buttonSharpen事件處理else if(button=this.buttonSharpen) imagePanel.sharpen(); /銳化圖像buttonReset.setEnabled(true); /設(shè)置還原圖像按鈕可用/還原圖像按鈕buttonBlur事件處理else if(button=this.butt
9、onReset) imagePanel.reset(); /還原圖像buttonReset.setEnabled(false); /設(shè)置還原圖像按鈕不可用public static void main(String args) new BlurAndSharpenDemo();public class ImagePanel extends JPanel Image image; /被處理的圖像BufferedImage bufImage; /用于顯示的緩沖區(qū)圖像BufferedImage originalBufImage; /原始緩沖區(qū)圖像Graphics2D g2D; /圖形環(huán)境/載入圖像p
10、ublic void loadImage(String fileName) image = this.getToolkit().getImage(fileName); /獲取圖像MediaTracker mt = new MediaTracker(this); /實(shí)例化媒體加載器mt.addImage(image, 0); /增加待加載圖像到媒體加載器try mt.waitForAll(); /等待所有圖像的加載完成 catch (Exception ex) ex.printStackTrace(); /輸出出錯信息/創(chuàng)建原始緩沖區(qū)圖像originalBufImage = new Buffer
11、edImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);g2D = originalBufImage.createGraphics(); /創(chuàng)建緩沖區(qū)圖像的圖形環(huán)境g2D.drawImage(image, 0, 0, this); /傳輸源圖像數(shù)據(jù)到緩沖區(qū)圖像中bufImage = originalBufImage;repaint(); /重繪組件 /過濾圖像 public void applyFilter(float data) if (bufImage = null)return; /如
12、果bufImage為空則直接返回Kernel kernel = new Kernel(3, 3, data); ConvolveOp imageOp=new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP, null);/創(chuàng)建卷積變換操作對象BufferedImage filteredBufImage = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);/過濾后的緩沖區(qū)圖像imageOp.filter(bufImage, filte
13、redBufImage);/過濾圖像,目標(biāo)圖像在filteredBufImagebufImage = filteredBufImage; /讓用于顯示的緩沖區(qū)圖像指向過濾后的圖像repaint(); /重繪組件/模糊圖像 public void blur() if (bufImage = null)return;float data = 0.0625f, 0.125f, 0.0625f,0.125f,0.025f, 0.125f,0.0625f, 0.125f, 0.0625f ;applyFilter(data);/銳化圖像public void sharpen() if (bufImage
14、 = null)return;float data = -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f, -1.0f ;applyFilter(data);/恢復(fù)圖像public void reset() if (bufImage = null)return;bufImage = originalBufImage; /g2D.drawImage(image, 0, 0, this);repaint(); /調(diào)用paint()方法重繪組件public void paint(Graphics g) super.paintComponent
15、(g);/如果bufImage非空,則在組件上繪制它if (bufImage != null) Graphics2D g2 = (Graphics2D) g;g2.drawImage(bufImage,(this.getWidth() - bufImage.getWidth() / 2,(this.getHeight() - bufImage.getHeight() / 2,this);參考算法2:import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;i
16、mport java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GridLayout;import java.awt.Image;import java.awt.MediaTracker;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.awt.image.ConvolveOp;import java.awt.image.Kernel;im
17、port javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class SharpenFuzzy extends JFrame private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();/ 添加的組件private JPanel jpanel = new JPanel();private JButton jb1 = new JButton();private JButton jb2
18、 = new JButton();private JButton jb3 = new JButton();private GridLayout gridLayout = new GridLayout();/ 創(chuàng)建ShowPanel類的實(shí)例PanelDemo pd = new PanelDemo();public void initial() / 設(shè)置各組件的屬性contentPane = (JPanel) this.getContentPane();contentPane.setLayout(borderLayout1);this.setSize(new Dimension(380, 550)
19、;this.setTitle(圖像的明暗處理演示);jb1.setFont(new Font(Dialog, Font.BOLD, 13);jb1.setText(Sharp Image);jb1.addActionListener(new ActionListener() / 添加事件監(jiān)聽器public void actionPerformed(ActionEvent e) jb1_actionPerformed(e););jb2.setFont(new Font(Dialog, Font.BOLD, 13);jb2.setText(Biur Image);jb2.addActionList
20、ener(new ActionListener() / 添加事件監(jiān)聽器public void actionPerformed(ActionEvent e) jb2_actionPerformed(e););jb3.setFont(new Font(Dialog, Font.BOLD, 13);jb3.setText(Reset);jb3.addActionListener(new ActionListener() / 添加事件監(jiān)聽器public void actionPerformed(ActionEvent e) jb3_actionPerformed(e););jpanel.setLayo
21、ut(gridLayout);jpanel.add(jb1, null);jpanel.add(jb2, null);jpanel.add(jb3, null);contentPane.add(jpanel, BorderLayout.SOUTH);/ 在窗口中部添加ShowPanel面板contentPane.add(pd, BorderLayout.CENTER);this.setVisible(true);public void jb1_actionPerformed(ActionEvent e) pd.sharpImage();/ 調(diào)用銳化方法pd.repaint();/ 繪制銳化后的
22、圖像public void jb2_actionPerformed(ActionEvent e) pd.blurImage();/ 調(diào)用模糊方法pd.repaint();/ 繪制模糊后的圖像public void jb3_actionPerformed(ActionEvent e) pd.reset();/ 緩沖區(qū)圖像為源圖像pd.repaint();/ 繪制源圖像public static void main(String args) new SharpenFuzzy().initial();class PanelDemo extends JPanel private BorderLayou
23、t borderLayout = new BorderLayout();/ 定義新屬性Image image;/ 源圖像BufferedImage bi1;/ 緩沖區(qū)圖像BufferedImage bi2;/ 緩沖區(qū)圖像BufferedImage bi3;/ 緩沖區(qū)圖像Graphics2D g2d;/ 圖像上下文public PanelDemo() this.setLayout(borderLayout);loadImage();/ 加載圖片createBufferedImage();/ 創(chuàng)建緩沖區(qū)圖像bi1 = bi2;this.setSize(new Dimension(image.get
24、Width(this), image.getHeight(this);/ 設(shè)置面板大小public void loadImage() / 加載圖片image = this.getToolkit().getImage(/這里如果不填寫一個存在的圖片,程序會拋出空指針異常ClassLoader.getSystemResource(chaojikatong.jpg);/ 創(chuàng)建Image對象MediaTracker mt = new MediaTracker(this);mt.addImage(image, 0);try mt.waitForAll(); catch (Exception e) e.p
25、rintStackTrace();/ 表示加載失敗if (image.getWidth(this) = -1) System.out.println(不能創(chuàng)建圖象);/ 如果不存在退出程序System.exit(1);public void createBufferedImage() / 根據(jù)image對象創(chuàng)建一個緩沖區(qū)圖像bi2 = new BufferedImage(image.getWidth(this), image.getHeight(this),BufferedImage.TYPE_INT_ARGB);/ 向緩沖區(qū)圖像中輸入原image對象的圖象數(shù)據(jù)g2d = bi2.create
26、Graphics();g2d.drawImage(this.image, 0, 0, this);/ 繪制緩沖區(qū)圖像/ 創(chuàng)建另一個空的緩沖區(qū)圖像,大小和類型相同的bi3bi3 = new BufferedImage(image.getWidth(this), image.getHeight(this),BufferedImage.TYPE_INT_ARGB);public void sharpImage() / 銳化圖像的方法float data = -1.0f, -1.0f, -1.0f, 10.f, -1.0f, -1.0f, -1.0f, -1.0f ;Kernel kernel = n
27、ew Kernel(3, 3, data);ConvolveOp co = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);/ 創(chuàng)建卷積過濾器co.filter(bi2, bi3);/ 將存儲源圖像的緩沖區(qū)圖像的數(shù)據(jù)經(jīng)卷積過濾器處理后進(jìn)入另一個緩沖區(qū)bi1 = bi3;/ bi1指向處理后的圖像緩沖區(qū)bi3public void blurImage() / 模糊圖像的方法float data = 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f,0.0625f, 0.125f, 0.0625f
28、 ;Kernel kernel = new Kernel(3, 3, data);ConvolveOp co = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);/ 創(chuàng)建卷積過濾器co.filter(bi2, bi3);/ 將存儲源圖像的緩沖區(qū)圖像的數(shù)據(jù)經(jīng)卷積過濾器處理后進(jìn)入另一個緩沖區(qū)bi1 = bi3;/ bi1指向處理后的圖像緩沖區(qū)bi3public void reset() g2d.setColor(Color.black);g2d.clearRect(0, 0, image.getWidth(this), image.getHe
29、ight(this);g2d.drawImage(this.image, 0, 0, this);/ 繪制緩沖區(qū)圖像/ 令bi1對象指向源圖像存儲的bi2緩沖區(qū)圖像bi1 = bi2;public void paintComponent(Graphics g) super.paintComponent(g);Graphics2D g2d = (Graphics2D) g;g2d.drawImage(bi1, 0, 0, this);public void update(Graphics g) g.clearRect(0, 0, this.getWidth(), this.getHeight()
30、;this.paintComponent(g);附錄資料:java處理高并發(fā)高負(fù)載類網(wǎng)站的優(yōu)化方法java處理高并發(fā)高負(fù)載類網(wǎng)站中數(shù)據(jù)庫的設(shè)計方法(java教程,java處理大量數(shù)據(jù),java高負(fù)載數(shù)據(jù))一:高并發(fā)高負(fù)載類網(wǎng)站關(guān)注點(diǎn)之?dāng)?shù)據(jù)庫沒錯,首先是數(shù)據(jù)庫,這是大多數(shù)應(yīng)用所面臨的首個SPOF。尤其是Web2.0的應(yīng)用,數(shù)據(jù)庫的響應(yīng)是首先要解決的。一般來說MySQL是最常用的,可能最初是一個mysql主機(jī),當(dāng)數(shù)據(jù)增加到100萬以上,那么,MySQL的效能急劇下降。常用的優(yōu)化措施是M-S(主-從)方式進(jìn)行同步復(fù)制,將查詢和操作和分別在不同的服務(wù)器上進(jìn)行操作。我推薦的是M-M-Slaves方式,2
31、個主Mysql,多個Slaves,需要注意的是,雖然有2個Master,但是同時只有1個是Active,我們可以在一定時候切換。之所以用2個M,是保證M不會又成為系統(tǒng)的SPOF。Slaves可以進(jìn)一步負(fù)載均衡,可以結(jié)合LVS,從而將select操作適當(dāng)?shù)钠胶獾讲煌膕laves上。以上架構(gòu)可以抗衡到一定量的負(fù)載,但是隨著用戶進(jìn)一步增加,你的用戶表數(shù)據(jù)超過1千萬,這時那個M變成了SPOF。你不能任意擴(kuò)充Slaves,否則復(fù)制同步的開銷將直線上升,怎么辦?我的方法是表分區(qū),從業(yè)務(wù)層面上進(jìn)行分區(qū)。最簡單的,以用戶數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到不同的數(shù)據(jù)庫集群去。全局?jǐn)?shù)據(jù)庫用于meta
32、數(shù)據(jù)的查詢。缺點(diǎn)是每次查詢,會增加一次,比如你要查一個用戶nightsailer,你首先要到全局?jǐn)?shù)據(jù)庫群找到nightsailer對應(yīng)的cluster id,然后再到指定的cluster找到nightsailer的實(shí)際數(shù)據(jù)。每個cluster可以用m-m方式,或者m-m-slaves方式。這是一個可以擴(kuò)展的結(jié)構(gòu),隨著負(fù)載的增加,你可以簡單的增加新的mysql cluster進(jìn)去。需要注意的是:1、禁用全部auto_increment的字段2、id需要采用通用的算法集中分配3、要具有比較好的方法來監(jiān)控mysql主機(jī)的負(fù)載和服務(wù)的運(yùn)行狀態(tài)。如果你有30臺以上的mysql數(shù)據(jù)庫在跑就明白我的意思了。
33、4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數(shù)據(jù)庫鏈接池,或者干脆自己做,因?yàn)閜hp4中mysql的鏈接池經(jīng)常出問題。二:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之HTML靜態(tài)化其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化,所以我們盡可能使我們的網(wǎng)站上的頁面采用靜態(tài)頁面來實(shí)現(xiàn),這個最簡單的方法其實(shí)也是 最有效的方法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動去挨個實(shí)現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個門戶站點(diǎn) 的新聞頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡單的信息錄入自動生成靜態(tài)
34、頁面,還能具備頻道管理、權(quán)限 管理、自動抓取等功能,對于一個大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進(jìn)行實(shí)時的靜態(tài)化,有更新的時候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。 同時,html靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實(shí)現(xiàn),比如論壇 中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺管理并且存儲再數(shù)據(jù)庫中,這些信息其
35、實(shí)大量被前臺程序調(diào)用,但是更新頻率很小,可以考慮將這 部分內(nèi)容進(jìn)行后臺更新的時候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求高并發(fā)。網(wǎng)站HTML靜態(tài)化解決方案當(dāng)一個Servlet資源請求到達(dá)WEB服務(wù)器之后我們會填充指定的JSP頁面來響應(yīng)請求:HTTP請求Web服務(wù)器Servlet-業(yè)務(wù)邏輯處理-訪問數(shù)據(jù)-填充JSP-響應(yīng)請求HTML靜態(tài)化之后:HTTP請求Web服務(wù)器Servlet-HTML-響應(yīng)請求靜態(tài)訪求如下Servlet:public void doGet(HttpServletRequest request, HttpServletResponse response) throws S
36、ervletException, IOException if(request.getParameter(chapterId) != null) String chapterFileName = bookChapterRead_+request.getParameter(chapterId)+.html; String chapterFilePath = getServletContext().getRealPath(/) + chapterFileName; File chapterFile = new File(chapterFilePath); if(chapterFile.exists
37、()response.sendRedirect(chapterFileName);return;/如果有這個文件就告訴瀏覽器轉(zhuǎn)向 INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter(chapterId);/章節(jié)信息 int lastPageId = novelChapterBiz.searchLastCHapterI
38、d(novelChapter.getNovelId().getId(), novelChapter.getId(); int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId(); request.setAttribute(novelChapter, novelChapter); request.setAttribute(lastPageId, lastPageId); request.setAttribute(nextPageId, ne
39、xtPageId); new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(), chapterFileName, chapterFilePath, /bookRead.jsp); 生成HTML靜態(tài)頁面的類:package com.jb.y2t034.thefifth.web.servlet;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException
40、;import java.io.OutputStreamWriter;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRe
41、sponse;import javax.servlet.http.HttpServletResponseWrapper;/* 創(chuàng)建HTML靜態(tài)頁面* 功能:創(chuàng)建HTML靜態(tài)頁面* 時間:2009年1011日* 地點(diǎn):home* author mavk*/public class CreateStaticHTMLPage /* * 生成靜態(tài)HTML頁面的方法 * param request 請求對象 * param response 響應(yīng)對象 * param servletContext Servlet上下文 * param fileName 文件名稱 * param fileFullPath
42、文件完整路徑 * param jspPath 需要生成靜態(tài)文件的JSP路徑(相對即可) * throws IOException * throws ServletException */ public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOExcepti
43、on response.setContentType(text/html;charset=gb2312);/設(shè)置HTML結(jié)果流編碼(即HTML文件編碼) RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);/得到JSP資源 final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();/用于從ServletOutputStream中接收資源 final ServletOutputStream servletOupu
44、tStream = new ServletOutputStream()/用于從HttpServletResponse中接收資源 public void write(byte b, int off,int len) byteArrayOutputStream.write(b, off, len); public void write(int b) byteArrayOutputStream.write(b); ; final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream
45、);/把轉(zhuǎn)換字節(jié)流轉(zhuǎn)換成字符流 HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response)/用于從response獲取結(jié)果流資源(重寫了兩個方法) public ServletOutputStream getOutputStream() return servletOuputStream; public PrintWriter getWriter() return printWriter; ; rd.include(request, httpServletResponse);/發(fā)送結(jié)果流
46、printWriter.flush();/刷新緩沖區(qū),把緩沖區(qū)的數(shù)據(jù)輸出 FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath); byteArrayOutputStream.writeTo(fileOutputStream);/把byteArrayOuputStream中的資源全部寫入到fileOuputStream中 fileOutputStream.close();/關(guān)閉輸出流,并釋放相關(guān)資源 response.sendRedirect(fileName);/發(fā)送指定文件流到客戶端 三:高并發(fā)高負(fù)載類網(wǎng)
47、站關(guān)注點(diǎn)之緩存、負(fù)載均衡、存儲緩存是另一個大問題,我一般用memcached來做緩存集群,一般來說部署10臺左右就差不多(10g內(nèi)存池)。需要注意一點(diǎn),千萬不能用使用swap,最好關(guān)閉linux的swap。負(fù)載均衡/加速可能上面說緩存的時候,有人第一想的是頁面靜態(tài)化,所謂的靜態(tài)html,我認(rèn)為這是常識,不屬于要點(diǎn)了。頁面的靜態(tài)化隨之帶來的是靜態(tài)服務(wù)的負(fù)載均衡和加速。我認(rèn)為Lighttped+Squid是最好的方式了。LVS lighttped=squid(s) =lighttpd上面是我經(jīng)常用的。注意,我沒有用apache,除非特定的需求,否則我不部署apache,因?yàn)槲乙话阌胮hp-fast
48、cgi配合lighttpd,性能比apache+mod_php要強(qiáng)很多。squid的使用可以解決文件的同步等等問題,但是需要注意,你要很好的監(jiān)控緩存的命中率,盡可能的提高的90%以上。squid和lighttped也有很多的話題要討論,這里不贅述。存儲存儲也是一個大問題,一種是小文件的存儲,比如圖片這類。另一種是大文件的存儲,比如搜索引擎的索引,一般單文件都超過2g以上。小文件的存儲最簡單的方法是結(jié)合lighttpd來進(jìn)行分布?;蛘吒纱嗍褂肦edhat的GFS,優(yōu)點(diǎn)是應(yīng)用透明,缺點(diǎn)是費(fèi)用較高。我是指你購買盤陣的問題。我的項(xiàng)目中,存儲量是2-10Tb,我采用了分布式存儲。這里要解決文件的復(fù)制和冗
49、余。這樣每個文件有不同的冗余,這方面可以參考google的gfs的論文。大文件的存儲,可以參考nutch的方案,現(xiàn)在已經(jīng)獨(dú)立為hadoop子項(xiàng)目。(你可以google it)其他:此外,passport等也是考慮的,不過都屬于比較簡單的了。四:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之圖片服務(wù)器分離大家知道,對于Web 服務(wù)器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進(jìn)行分離,這是基本上大型網(wǎng)站都會采用的策略,他 們都有獨(dú)立的圖片服務(wù)器,甚至很多臺圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁面訪問請求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會因?yàn)閳D片問題而崩潰,在應(yīng)用
50、服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadModule, 保證更高的系統(tǒng)消耗和執(zhí)行效率。利用Apache實(shí)現(xiàn)圖片服務(wù)器的分離緣由:起步階段的應(yīng)用,都可能部署在一臺服務(wù)器上(費(fèi)用上的原因)第一個優(yōu)先分離的,肯定是數(shù)據(jù)庫和應(yīng)用服務(wù)器。第二個分離的,會是什么呢?各有各的考慮,我所在的項(xiàng)目組重點(diǎn)考慮的節(jié)約帶寬,服務(wù)器性能再好,帶寬再高,并發(fā)來了,也容易撐不住。因此,我這篇文章的重點(diǎn)在這里。這里重點(diǎn)是介紹實(shí)踐,不一定符合所有情況,供看者參考吧,環(huán)境介紹:WEB應(yīng)用服務(wù)器:4CPU雙核2G, 內(nèi)存4G 部署:Win20
51、03/Apache Http Server 2.1/Tomcat6數(shù)據(jù)庫服務(wù)器:4CPU雙核2G, 內(nèi)存4G 部署:Win2003/MSSQL2000步驟:步驟一:增加2臺配置為:2CPU雙核2G,內(nèi)存2G普通服務(wù)器,做資源服務(wù)器 部署:Tomcat6,跑了一個圖片上傳的簡單應(yīng)用,(記得指定web.xml的),并指定域名為res1.*.com,res2.*.com,采用ajp協(xié)議步驟二:修改Apache httpd.conf配置 原來應(yīng)用的文件上傳功能網(wǎng)址為: 1、/fileupload.html 2、/otherupload.html 在httpd.conf中增加如下配置 ServerAdm
52、in webmaster*.com ProxyPass /fileupload.html balancer:/rescluster/fileupload lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 ProxyPass /otherupload.html balancer:/rescluster/otherupload.html lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 max
53、attempts=3 # BalancerMember ajp:/res1.*.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat1 BalancerMember ajp:/res2.*.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat2 步驟三,修改業(yè)務(wù)邏輯: 所有上傳文件在數(shù)據(jù)庫中均采用全url的方式保存,例如產(chǎn)品圖片路徑存成:http:/res1.*.com/upload/20090101/product1203
54、02005.jpg現(xiàn)在,你可以高枕無憂了,帶寬不夠時,增加個幾十臺圖片服務(wù)器,只需要稍微修改一下apache的配置文件,即可。五:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之?dāng)?shù)據(jù)庫集群和庫表散列大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫,那么在面對大量訪問的時候,數(shù)據(jù)庫的瓶頸很快就能顯現(xiàn)出來,這時一臺數(shù)據(jù)庫將很快無法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫集群或者庫表散列。在數(shù)據(jù)庫集群方面,很多數(shù)據(jù)庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來實(shí)施即可。 上面提到的數(shù)據(jù)庫集群由于在架構(gòu)、成
55、本、擴(kuò)張性方面都會受到所采用DB類型的限制,于是我們需要從應(yīng)用程序的角度來考慮改善系統(tǒng)架構(gòu),庫表散列是常用并 且最有效的解決方案。我們在應(yīng)用程序中按照業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫進(jìn)行分離,不同的模塊對應(yīng)不同的數(shù)據(jù)庫或者表,再按照一定的策略對某個頁面或者 功能進(jìn)行更小的數(shù)據(jù)庫散列,比如用戶表,按照用戶ID進(jìn)行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴(kuò)展性。sohu的論壇就是采用了這樣的 架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進(jìn)行數(shù)據(jù)庫分離,然后對帖子、用戶按照板塊和ID進(jìn)行散列數(shù)據(jù)庫和表,最終可以在配置文件中進(jìn)行簡單的配置便能讓系 統(tǒng)隨時增加一臺低成本的數(shù)據(jù)庫進(jìn)來補(bǔ)充系統(tǒng)性能。集群軟
56、件的分類:一般來講,集群軟件根據(jù)側(cè)重的方向和試圖解決的問題,分為三大類:高性能集群(High performance cluster,HPC)、負(fù)載均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。高性能集群(High performance cluster,HPC),它是利用一個集群中的多臺機(jī)器共同完成同一件任務(wù),使得完成任務(wù)的速度和可靠性都遠(yuǎn)遠(yuǎn)高于單機(jī)運(yùn)行的效果。彌補(bǔ)了單機(jī)性能上的不足。該集群在天氣預(yù)報、環(huán)境監(jiān)控等數(shù)據(jù)量大,計算復(fù)雜的環(huán)境中應(yīng)用比較多;負(fù)載均衡集群(Load balance clust
57、er, LBC),它是利用一個集群中的多臺單機(jī),完成許多并行的小的工作。一般情況下,如果一個應(yīng)用使用的人多了,那么用戶請求的響應(yīng)時間就會增大,機(jī)器的性能也會受到影響,如果使用負(fù)載均衡集群,那么集群中任意一臺機(jī)器都能響應(yīng)用戶的請求,這樣集群就會在用戶發(fā)出服務(wù)請求之后,選擇當(dāng)時負(fù)載最小,能夠提供最好的服務(wù)的這臺機(jī)器來接受請求并相應(yīng),這樣就可用用集群來增加系統(tǒng)的可用性和穩(wěn)定性。這類集群在網(wǎng)站中使用較多;高可用性集群(High availability cluster,HAC),它是利用集群中系統(tǒng) 的冗余,當(dāng)系統(tǒng)中某臺機(jī)器發(fā)生損壞的時候,其他后備的機(jī)器可以迅速的接替它來啟動服務(wù),等待故障機(jī)的維修和返回
58、。最大限度的保證集群中服務(wù)的可用性。這類系統(tǒng)一般在銀行,電信服務(wù)這類對系統(tǒng)可靠性有高的要求的領(lǐng)域有著廣泛的應(yīng)用。2 數(shù)據(jù)庫集群的現(xiàn)狀數(shù)據(jù)庫集群是將計算機(jī)集群技術(shù)引入到數(shù)據(jù)庫中來實(shí)現(xiàn)的,盡管各廠商宣稱自己的架構(gòu)如何的完美,但是始終不能改變Oracle當(dāng)先,大家追逐的事實(shí),在集群的解決方案上Oracle RAC還是領(lǐng)先于包括微軟在內(nèi)的其它數(shù)據(jù)庫廠商,它能滿足客戶高可用性、高性能、數(shù)據(jù)庫負(fù)載均衡和方便擴(kuò)展的需求。Oracles Real Application Cluster (RAC)Microsoft SQL Cluster Server (MSCS)IBMs DB2 UDB High Avai
59、lability Cluster(UDB)Sybase ASE High Availability Cluster (ASE)MySQL High Availability Cluster (MySQL CS)基于IO的第三方HA(高可用性)集群當(dāng)前主要的數(shù)據(jù)庫集群技術(shù)有以上六大類,有數(shù)據(jù)庫廠商自己開發(fā)的;也有第三方的集群公司開發(fā)的;還有數(shù)據(jù)庫廠商與第三方集群公司合作開發(fā)的,各類集群實(shí)現(xiàn)的功能及架構(gòu)也不盡相同。RAC(Real Application Cluster,真正應(yīng)用集群)是Oracle9i數(shù)據(jù)庫中采用的一項(xiàng)新技術(shù),也是Oracle數(shù)據(jù)庫支持網(wǎng)格計算環(huán)境的核心技術(shù)。它的出現(xiàn)解決了傳統(tǒng)數(shù)
60、據(jù)庫應(yīng)用中面臨的一個重要問題:高性能、高可伸縮性與低價格之間的矛盾。在很長一段時間里,甲骨文都以其實(shí)時應(yīng)用集群技術(shù)(Real Application Cluster,RAC)統(tǒng)治著集群數(shù)據(jù)庫市場六:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之緩存緩存一詞搞技術(shù)的都接觸過,很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。架構(gòu)方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪問響應(yīng)能力。 網(wǎng)站程序開發(fā)方面的緩存,Linux上提供的Mem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年家政服務(wù)合同期限約定
- 2025年媒體傳媒服務(wù)合作協(xié)議
- 2025年企業(yè)商標(biāo)使用轉(zhuǎn)讓合同
- 2025年商業(yè)綜合體裝修設(shè)計合同
- 2025年地鐵站裝修施工協(xié)議
- 二零二五年度美發(fā)店員工勞動合同續(xù)簽及調(diào)整合同4篇
- 2025年冷庫自動化控制系統(tǒng)銷售及安裝合同3篇
- 2024蘇州工業(yè)園區(qū)建筑工程施工質(zhì)量保修合同范本3篇
- 2025版事業(yè)單位編外人員健康體檢與疾病預(yù)防聘用合同3篇
- 2025年度個人消費(fèi)貸款擔(dān)保合同編制手冊3篇
- 2024版塑料購銷合同范本買賣
- JJF 2184-2025電子計價秤型式評價大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 2024年安徽省中考數(shù)學(xué)試卷含答案
- 2025屆山東省德州市物理高三第一學(xué)期期末調(diào)研模擬試題含解析
- 2024年滬教版一年級上學(xué)期語文期末復(fù)習(xí)習(xí)題
- 兩人退股協(xié)議書范文合伙人簽字
- 2024版【人教精通版】小學(xué)英語六年級下冊全冊教案
- 汽車噴漆勞務(wù)外包合同范本
- 2024年重慶南開(融僑)中學(xué)中考三模英語試題含答案
- 2023年最新的校長給教師春節(jié)祝福語
評論
0/150
提交評論