1.什么是memcached?
memcached 是一个自由开源的,高性能,分布式内存对象缓存系统,在内存存储能各种格式的数据,简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
2.特点
一种基于内存的key-value存储
配置简单
支持语言多
3.使用好处
通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
4.安装
这里演示安装在windows上的memcached
4.1 解压
→→
解压后,管理员身份运行命令提示符,进入memached解压路径,查看命令帮助:
4.2 安装到服务
然后使用命令: memcached.exe -d install 安装到服务。
服务列表:
4.3 开启服务
开启服务:
关闭服务:memcached.exe -d stop
卸载服务:memcached.exe -d uninstall
5.java使用memcached
先列出一个简单demo
1.导入一个memcached的jar:
2.存入demo :
3.取出demo:
demo结果:
下面是一个简单的MemcachedUtil, 具体步骤如下:
5.1 导入jar
5.2 代码
package ******
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;
public class MemcachedUtil {
/**
* Memcached客户端
*/
private static MemCachedClient cachedClient = new MemCachedClient();
/**
* 初始化连接池
*/
static {
// 获取连接池的实例
SockIOPool pool = SockIOPool.getInstance();
// 服务器列表及其权重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
// 设置服务器信息
pool.setServers(servers);
pool.setWeights(weights);
// 设置初始连接数,最小连接数,最大连接数,最大处理时间
pool.setInitConn(10);
pool.setMinConn(10);
pool.setMaxConn(1000);
pool.setMaxIdle(1000 * 60 * 60);
// 设置连接池守护线程的睡眠时间
pool.setMaintSleep(60);
// 设置TCP参数,连接超时
// 如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
pool.setNagle(false);
// Socket阻塞读取数据的超时时间
pool.setSocketTO(60);
// 连接建立时对超时的控制
pool.setSocketConnectTO(0);
// 初始化并启动连接池
pool.initialize();
if (cachedClient == null) {
cachedClient = new MemCachedClient();
cachedClient.setPrimitiveAsString(true); // 是否将基本类型转换为String方法
}
}
/**
* @description 向缓存添加键值对。注意:如果键已经存在,则之前的键对应的值将被替换。
* @author **
* @created 2016-5-30 上午8:11:39
* @param key
* @param value
* @return
*/
public static boolean set(String key, Object value) {
try {
return cachedClient.set(key, value);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除, 比如: new
* Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:如果键已经存在,
* 则之前的键对应的值将被替换。
* @author **
* @created 2016-5-30 上午8:12:58
* @param key
* @param value
* @param date
* @return
*/
public static boolean set(String key, Object value, Date date) {
try {
return cachedClient.set(key, value, date);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 向缓存添加键值对。注意:仅当缓存中不存在键时,才会添加成功。
* @author **
* @created 2016-5-30 上午8:22:55
* @param key
* @param value
* @return
*/
public static boolean add(String key, Object value) {
try {
if (get(key) != null) {
new Exception("Memcached缓存中已经存在该键值对");
return false;
} else {
return cachedClient.add(key, value);
}
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除, 比如: new
* Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。
* 注意:仅当缓存中不存在键时,才会添加成功。
* @author **
* @created 2016-5-30 上午8:28:31
* @param key
* @param value
* @param date
* @return
*/
public static boolean add(String key, Object value, Date date) {
try {
if (get(key) != null) {
new Exception("Memcached缓存中已经存在该键值对");
return false;
} else {
return cachedClient.add(key, value, date);
}
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 根据键来替换Memcached内存缓存中已有的对应的值。注意:只有该键存在时,才会替换键相应的值。
* @author **
* @created 2016-5-30 上午8:30:20
* @param key
* @param newValue
* @return
*/
public static boolean replace(String key, Object newValue) {
try {
return cachedClient.replace(key, newValue);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 根据键来替换Memcached内存缓存中已有的对应的值并设置逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,
* 比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。
* 注意:只有该键存在时,才会替换键相应的值。
* @author **
* @created 2016-5-30 上午8:31:31
* @param key
* @param newValue
* @param date
* @return
*/
public static boolean replace(String key, Object newValue, Date date) {
try {
return cachedClient.replace(key, newValue, date);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 根据键获取Memcached内存缓存管理系统中相应的值
* @author **
* @created 2016-5-30 上午8:16:06
* @param key
* @return
*/
public static Object get(String key) {
try {
return cachedClient.get(key);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached get方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return null;
}
}
/**
* @description 根据键删除memcached中的键/值对
* @author **
* @created 2016-5-30 上午8:17:07
* @param key
* @return
*/
public static boolean delete(String key) {
try {
return cachedClient.delete(key);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 根据键和逾期时间(例如:new Date(1000*10):十秒后过期)删除 memcached中的键/值对
* @author **
* @created 2016-5-30 上午8:18:11
* @param key
* @param date
* @return
*/
public static boolean delete(String key, Date date) {
try {
return cachedClient.delete(key, date);
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 清理缓存中的所有键/值对
* @author **
* @created 2016-5-30 上午8:19:20
* @return
*/
public static boolean flashAll() {
try {
return cachedClient.flushAll();
} catch (Exception e) {
MemcachedLogUtils.writeLog("Memcached flashAll方法报错\r\n" + exceptionWriter(e));
return false;
}
}
/**
* @description 返回string的异常类型
* @author **
* @created 2016-5-30 上午9:29:20
* @param exception
* @return
*/
private static String exceptionWriter(Exception exception) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
exception.printStackTrace(printWriter);
printWriter.flush();
return stringWriter.toString();
}
/**
* Title: MemcachedUtil.java Description: Memcached日志记录工具
*
* @author **
* @created 2016-5-30 上午10:11:26
*/
private static class MemcachedLogUtils {
// 创建字符输出流
private static FileWriter fileWriter;
// 创建缓冲
private static BufferedWriter logWriter;
// 通过找到对应的JVM进程获取PID
private final static String PID = ManagementFactory.getRuntimeMXBean().getName();
/**
* 日志写入流
*/
static {
try {
// 获取操作系统的名字
String osName = System.getProperty("os.name");
if (osName.contains("Windows")) {
/**
* 创建一个可以往文件中写入字符数据的字符流输出流对象 创建时必须明确文件的目的地
* 如果文件不存在,这回自动创建。如果文件存在,则会覆盖。 当路径错误时会抛异常
*
* 当在创建时加入true参数,回实现对文件的续写。
*/
fileWriter = new FileWriter("E:\\memcached\\memcached.log", true);
}
logWriter = new BufferedWriter(fileWriter);
} catch (IOException iOException) {
iOException.printStackTrace();
try {
if (fileWriter != null) {
fileWriter.close();
}
if (logWriter != null) {
logWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @description 写入日志信息
* @author **
* @created 2016-5-30 上午9:57:41
* @param logContent
*/
public static void writeLog(String logContent) {
try {
logWriter.write("[" + PID + "] " + "- ["
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]\r\n" + logContent);
logWriter.newLine();
logWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5.3 测试
测试String
代码:
结果:
测试JavaBean
先贴出javaBean
代码:
结果:
测试List
代码:
结果:
测试Map
代码:
结果:
注:因能力有限,如有不对之处请指正,谢谢