Tăng tốc Web java bằng Caching System

7:59 PM

Bộ nhớ đệm

Bộ nhớ đệm thường được sử dụng để tối ưu hóa việc tải dữ liệu cho các ứng dụng trên nền web. Nó rất thích hợp để caching những dữ liệu được truy cập nhiều nhưng ít bị thay đổi và những dữ liệu được truy cập nhiều vào một thời điểm nhưng sau đó lại ít được dùng đến.

Thông thường các ứng dụng được kết nối đến một cơ sở dữ liệu, thực hiện truy vấn và phân tích kết quả trả về. Bộ nhớ đệm duy trì một tập các đối tượng được tái sử dụng mà không cần truy vấn lại cơ sở dữ liệu. Các úng dụng java thường bị hạn chế về tài nguyên có sẵn trong JVM.Trong đó quý nhất là bộ nhớ, vì vậy phải thật thận trọng khi sử dụng bộ nhớ đệm. Để hiểu hơn về bộ nhớ đệm chúng ta làm một ví dụ với JSC.

Java Caching System

Đơn giản và mạnh mẽ, là một sản phẩm mã nguồn mở được phát hành thông qua các tiểu dự án Apache Jakarta. Nó cung cấp các tính năng tiêu chuẩn mà bạn mong đợi của một hệ thống bộ nhớ đệm, chẳng hạn như bộ nhớ đệm trong RAM và các thuật toán lựa chọn loại bỏ các đối tượng từ bộ nhớ đệm. Nó cũng cung cấp các tính năng cao cấp hơn nhiều, chẳng hạn như bộ nhớ đệm ổ cứng lập chỉ mục và bộ nhớ đệm phân tán.

JCS có cấu trúc giống như mảng, trong đó dữ liệu được lưu trữ trong bộ nhớ cache như một cặp tên và giá trị. JCS phân vùng bộ nhớ cache vào từng khu vực. Mỗi khu vực có cấu hình riêng của mình cũng như các thiết lập của riêng của các cặp tên-giá trị. Mỗi khu vực có thể:
  • Có kích thước khác nhau.
  • Được thực hiện khác nhau.
  • Chứa dữ liệu khác nhau.

Làm việc với JCS.

Thư viện cần thiết.

Bạn downlaod JCS tại: http://commons.apache.org/jcs/

Cần thêm 2 thư viện nữa:

Code.

Đầu tiên bạn cần có một file cấu hìn
Đó là một file properties file: cache.ccf
Nội dung:

# DEFAULT CACHE REGION
jcs.default=DC jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes jcs.default.cacheattributes.MaxObjects=1000 jcs.default.cacheattributes.MemoryCacheName= org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.default.cacheattributes.UseMemoryShrinker=true jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600 jcs.default.cacheattributes.ShrinkerIntervalSeconds=60 jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes jcs.default.elementattributes.IsEternal=false jcs.default.elementattributes.MaxLifeSeconds=21600 jcs.default.elementattributes.IdleTime=1800 jcs.default.elementattributes.IsSpool=true jcs.default.elementattributes.IsRemote=true jcs.default.elementattributes.IsLateral=true

Vùng cache mặc định xác định cấu hình mặc định cho tất cả các vùng cache, trừ khi nó được ghi đè một cách rõ ràng bởi một trong các khu vực khác.

Tiếp theo là một vùng cache được xác định trước (được người dùng định nghĩa), ở đây tôi định nghĩa vùng simple mà tôi sẽ sử dụng.

# AVAILABLE SIMPLE CACHES
jcs.simple.DC=
     org.apache.jcs.simple.disk.indexed.IndexedDiskCacheFactory
jcs.simple.DC.attributes=
     org.apache.jcs.simple.disk.indexed.IndexedDiskCacheAttributes
jcs.simple.DC.attributes.DiskPath=c:/temp
jcs.simple.DC.attributes.MaxPurgatorySize=10000000
jcs.simple.DC.attributes.MaxKeySize=1000000
jcs.simple.DC.attributes.MaxRecycleBinSize=5000
jcs.simple.DC.attributes.OptimizeAtRemoveCount=300000
jcs.simple.DC.attributes.ShutdownSpoolTimeLimit=60
 
Vị trí để file cache.

jcf cache file
Tiếp theo bạn cần một file để quản lý cache:

File: Cache.java
package org.ewing.jcs.cache;
import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;
public class Cache {
    private static JCS jcsCache;
    private final static String JCS_CACHE = "simple";
    public Cache() {
        try {
            jcsCache = JCS.getInstance(JCS_CACHE);
        } catch (CacheException e) {
            e.printStackTrace();
        }
    }
    public static Object get(String id) throws CacheException {
        if (jcsCache == null) {
            jcsCache = JCS.getInstance(JCS_CACHE);
            return null;
        } 
        Object result = jcsCache.get(id);
        return result;
    }
    public static void put(String id, Object obj) throws CacheException {
        if (jcsCache == null) {
            jcsCache = JCS.getInstance(JCS_CACHE);
        }
        try {
            jcsCache.put(id, obj);
        } catch (CacheException e) {
            throw new CacheException();
        }
    }
}

Đây là một class đơn giản để đọc và nghi dữ liệu vào cache.
Với đọc:

    public static Object get(String id) throws CacheException {
        if (jcsCache == null) {
            jcsCache = JCS.getInstance(JCS_CACHE);
            return null;
        } 
        Object result = jcsCache.get(id);
        return result;
    }
Và ghi dữ liệu:
   public static void put(String id, Object obj) throws CacheException {
        if (jcsCache == null) {
            jcsCache = JCS.getInstance(JCS_CACHE);
        }
        try {
            jcsCache.put(id, obj);
        } catch (CacheException e) {
            throw new CacheException();
        }
    }
Một servlet đơn giản sủ dụng cache:

package org.ewing.jcs.service;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jcs.access.exception.CacheException;
import org.ewing.jcs.cache.Cache;

/**
 * Servlet implementation class Service
 */
@WebServlet("/Service")
public class Service extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Service() {
        super();

    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        System.out.println("this is test");
        String id = request.getParameter("txtName");
        String input = request.getParameter("txtInput");
        String cache = request.getParameter("txtCache");
        String result = "";
        if ((input != null) && (!input.equals("")) && (cache != null)
                && (!cache.equals(""))) {
            System.out.println("put");
            try {
                Cache.put(input, cache);
            } catch (CacheException e) {

                e.printStackTrace();
            }
        } else {
            System.out.println("get");
            try {
                result = (String) Cache.get(id);
            } catch (CacheException e) {
                e.printStackTrace();
            }
        }
        System.out.println(result);
        request.setAttribute("result", result);
        RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
        dispatcher.forward(request, response);

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

File index.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <%
        String result = (String)request.getAttribute("result");
        if(result != null && !result.equals("")){
            out.print("Ket qua: " + result);
        }
    %>
    <form action="./Service" method="get">
        <div style="margin: 50px auto;">
            <div>
                id:  <input type="text" name="txtInput" />
            </div>
            <br />
            <div>
                value:  <input type="text" name="txtCache" />
            </div>
            <br /> <br /> <input type="submit" value="submit">
        </div>
    </form>
    <br />
    <br />
    <form action="./Service" method="get">
        <div style="margin: 50px auto;">
            <input type="text" name="txtName" /> <br /> <br /> <input
                type="submit" value="submit">
        </div>
    </form>
</body>
</html>
Project:

project jcs


Lợi ích chính của một bộ nhớ đệm là đối tượng có thể được lấy từ bộ nhớ nhanh hơn được tải từ một nguồn dữ liệu bên ngoài như cơ sở dữ liệu nằm hoặc trên mạng. Nhược điểm là cache có thể dùng một lượng đáng kể bộ nhớ. Nếu các đối tượng và các mẫu sử dụng không được phân tích kỹ lưỡng, bộ nhớ đệm có thể tạo một nút cổ chai vào ứng dụng của bạn. Bộ nhớ cache chỉ phù hợp khi bạn phân tích tốt các đối tượng của bạn khi đó JCS là một lựa chọn tuyệt vời.

0 comments:

Post a Comment