经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Memcached 分布式内存对象缓存系统在Java Web项目收藏栏中的使用
来源:cnblogs  作者:逆風?飛翔  时间:2018/10/23 9:28:38  对本文有异议
 

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

Memcached 分布式内存对象缓存系统Memcached 工具类的代码如下:

  1. import com.danga.MemCached.MemCachedClient;
  2. import com.danga.MemCached.SockIOPool;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * Memcached工具类
  7. */
  8. public class MemcachedUtils {
  9. static MemCachedClient client = null;
  10. static String[] connectUrls = new String[]{"127.0.0.1:11211"};
  11. static {
  12. String[] attr = connectUrls;
  13. client = new MemCachedClient();
  14. //获取连接池的单态方法
  15. SockIOPool pool = SockIOPool.getInstance();
  16. //获得Memcached服务器的地址
  17. pool.setServers(attr);
  18. //设置每个Memcached服务器的权重
  19. pool.setWeights(new Integer[]{3});
  20. //连接池的配置
  21. pool.setInitConn(5);
  22. pool.setMinConn(5);//最小个数
  23. pool.setMaxConn(200);//最大格式
  24. pool.setMaxIdle(1000 * 30 * 30);//空闲等待时间
  25. pool.setMaintSleep(30);//连接池维护线程的等待时间
  26. pool.setNagle(false);//不启用nagel算法
  27. pool.setSocketConnectTO(30);//超时等待时间
  28. pool.initialize();//初始化
  29. }
  30. public static void add(String key, Object object) {
  31. client.set(key, object);//通过键值对存放数据
  32. }
  33. public static void del(String key) {
  34. client.delete(key);//删除数据
  35. }
  36. public static Object get(String key) {
  37. return client.get(key);//获取数据
  38. }
  39. //测试Memcached
  40. public static void main(String args[]) {
  41. List<String> name = new ArrayList<String>();
  42. name.add("1111");
  43. name.add("2222");
  44. name.add("3333");
  45. name.add("4444");
  46. name.add("5555");
  47. name.add("6666");
  48. add("name", name);//添加数据到Memcached
  49. List<String> test = (List<String>) get("name");//从Memcached中读取数据
  50. System.out.print(test);//打印数据
  51. }
  52. }

收藏栏的Servlet(对商品进行收藏的操作)代码如下:

  1. import cn.buy.entity.Product;
  2. import cn.buy.entity.User;
  3. import cn.buy.service.product.Impl.ProductServiceImpl;
  4. import cn.buy.service.product.ProductService;
  5. import cn.buy.utils.EmptyUtils;
  6. import cn.buy.utils.MemcachedUtils;
  7. import cn.buy.utils.ReturnResult;
  8. import cn.buy.web.AbstractServlet;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. import java.io.PrintWriter;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. /**
  18. * 我的收藏
  19. */
  20. @WebServlet(urlPatterns = {"/Favorite"}, name = "Favorite")
  21. public class FavoriteServlet extends AbstractServlet {
  22. private ProductService productService;
  23. public void init() throws ServletException {
  24. productService = new ProductServiceImpl();
  25. }
  26. @Override
  27. public Class getServletClass() {
  28. return FavoriteServlet.class;
  29. }
  30. /**
  31. * 跳转到历史记录
  32. *
  33. * @param request
  34. * @param response
  35. * @return
  36. */
  37. public String toFavoriteList(HttpServletRequest request, HttpServletResponse response) throws Exception {
  38. List<Product> recentProducts = queryFavoriteList(request);
  39. request.setAttribute("recentProducts", recentProducts);
  40. return "/pre/product/favoriteList";
  41. }
  42. /**
  43. * 添加到收藏
  44. *
  45. * @return
  46. */
  47. public ReturnResult addFavorite(HttpServletRequest request, HttpServletResponse response) throws Exception {
  48. ReturnResult result = new ReturnResult();
  49. PrintWriter out = response.getWriter();
  50. String id = request.getParameter("id");
  51. Product product = productService.findById(id);
  52. List<Product> favoriteList = queryFavoriteList(request);
  53. //判断是收藏否满了(设置最多收藏三个商品),如果大于三个将第一个移除,然后向后面继续添加
  54. if (favoriteList.size() > 0 && favoriteList.size() == 3) {
  55. favoriteList.remove(0);
  56. }
  57. boolean temp = false;
  58. for (int i = 0; i < favoriteList.size(); i++) {
  59. //收藏栏中的商品id和将要收藏的商品id相同
  60. if (favoriteList.get(i).getId().equals(product.getId())) {
  61. temp = true;
  62. break;
  63. }
  64. }
  65. if (!temp) {
  66. favoriteList.add(favoriteList.size(), product);
  67. }
  68. MemcachedUtils.add(getFavoriteKey(request), favoriteList);
  69. result.returnSuccess();
  70. return result;
  71. }
  72. /**
  73. * 查询最近商品
  74. *
  75. * @return
  76. */
  77. private List<Product> queryFavoriteList(HttpServletRequest request) throws Exception {
  78. HttpSession session = request.getSession();
  79. User user = (User) session.getAttribute("loginUser");
  80. //判断用户是否登录
  81. String key = EmptyUtils.isEmpty(user) ? session.getId() : user.getLoginName();
  82. List<Product> recentProducts = (List<Product>) MemcachedUtils.get(key);
  83. if (EmptyUtils.isEmpty(recentProducts)) {
  84. recentProducts = new ArrayList<Product>();
  85. }
  86. return recentProducts;
  87. }
  88. /**
  89. * @param request
  90. * @return
  91. */
  92. private String getFavoriteKey(HttpServletRequest request) throws Exception {
  93. HttpSession session = request.getSession();
  94. User user = (User) session.getAttribute("loginUser");
  95. return EmptyUtils.isEmpty(user) ? session.getId() : user.getLoginName();
  96. }
  97. }

 

附加: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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号