文档章节

Memcached使用实例

gulf
 gulf
发布于 2017/02/17 13:23
字数 1318
阅读 27
收藏 0
点赞 0
评论 0
package com.memcached.util;

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 gulf
*/
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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	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 javaagent
	 */
	public static boolean flashAll() {
		try {
			return memCachedClient.flushAll();
		} catch (Exception e) {
			MemcachedLogUtils.writeLog("Memcached flashAll方法报错\r\n" + exceptionWrite(e));
			return false;
		}
	}

	/**
	 * 返回String类型的异常栈信息
	 * 
	 * @author javaagent
	 */
	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 javaagent
	 */
	private static class MemcachedLogUtils {

		private static FileWriter fileWriter;
		private static BufferedWriter logWrite;
		private final static String PID = ManagementFactory.getRuntimeMXBean().getName();// 通过找到对应的JVM进程获取PID

		/**
		 * 初始化Memcached日志写入流
		 * 
		 * @author javaagent
		 */
		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 javaagent
		 */
		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();
			}
		}
	}
}

 

© 著作权归作者所有

共有 人打赏支持
gulf
粉丝 10
博文 258
码字总数 151079
作品 0
广州
程序员
服务器后端开发系列——《实战Memcached内存缓存系统》

1、实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序。 2、实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient 内容:以Mem...

晨曦之光 ⋅ 2012/04/24 ⋅ 0

nginx+memcached构建页面缓存应用

一.前言 nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcached...

NorthBoy ⋅ 2013/08/27 ⋅ 0

Firefly官方教程之DBentrust使用文档

1、dbentrust说明 该模块主要是对数据库与memcached存储的处理。里面封装了从memcached数据到python对象的映射。可以以操纵python对象的方式进行memcached中存储的数据的操作,只要在不同的进...

jiumiao3 ⋅ 2013/09/26 ⋅ 0

Memcached基础知识

Memcached参考 Memcached的客户端是线程完全的(Memcache-java-client) Memcached的安全主要通过防火墙,操作系统来保障,本身无安全设定策略 Memcached的L参数,指的是Memcached所在的机器...

zhouyc ⋅ 2015/07/15 ⋅ 0

使用 memcached 提升站点性能

简介 memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践。这包括应该存储或不应存储哪些、如何处理数据的灵活分布以 及如何调节用来更新...

红薯 ⋅ 2010/09/07 ⋅ 4

缓存集群防止数据库井喷

使用缓存数据库可以有效的提升系统性能,但是基于由于缓存数据库的自身特性,相比起实例化数据库,在性能抖动,丢失方面,尤其是缓存失效的严重问题层面,处理不足,及其容易带来,对底层数据...

引鸩怼孑 ⋅ 2015/10/08 ⋅ 0

安装和使用memcached

如何将 memcached 融入到您的环境中? 在开始安装和使用 using memcached 之前,我们需要了解如何将 memcached 融入到您的环境中。虽然在任何地方都可以使用 memcached,但我发现需要在数据库...

lyg945 ⋅ 2014/08/30 ⋅ 0

memcached 缓存服务器的使用

如何将 memcached 融入到您的环境中? 在开始安装和使用 using memcached 之前,我们需要了解如何将 memcached 融入到您的环境中。虽然在任何地方都可以使用 memcached,但我发现需要在数据库...

Jay_Wei ⋅ 2014/04/15 ⋅ 0

memcached 客户端编程

最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的...

newworld2010 ⋅ 2013/04/26 ⋅ 0

Memcached java简单实例

最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的...

李长春 ⋅ 2012/01/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

门面模式

1. 门面模式定义理解 是比较常用的封装模式,也称为外观模式; 标准定义:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface t...

liuyan_lc ⋅ 21分钟前 ⋅ 0

SpringCloud 微服务 (九) Spring Cloud Bus

壹 本篇结合上篇学习使用SpringCloud Bus结合MQ来实现自动刷新 上篇有远端git码云,本地git,config统一配置中心服务,order服务,product服务 过程: 启动服务时,config服务将远端git的配置拉取到...

___大侠 ⋅ 22分钟前 ⋅ 0

别被别人抢走了你的时间!

前两天,有读者在评论区给我留言,问我类似于 618、双十一这样的电商狂欢,我会参与么? 我给他的回复很直接,我很少参与这类活动,尤其是一些整点抢券的行为,更加不会参与,因为我的时间很...

古乙丁三雨 ⋅ 26分钟前 ⋅ 0

nginx开启gzip压缩JS文件失败?

检查下GZIP设置的压缩的文件类型有没有application/x-javascript,在服务器在传送JavaScript文件时使用的MIME类型通常是这个.

hang1989 ⋅ 27分钟前 ⋅ 0

DockOne微信分享(一二九):聊聊Service Mesh:linkerd

【编者的话】随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所...

xiaomin0322 ⋅ 31分钟前 ⋅ 0

linear regression

今天分享一个很经典的ML算法---LIner regression(线性回归) **线性回归(Linear regression)**是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归...

gfjjfuy112 ⋅ 34分钟前 ⋅ 0

百度地图使用经验-第1集:成功展现第1个地图

第1步:引入js(携带密钥) 第2步: 创建一个div 第3步: 写js 类: js自己的面向对象的特点; ES6 PHP,JAVA,C++ 插曲:事件 22小时前 事件和函数的区别: 函数是事先写好函数体,手工调用。...

宁哥实战课堂 ⋅ 36分钟前 ⋅ 0

sudo java : command not found

运行sudo java报错 $ sudo java$ sudo: java:找不到命令 解决方案: sudo命令后加-E,保留用户运行环境的环境变量。 sudo -E env PATH=$PATH java...

勇敢的飞石 ⋅ 38分钟前 ⋅ 0

ecs修改主机名称

https://help.aliyun.com/knowledge_detail/41305.html

张宏亮1982 ⋅ 40分钟前 ⋅ 0

扩展JS validate

if ($.validator) { //验证手机号码 $.validator.addMethod("phone", function (value, element, params) { return /^(1)[0-9]{10}$/.test(value); }, "请输入有效的......

熊猫你好 ⋅ 42分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部