发表于: 2017-07-31 23:47:54

4 878


今天完成的事:

       复习了一下SpringMVC的配置

       添加MemCacheUtil类,思路是通过key查询缓存如果缓存存在则输出,如果缓存里不存在则查询数据库,如果结果为null,返回null,如果有数据就添加到缓存

     实现是在service层,需要重写service接口

package com.fanchen.service;

import java.util.List;

import com.fanchen.pojo.Category;

public interface CategoryService {

int add(Category category);

   void delete(int id);

   Category get(Category category);

   int update(Category category);

   List<Category> list();

}

      

   @Override
   public Category get(Category category) {
System.out.println("在缓存中寻找");
       Category c=new Category();
//        设置key
       String key = "category_id(" + category.getId() + ")";
//        通过key获取Category对象
       c = (Category) MemcachedUtil.get(key);
//            在缓存中寻找key
       if (c == null) {
//             如果没找到
           c = categoryMapper.get(category);
//            在数据库里找
           if (c != null) {
System.out.println("在数据库中找到并添加到缓存");
//            如果在数据库中找到,就放人缓存里
               MemcachedUtil.set(key, c,new Date(1000*64*10));
           }
}
return c;
   }

       然后是MemcacheUtil类,从散修大师兄哪里抄来的,我只用了add方法

package com.fanchen.util;

import java.util.Date;

import org.apache.log4j.Logger;

import com.whalin.MemCached.MemCachedClient;

/**
* @author
* @ClassName: MemcachedUtil
* @Description: Memcached工具类
* @date 2015-8-6
*/
public class MemcachedUtil {
private static final Logger logger = Logger.getLogger(MemcachedUtil.class);

   private static MemCachedClient cachedClient;

   static {
if (cachedClient == null)
//括号中的名称要和配置文件memcached-context.xml中的名称一致
           cachedClient = new MemCachedClient("memcachedPool");
   }

private MemcachedUtil() {
}

/**
    * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
    *
    * @param key  
    * @param value
    * @return
    */

   public static boolean set(String key, Object value) {
return setExp(key, value, null);
   }

/**
    * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   public static boolean set(String key, Object value, Date expire) {
return setExp(key, value, expire);
   }

/**
    * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   private static boolean setExp(String key, Object value, Date expire) {
boolean flag = false;
       try {
flag = cachedClient.set(key, value, expire);
       } catch (Exception e) {
// 记录Memcached日志
           logger.error("Memcached set方法报错,key值:" + key + "\r\n");
       }
return flag;
   }

/**
    * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。
    *
    * @param key  
    * @param value
    * @return
    */
   public static boolean add(String key, Object value) {
return addExp(key, value, null);
   }

/**
    * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   public static boolean add(String key, Object value, Date expire) {
return addExp(key, value, expire);
   }

/**
    * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */

   private static boolean addExp(String key, Object value, Date expire) {
boolean flag = false;
       try {
flag = cachedClient.add(key, value, expire);
       } catch (Exception e) {
// 记录Memcached日志
           logger.error("Memcached add方法报错,key值:" + key + "\r\n");
       }
return flag;
   }

/**
    * 仅当键已经存在时,replace 命令才会替换缓存中的键。
    *
    * @param key  
    * @param value
    * @return
    */
   public static boolean replace(String key, Object value) {
return replaceExp(key, value, null);
   }

/**
    * 仅当键已经存在时,replace 命令才会替换缓存中的键。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   public static boolean replace(String key, Object value, Date expire) {
return replaceExp(key, value, expire);
   }

/**
    * 仅当键已经存在时,replace 命令才会替换缓存中的键。
    *
    * @param key    
    * @param value  
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   private static boolean replaceExp(String key, Object value, Date expire) {
boolean flag = false;
       try {
flag = cachedClient.replace(key, value, expire);
       } catch (Exception e) {
logger.error("Memcached replace方法报错,key值:" + key + "\r\n");
       }
return flag;
   }

/**
    * get 命令用于检索与之前添加的键值对相关的值。
    *
    * @param key
    * @return
    */
   public static Object get(String key) {
Object obj = null;
       try {
obj = cachedClient.get(key);
       } catch (Exception e) {
logger.error("Memcached get方法报错,key值:" + key + "\r\n");
       }
return obj;
   }

/**
    * 删除 memcached 中的任何现有值。
    *
    * @param key
    * @return
    */
   public static boolean delete(String key) {
return deleteExp(key, null);
   }

/**
    * 删除 memcached 中的任何现有值。
    *
    * @param key    
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   public static boolean delete(String key, Date expire) {
return deleteExp(key, expire);
   }

/**
    * 删除 memcached 中的任何现有值。
    *
    * @param key    
    * @param expire 过期时间 New Date(1000*10):十秒后过期
    * @return
    */
   private static boolean deleteExp(String key, Date expire) {
boolean flag = false;
       try {
flag = cachedClient.delete(key, expire);
       } catch (Exception e) {
logger.error("Memcached delete方法报错,key值:" + key + "\r\n");
       }
return flag;
   }

/**
    * 清理缓存中的所有键/值对
    *
    * @return
    */
   public static boolean flashAll() {
boolean flag = false;
       try {
flag = cachedClient.flushAll();
       } catch (Exception e) {
logger.error("Memcached flashAll方法报错\r\n");
       }
return flag;
   }
}

还需要相应的实体类

然后就是

这两个文件随便一百度多得是,就不贴了

需要在applicationContext.xml添加配置文件所在路径

<!--memcached配置文件位置-->
<import resource="classpath:memcached-content.xml"/>
<!--memcached的配置文件的配置文件路径-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="locations">
       <list>
           <value>classpath*:memcache.properties</value>
       </list>
   </property>
</bean>

最后是依赖

<dependency>
 <groupId>com.whalin</groupId>
 <artifactId>Memcached-Java-Client</artifactId>
 <version>3.0.0</version>
</dependency>

差不多就是这些吧,希望可以帮到后来者

然后是测试,CategoryMapper是不加缓存的CategoryService是加缓存的

@Controller
   public class FindController {

@Autowired
   CategoryMapper categoryMapper;
   @Autowired
   CategoryServiceImpl categoryService;
   @RequestMapping(value = "user/get",method = RequestMethod.POST)
   public String get(Category category,HttpServletRequest request){
   request.setAttribute("c",categoryService.get(category));
       return "getList";
   }
}

查询数据添加到缓存

然后在次查找就是直接在缓存中取

这是由缓存的

这是没加缓存的

500个请求差距就这么大

        然后学习Nginx负载均衡,之前学习过Nginx,但是没试过负载均衡,失败了明天再弄吧

源码明天放博客上

       wudihui.github.io

遇到的困难:

       添加缓存后每次查询都是读取数据库,后发现原因是配置文件没写(尴尬)

收获:

       学会配置Memcached

明天的计划:

      尝试在本地部署Nginx负载均衡,然后学习redis缓存,争取结束任务6


返回列表 返回列表
评论

    分享到