最近写了一个购物商城的网站,考虑到收藏的数量庞大,如果将数据保存到数据库会对数据造成压力,所有在对商品进行收藏处理的时候使用了Memcached分布式系统,将收藏的商品保存到了内存中。
Memcached 分布式内存对象缓存系统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