memcached教程

来源:互联网 发布:钓鱼 知乎 编辑:程序博客网 时间:2024/06/02 02:17

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进程获取PIDprivate 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 0
原创粉丝点击