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