memcached教程

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

代码:


结果:




注:因能力有限,如有不对之处请指正,谢谢


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值