Memcached 分布式内存对象缓存系统在Java Web项目收藏栏中的使用


 

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


作者:逆風〠飛翔,发布于:2018/10/22
原文:https://www.cnblogs.com/HQING/p/9833327.html