本文复制其他播客,有好的技术文章希望各位大神能告知... 谢谢。

如何使用Java操作Memcached实例:

代码一:

package com.ghj.packageoftool;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.management.ManagementFactory;
import java.text.SimpleDateFormat;
import java.util.Date; import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool; /**
* Memcached工具类
*
* @author GaoHuanjie
*/
public class MemcachedUtils { private static MemCachedClient memCachedClient;
static {
/************************************配置Memcached**************************************/
SockIOPool sockIOPool = SockIOPool.getInstance(); sockIOPool.setServers(new String[]{"127.0.0.1:11211"});//设置memcached服务器地址
sockIOPool.setWeights(new Integer[]{3}); //设置每个MemCached服务器权重
sockIOPool.setFailover(true); //当一个memcached服务器失效的时候是否去连接另一个memcached服务器.
sockIOPool.setInitConn(10); //初始化时对每个服务器建立的连接数目
sockIOPool.setMinConn(10); //每个服务器建立最小的连接数
sockIOPool.setMaxConn(100); //每个服务器建立最大的连接数
sockIOPool.setMaintSleep(30); //自查线程周期进行工作,其每次休眠时间
sockIOPool.setNagle(false); //Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
sockIOPool.setSocketTO(3000); //Socket阻塞读取数据的超时时间
sockIOPool.setAliveCheck(true); //设置是否检查memcached服务器是否失效
sockIOPool.setMaxIdle(1000*30*30); // 设置最大处理时间
sockIOPool.setSocketConnectTO(0); //连接建立时对超时的控制 sockIOPool.initialize(); // 初始化连接池
if (memCachedClient == null){
memCachedClient = new MemCachedClient();
memCachedClient.setPrimitiveAsString(true); //是否将基本类型转换为String方法
}
} private MemcachedUtils() {
} /**
* 向缓存添加键值对。注意:如果键已经存在,则之前的键对应的值将被替换。
*
* @author GaoHuanjie
*/
public static boolean set(String key, Object value) {
try {
return memCachedClient.set(key, value);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:如果键已经存在,则之前的键对应的值将被替换。
*
* @author GaoHuanjie
*/
public static boolean set(String key, Object value, Date expire) {
try {
return memCachedClient.set(key, value, expire);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 向缓存添加键值对。注意:仅当缓存中不存在键时,才会添加成功。
*
* @author GaoHuanjie
*/
public static boolean add(String key, Object value) {
try {
if (get(key) != null) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
return false;
}else{
return memCachedClient.add(key, value);
}
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:仅当缓存中不存在键时,才会添加成功。
*
* @author GaoHuanjie
*/
public static boolean add(String key, Object value, Date expire) {
try {
if (get(key) != null) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
return false;
}else{
return memCachedClient.add(key, value, expire);
}
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 根据键来替换Memcached内存缓存中已有的对应的值。注意:只有该键存在时,才会替换键相应的值。
*
* @author GaoHuanjie
*/
public static boolean replace(String key, Object newValue) {
try {
return memCachedClient.replace(key, newValue);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 根据键来替换Memcached内存缓存中已有的对应的值并设置逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:只有该键存在时,才会替换键相应的值。
*
* @author GaoHuanjie
*/
public static boolean replace(String key, Object newValue, Date expireDate) {
try {
return memCachedClient.replace(key, newValue, expireDate);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 根据键获取Memcached内存缓存管理系统中相应的值
*
* @author GaoHuanjie
*/
public static Object get(String key) {
try {
return memCachedClient.get(key);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached get方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return null;
}
} /**
* 根据键删除memcached中的键/值对
*
* @author GaoHuanjie
*/
public static boolean delete(String key) {
try {
return memCachedClient.delete(key);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 根据键和逾期时间(例如:new Date(1000*10):十秒后过期)删除 memcached中的键/值对
*
* @author GaoHuanjie
*/
public static boolean delete(String key, Date expireDate) {
try {
return memCachedClient.delete(key, expireDate);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
return false;
}
} /**
* 清理缓存中的所有键/值对
*
* @author GaoHuanjie
*/
public static boolean flashAll() {
try {
return memCachedClient.flushAll();
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached flashAll方法报错\r\n" + exceptionWrite(e));
return false;
}
} /**
* 返回String类型的异常栈信息
*
* @author GaoHuanjie
*/
private static String exceptionWrite(Exception exception) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
exception.printStackTrace(printWriter);
printWriter.flush();
return stringWriter.toString();
} /**
* Memcached日志记录工具
*
* @author GaoHuanjie
*/
private static class MemcachedLogUtils { private static FileWriter fileWriter;
private static BufferedWriter logWrite;
private final static String PID = ManagementFactory.getRuntimeMXBean().getName();// 通过找到对应的JVM进程获取PID /**
* 初始化Memcached日志写入流
*
* @author GaoHuanjie
*/
static {
try {
String osName = System.getProperty("os.name");
if (osName.contains("Windows")) {
fileWriter = new FileWriter("D:\\memcached.log", true);
} else {
fileWriter = new FileWriter("/usr/local/logs/memcached.log", true);
}
logWrite = new BufferedWriter(fileWriter);
} catch (IOException iOException) {
iOException.printStackTrace();
try {
if (fileWriter != null) {
fileWriter.close();
}
if (logWrite != null) {
logWrite.close();
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
/**
* 写入日志信息
*
* @author GaoHuanjie
*/
public static void writeLog(String logContent) {
try {
logWrite.write("[" + PID + "] " + "- [" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]\r\n" + logContent);
logWrite.newLine();
logWrite.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

代码二:

package com.ghj.packageofclient;

import java.util.Date;

import junit.framework.TestCase;

import com.ghj.packageoftool.MemcachedUtils;

public class Client extends TestCase{

  /**
* 测试MemcachedUtils类的set方法。
*
* @author GaoHuanjie
*/
public static void testSet1() {
MemcachedUtils.set("set1Description", "调用MemcachedUtils类的set方法,没有设置键值对的存在时长");
System.out.println(MemcachedUtils.get("set1Description").toString());
} /**
* 测试MemcachedUtils类的set方法。
*
* @author GaoHuanjie
*/
public static void testSet2() {
MemcachedUtils.set("set2Description", "调用MemcachedUtils类的set方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
System.out.println(MemcachedUtils.get("set2Description").toString());
} /**
* 测试MemcachedUtils类的add方法。
*
* @author GaoHuanjie
*/
public static void testAdd1() {
MemcachedUtils.add("add1Description", "调用MemcachedUtils类的add方法,没有设置键值对的存在时长");
System.out.println(MemcachedUtils.get("add1Description").toString());
} /**
* 测试MemcachedUtils类的add方法。
*
* @author GaoHuanjie
*/
public static void testAdd2() {
MemcachedUtils.add("add2Description", "调用MemcachedUtils类的add方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
System.out.println(MemcachedUtils.get("add2Description").toString());
} /**
* 测试MemcachedUtils类的replace方法。
*
* @author GaoHuanjie
*/
public static void testReplace1() {
MemcachedUtils.add("replace1Description", "调用MemcachedUtils类的replace方法,没有设置键值对的存在时长");
MemcachedUtils.replace("replace1Description", "值改变了!!!");
System.out.println(MemcachedUtils.get("replace1Description").toString());
} /**
* 测试MemcachedUtils类的replace方法。
*
* @author GaoHuanjie
*/
public static void testReplace2() {
MemcachedUtils.add("replace2Description", "调用MemcachedUtils类的replace方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
MemcachedUtils.replace("replace2Description", "值改变了!!!", new Date(1000*60));
System.out.println(MemcachedUtils.get("replace2Description").toString());
} /**
* 测试MemcachedUtils类的get方法。
*
* @author GaoHuanjie
*/
public static void testGet() {
MemcachedUtils.add("getDescription", "调用MemcachedUtils类的get方法,没有设置键值对的存在时长");
System.out.println(MemcachedUtils.get("getDescription").toString());
} /**
* 测试MemcachedUtils类的delete方法。
*
* @author GaoHuanjie
*/
public static void testDelete1() {
MemcachedUtils.add("delete1Description", "调用MemcachedUtils类的delete方法,没有设置键值对的逾期时长");
MemcachedUtils.delete("delete1Description");
assertEquals(null, MemcachedUtils.get("delete1Description"));
} /**
* 测试MemcachedUtils类的delete方法。
*
* @author GaoHuanjie
*/
public static void testDelete2() {
MemcachedUtils.set("delete2Description1", "调用MemcachedUtils类的delete方法,设置键值对的逾期时长", new Date(600*1000));
MemcachedUtils.delete("delete2Description1", new Date(1000*600));
assertEquals(null, MemcachedUtils.get("delete2Description1"));
} /**
* 测试MemcachedUtils类的flashAll方法。
*
* @author GaoHuanjie
*/
public static void testFlashAll() {
MemcachedUtils.add("flashAllDescription", "调用MemcachedUtils类的delete方法,没有设置键值对的预期时长");
MemcachedUtils.flashAll();
assertEquals(null, MemcachedUtils.get("flashAllDescription"));
}
}

Java操作Memcached的更多相关文章

  1. memcached—Java操作Memcached实例

    前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; imp ...

  2. Java操作memcached(一)

    Memcached事实上,两次Hash算法    第一次hash算法被用于定位Memcached示例    第二次hash算法是底部HashMap中间hash算法 Hash算法      1.依据余数 ...

  3. Java操作memcache

    [本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...

  4. Redis基础知识、命令以及java操作Redis

    1 nosql的概念 sql:操作(关系型)数据库的标准查询语言 关系型数据库(rdbms):以关系(由行和列组成的二维表)模型为核心数据库,有表的储存系统.(mysql.oracle.sqlserv ...

  5. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  6. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  7. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  8. Java操作Oracle

    public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...

  9. JAVA操作ORACLE数据库的存储过程

    一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...

随机推荐

  1. 更新Cocos2D支持Xcode 7

    原文链接(有节选简写) Apple已经释放出Xcode7,给我们带来了Swift2和每个平台的最新版本支持.Cocos2D却还在等待更新去兼容Apple的改变.不幸的是,SpriteBuilder还未 ...

  2. android驱动例子(LED灯控制)

    本例子,讲述在android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导 要达到的效果:通过a ...

  3. Android官方技术文档翻译——开发工具的构建概述

    本文译自Android官方技术文档<Build Overview>,原文地址:http://tools.android.com/build. 因为<Android Lint Chec ...

  4. ServletRequest

    /** * Defines an object to provide client request information to a servlet. The * servlet container ...

  5. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  6. "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)

    本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...

  7. Emmet之html语法

    一.简写语法 Emmet 用和 CSS 选择器相似的语法来描述元素的嵌套层级关系和属性,实现 HTML/XML/CSS 等代码的智能自动补全. 其通过文件名后缀识别文件类型,从而使用对应的自动补全语法 ...

  8. Android 加载gif图片强大框架(支持预加载、缓存,还支持显示静态图片,一行代码全搞定)

    之前项目中没有涉及到显示gif图片的功能,也没有着重研究过,最近项目中要用到显示gif图片,于是就在网上一顿搜,用过之后发现如下几个缺点. 1.加载大的gif图片会出现oom. 2.没有预加载和缓存功 ...

  9. 小dai浅谈通信网络(一)——引子

    说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这么几句简单的话 ...

  10. Day7 面向对象和类的介绍

    面向对象讲解: ''' 面向过程: 核心是过程二字,过程指的是问题的解决步骤,基于过程去设计程序,就好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差 ...