Memcached 分布式内存对象缓存系统在Java Web项…
2018-10-23 03:05:27来源:博客园 阅读 ()
最近写了一个购物商城的网站,考虑到收藏商品的数量庞大,如果将数据保存到数据库会对数据库造成压力,所有在对商品进行收藏处理的时候使用了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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 聊聊微服务架构及分布式事务解决方案! 2020-06-10
- 作为一个面试官,我想问问你Redis分布式锁怎么搞? 2020-06-10
- 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教 2020-06-08
- 【从单体架构到分布式架构】(二)请求增多,单点变集群(1) 2020-06-07
- JVM系列之.JVM内存模型如何正确运用操作?本文详解 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash