zoukankan      html  css  js  c++  java
  • 分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用

    Memcached的客户端简介

    我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方。

    Memcached现在已被广泛使用,客户端实现也有较多的版本,基本上各个语言的都有。比如:Memcached client for Java、Spymemcached、xMemcached,各自有各自的优缺点。由于Memcached client for Java是Memcached官方发布的客户端,应用广泛,运行比较稳定,新版本在性能上也有所提高。我们接下来将使用该客户端进行实战演示。

    Memcached的客户端下载

    下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads

    Memcached的客户端使用

    下载下来的Memcached客户端有四个jar包,分别是:commons-pool-1.5.6.jar、java_memcached-release_2.6.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar。将这四个jar包添加到项目的构建路径即可。

    Memcached使用实例

    我们将以缓存菜单列表进行实例演示,当访问后台首页加载系统菜单列表时,先判断菜单列表是否存在memcached中,如果不存在则从数据读取系统菜单列表,并存到memcached,否则直接从memcached中读取。如下:

    //MemcachedFactory.java
     
    public class MemcachedFactory {
     
    // 创建MemCachedClient全局对象
    private static MemCachedClient memCachedClient = new MemCachedClient();
     
    static {
    // 创建服务器列表及其权重
    String[] servers = { "127.0.0.1:11211" };
    Integer[] weights = { 3 };
     
    // 创建Socket连接池
    SockIOPool pool = SockIOPool.getInstance();
     
    // 设置服务器信息
    pool.setServers(servers);
    pool.setWeights(weights);
    pool.setFailover(true);
     
    // 设置初始连接数、最小和最大连接数以及最大处理时间
    pool.setInitConn(5);
    pool.setMinConn(5);
    pool.setMaxConn(250);
    pool.setMaxIdle(1000 * 60 * 60 * 6);
     
    // 设置主线程睡眠时间
    pool.setMaintSleep(30);
     
    // 设置TCP参数、连接超时等
    pool.setNagle(false);
    pool.setSocketTO(3000);
    pool.setSocketConnectTO(0);
    pool.setAliveCheck(true);
     
    // 初始化连接池
    pool.initialize();
    }
     
    protected MemcachedFactory() {
    }
     
    // Memcached 实例
    protected static MemcachedFactory instance = new MemcachedFactory();
     
    public static MemcachedFactory getInstance() {
    return instance;
    }
     
    /**
    * 添加缓存记录
    * @param key
    * @param value
    * @return
    */
    public boolean add(String key, Object value) {
    return memCachedClient.add(key, value);
    }
     
    /**
    * 添加缓存记录,有效期为expiry
    * @param key
    * @param value
    * @param expiry
    * @return
    */
    public boolean add(String key, Object value, Date expiry) {
    return memCachedClient.add(key, value, expiry);
    }
     
    /**
    * 缓存查询结果对象QueryResult
    * @param key
    * @param value
    * @return
    */
    public boolean add(String key, QueryResult<Menu> value) {
    return memCachedClient.add(key, value);
    }
     
    /**
    * 提取缓存记录
    * @param key
    * @return
    */
    public Object get(String key) {
    return memCachedClient.get(key);
    }
     
    /**
    * 判断缓存是否存在
    * @param key
    * @return
    */
    public boolean keyExist(String key) {
    return memCachedClient.keyExists(key);
    }
    }
     
    IndexController.java
     
    @Controller
    public class IndexCtroller{
    @Autowired
    private IIndexService indexService;
     
     
    @RequestMapping(value = "/back/index")
    public String index(HttpServletRequest request) {
    MemcachedFactory mcInstance = MemcachedFactory.getInstance();
    String jsonTree = null;
     
    //不存在key缓存记录则查询数据库并添加存入memcached
    if(!mcInstance.keyExist("jsonTree")) {
       List<Menu> menuList = indexService.queryMenu();
       List2JsonUtil<Menu> list2JsonUtil = new List2JsonUtil<Menu>(new Menu());
       jsonTree = list2JsonUtil.getJosnStrFromList(menuList, null);
       mcInstance.add("jsonTree", jsonTree);
    //否则直接从memcached中提取
    }else {
       jsonTree = (String) mcInstance.get("jsonTree");
    }
     
    if(null != jsonTree){
      request.setAttribute("jsonTree", jsonTree);
    }
    return "/back/index";
    }
    }

    页面效果

     

     

     

    首次从数据库读取菜单列表耗时

     

    我们注释掉IndexController.java中memcached的相关代码来看看首次从数据库读取菜单列表耗时。

    从上图可以看到,首次访问数据加载菜单列表耗时1.17s,这些时间包括从数据库查询记录和将查询结果转为json格式数据的时间。

     

    首次从memcached读取菜单列表耗时

     

    放开IndexController.java中memcached的相关代码,来看看首次从memcached读取菜单列表耗时。

     

    从上图可以看到,当菜单列表已经存入memcached中后,首次从memcached读取菜单列表的耗时21.970ms,这里省去了从数据库查询记录和将查询结果转为json格式数据的耗时。显然,从首次访问数据库和和首次访问memcached来看,响应速度确实快了不少。在memcached后台,我们看到了存取菜单列表jsonTree的信息,如下:

     

    上面的读取菜单列表的耗时可能并不是很准确,由于浏览器等各方面因素的影响,随着访问频率的增加,访问数据库和访问memcached的耗时都会减少,然后在某一个范围内波动。但可以确定的是,访问memcached省去了从数据库查询记录和将查询结果转为json格式数据的耗时,减少了数据库的访问频率和服务器的压力。

  • 相关阅读:
    leetCode 116.Populating Next Right Pointers in Each Node (为节点填充右指针) 解题思路和方法
    最终考过了驾照考试,如今就=驾照下来了
    JSON.parseObject的几种用法
    mybatisplus构造器 condition
    MyBatis中jdbcType=INTEGER、VARCHAR作用
    mybatis动态sql
    数据库表可以没有外键
    msyql的子查询,或者叫嵌套查询
    mysql 的编写顺序和执行顺序
    StringUtils的isBlank()方法
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/6387492.html
Copyright © 2011-2022 走看看