1. 程式人生 > >Memcached 分散式記憶體物件快取系統在Java Web專案收藏欄中的使用

Memcached 分散式記憶體物件快取系統在Java Web專案收藏欄中的使用

Memcached工具類程式碼
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

import java.util.ArrayList;
import java.util.List;

/**
 * Memcached工具類
 */
public class MemcachedUtils {

    static MemCachedClient client = null;

    static String[] connectUrls = new String[]{"127.0.0.1:11211"};

    
static { String[] attr = connectUrls; client = new MemCachedClient(); //獲取連線池的單態方法 SockIOPool pool = SockIOPool.getInstance(); //獲得Memcached伺服器的地址 pool.setServers(attr); //設定每個Memcached伺服器的權重 pool.setWeights(new Integer[]{3}); //連線池的配置 pool.setInitConn(5); pool.setMinConn(
5);//最小個數 pool.setMaxConn(200);//最大格式 pool.setMaxIdle(1000 * 30 * 30);//空閒等待時間 pool.setMaintSleep(30);//連線池維護執行緒的等待時間 pool.setNagle(false);//不啟用nagel演算法 pool.setSocketConnectTO(30);//超時等待時間 pool.initialize();//初始化 } public static void add(String key, Object object) { client.set(key, object);
//通過鍵值對存放資料 } public static void del(String key) { client.delete(key);//刪除資料 } public static Object get(String key) { return client.get(key);//獲取資料 } //測試Memcached public static void main(String args[]) { List<String> name = new ArrayList<String>(); name.add("1111"); name.add("2222"); name.add("3333"); name.add("4444"); name.add("5555"); name.add("6666"); add("name", name);//新增資料到Memcached List<String> test = (List<String>) get("name");//從Memcached中讀取資料 System.out.print(test);//列印資料 } }

收藏欄的Servlet程式碼:

import cn.buy.entity.Product;
import cn.buy.entity.User;
import cn.buy.service.product.Impl.ProductServiceImpl;
import cn.buy.service.product.ProductService;
import cn.buy.utils.EmptyUtils;
import cn.buy.utils.MemcachedUtils;
import cn.buy.utils.ReturnResult;
import cn.buy.web.AbstractServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * 我的收藏
 */
@WebServlet(urlPatterns = {"/Favorite"}, name = "Favorite")
public class FavoriteServlet extends AbstractServlet {


    private ProductService productService;

    public void init() throws ServletException {
        productService = new ProductServiceImpl();
    }

    @Override
    public Class getServletClass() {
        return FavoriteServlet.class;
    }

    /**
     * 跳轉到歷史記錄
     *
     * @param request
     * @param response
     * @return
     */
    public String toFavoriteList(HttpServletRequest request, HttpServletResponse response) throws Exception {
        List<Product> recentProducts = queryFavoriteList(request);
        request.setAttribute("recentProducts", recentProducts);
        return "/pre/product/favoriteList";
    }

    /**
     * 新增到收藏
     *
     * @return
     */
    public ReturnResult addFavorite(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ReturnResult result = new ReturnResult();
        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");
        Product product = productService.findById(id);
        List<Product> favoriteList = queryFavoriteList(request);
        //判斷是收藏否滿了(設定最多收藏三個商品),如果大於三個將第一個移除,然後向後面繼續新增
        if (favoriteList.size() > 0 && favoriteList.size() == 3) {
            favoriteList.remove(0);
        }
        boolean temp = false;
        for (int i = 0; i < favoriteList.size(); i++) {
            //收藏欄中的商品id和將要收藏的商品id相同
            if (favoriteList.get(i).getId().equals(product.getId())) {
                temp = true;
                break;
            }
        }
        if (!temp) {
            favoriteList.add(favoriteList.size(), product);
        }
        MemcachedUtils.add(getFavoriteKey(request), favoriteList);
        result.returnSuccess();
        return result;
    }

    /**
     * 查詢最近商品
     *
     * @return
     */
    private List<Product> queryFavoriteList(HttpServletRequest request) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("loginUser");
        //判斷使用者是否登入
        String key = EmptyUtils.isEmpty(user) ? session.getId() : user.getLoginName();
        List<Product> recentProducts = (List<Product>) MemcachedUtils.get(key);
        if (EmptyUtils.isEmpty(recentProducts)) {
            recentProducts = new ArrayList<Product>();
        }
        return recentProducts;
    }

    /**
     * @param request
     * @return
     */
    private String getFavoriteKey(HttpServletRequest request) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("loginUser");
        return EmptyUtils.isEmpty(user) ? session.getId() : user.getLoginName();
    }
}

附加:memcached win10下的使用方式:

  首先,下載memcached:

    memcached <1.4.5 版本安裝

      1、解壓下載的安裝包到指定目錄。

      2、在 1.4.5 版本以前 memcached 可以作為一個服務安裝,使用管理員許可權執行以下命令:

          c:\memcached\memcached.exe -d install

          注意1:你需要使用真實的路徑替代 c:\memcached\memcached.exe。

          注意2:提示下面的錯誤的解決方案:找到cmd.exe以管理員的身份執行就可以了,(下面的錯誤是因為沒有許可權)。

                

      3、然後我們可以使用以下命令來啟動和關閉 memcached 服務:

           c:\memcached\memcached.exe -d start

          c:\memcached\memcached.exe -d stop

        注:檢視是否啟動成功,在命令列中輸入如下程式碼:

                                      

          回車後執行效果如下:紅框中11211(11211為memcached的IP)埠被監聽,表示啟動成功。

             

      4、如果要修改 memcached 的配置項, 可以在命令列中執行 regedit.exe 命令開啟登錄檔並找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 來進行修改。

        如果要提供 memcached 使用的快取配置 可以修改 ImagePath 為:

             "c:\memcached\memcached.exe" -d runservice -m 512    注:-m 512 意思是設定 memcached 最大的快取配置為512M。

         此外我們還可以通過使用 "c:\memcached\memcached.exe -h" 命令檢視更多的引數配置。

       5、如果我們需要解除安裝 memcached ,可以使用以下命令:

             c:\memcached\memcached.exe -d uninstall