发表于: 2017-11-05 23:44:03

1 694


今天完成的事情:

寻找一个memached工具类.并做细微改动.有些方法竟然是过时的,,稍作修改还没看逻辑,不知道改的对不对.


private static final Logger logger = Logger.getLogger(MemcachedUtils.class);
   private static MemCachedClient cachedClient;
   static {
if (cachedClient == null) {
//括号中的名称要和配置文件memcached-context.xml中的名称一致
           cachedClient = new MemCachedClient("applicationContext.xml");
       }
}

private MemcachedUtils() {}

/**
    * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
    *
    * @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) {
e.printStackTrace();
           logger.error("Memcached replace方法报错,key值:" + key + "\r\n" +
e.getMessage());
       }
return flag;
   }

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

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

/**
* 返回异常栈信息,String类型.
* @param e Exception
* @return boolean
*/
private static String exceptionWrite(Exception e) {
StringWriter sw = new StringWriter();
   PrintWriter pw = new PrintWriter(sw);
   e.printStackTrace(pw);
   pw.flush();
   return sw.toString();
}
/*@Test
public void testMemcachedSpring() {
   MemcachedUtils.set("aa", "bb", new Date(1000 * 60));
   Object obj = MemcachedUtils.get("aa");
   System.out.println("***************************");
   System.out.println(obj.toString());
}*/

}


使用memached做一个小demo,,根据网上的做了修改,将getBean改为注解方式,并玩了下断言..

   @Autowired
   MemCachedClient memCachedClient;

   @Test
   public void test(){
try {
//设置/获取
           memCachedClient.set( "wangzha","set/get", 3600);
           assertEquals("set/get", memCachedClient.get("wangzha"));
           //替换
           memCachedClient.replace("relace","wangzha",3600);
           assertEquals("relace", memCachedClient.get("wangzha"));
//            移除
           memCachedClient.delete("wangzha");
       }catch (Exception e){
e.printStackTrace();
        System.out.println( e.getMessage());
       }
}
}

学习了序列化..

大扫除...

组装架子...

开周会.  周日其他事情比较多.

晚上0.30测试  json页面 .极限就是68,,在网上就90%就太高了

测试home 极限为9线程

测试 所有all.所有学生信息.极限为18线程

明天计划 :

完成使用memcached,并做测试..


遇到的困难:

无法加载memcached.properties配置文件,memcached的连接配置文件池占位符不能成功加载memcached.properties中的配置

参考师兄之后解决方法是手填.


收获:

学习序列化

序列化 : 把对象转换 为二进制数据(如网络传输,存储数据库等),必须实现序列化接口 (java.io.Serializable).
持久化 : 把对象保存 在介质上(如写文件,读文件不是), 没有接口实现,一般指方法调用.

这里我们可以看出,实际上两者存在某种关系,即序列化只是为持久化提供了一个可能的前提而已,注意我这里只是说可能。

持久化其实是一个很宽泛的概念,任何程序将数据存放超过程序生命周期本身的时间长度,都可以称之为持久化,无论是以文件还是数据库的形式。

序列化,即将对象转化为二进制的数据,这个数据可以拿来存在本地硬盘上,也可以通过网络传输等等,Anyway,这仅仅只是Java为实现对象持久化提供的一个可能的前提而已。

由此可以看出,序列化和持久化本身不是一件事情,但是在Java的逻辑里,如若实现对象持久化,序列化则是必要前提。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

任务进度:任务6步骤1

任务开始时间:2017-11-4

预计demo时间:2017-11-12

是否有延期风险:暂无

禅道:http://task.ptteng.com/zentao/task-view-13091.html



返回列表 返回列表
评论

    分享到