Memcachedclientutils类

0.个人标签

我的CSDN博客地址: http://blog.csdn.net/caicongyang

1.依赖的jar包

commons-pool-1.5.6.jar

slf4j-api-1.6.1.jar

java_memcached-release_2.6.6.jar

slf4j-simple-1.6.1.jar

2.DangaMemCacheClient.java

package com.ccy.comm.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

/**
 * <p>
 * Title: DangaMemCacheClient.java
 * Package
 * </p>
 * <p>
 * Description: MemCacheClient Utils类
 * <p>
 * @author Tom.Cai
 * @created 2015-7-16 下午3:49:24
 * @version V1.0
 *
 */
public class DangaMemCacheClient {
	private static DangaMemCacheClient instance = null;
	private static ReentrantLock lock = new ReentrantLock();
	private MemCachedClient mc;
	private static int expTime = 3600 * 24 * 30;
	private static String address="192.168.253.132";
	private static String port="12000";

	public static DangaMemCacheClient getInstance() {
		if (instance == null) {
			lock.lock();
			try {
				if (instance == null) {
					instance = new DangaMemCacheClient();
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				lock.unlock();
			}
		}
		return instance;
	}

	private DangaMemCacheClient() {
		try {
			mc = new MemCachedClient();
			String[] servers = { address+":"+port };
			Integer[] weights = { 10 };

			SockIOPool pool = SockIOPool.getInstance();

			pool.setServers(servers);
			pool.setWeights(weights);

			pool.setInitConn(5);
			pool.setMinConn(5);
			pool.setMaxConn(250);
			pool.setMaxIdle(expTime);

			pool.setMaintSleep(30);

			pool.setNagle(false);
			pool.setSocketTO(30);
			pool.setSocketConnectTO(0);

			pool.initialize();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Object getObject(String key) {
		return mc.get(key);
	}

	public boolean setObject(String key, Object value) {
		return mc.set(key, value);
	}

	public boolean setObject(String key, Object value, long time) {
		return mc.set(key, value, new Date(time));
	}

	public boolean removeObject(String key) {
		return mc.delete(key);
	}

	/**
	 * 循环获取全部Memcache中的全部key
	 * @return
	 */
	public List<String> getKeys() {
		List<String> keyList = new ArrayList<String>();
		Map slabs = mc.statsItems();
		Iterator itemsItr = slabs.keySet().iterator();
		while (itemsItr.hasNext()) {
			String serverInfo1 = itemsItr.next().toString();
			// 取得這個server的各種 status [itemname:number:field=value]
			Map itemNames = (Map) slabs.get(serverInfo1);
			Iterator itemNameItr = itemNames.keySet().iterator();
			// 以status key值去迴圈
			while (itemNameItr.hasNext()) {
				String itemName = itemNameItr.next().toString();
				// 拆解status 欄位
				// itemAtt[0] = itemname
				// itemAtt[1] = CacheDump的参數
				// itemAtt[2] = field:number or age
				String[] itemAtt = itemName.split(":");
				if (itemAtt[2].startsWith("number")) {
					Map chcheDump = mc.statsCacheDump(Integer.parseInt(itemAtt[1]), 0);
					Iterator itr = chcheDump.keySet().iterator();
					int i = 0;
					while (itr.hasNext()) {
						String serverInfo2 = itr.next().toString();
						Map items = (Map) chcheDump.get(serverInfo2);
						Iterator keyItr = items.keySet().iterator();
						while (keyItr.hasNext()) {
							String key = keyItr.next().toString();
							String memKey = key;
							i++;
							try {
								key = URLDecoder.decode(key, "UTF-8");
								String value = ((String) items.get(memKey));
								value = value.substring(value.indexOf(";") + 2, value.indexOf(" s"));
								Date date = new Date();
								date.setTime(Long.valueOf(value + "000"));
								keyList.add(key);
							} catch (Exception ex) {
							}
						}

					}
				}
			}
		}
		return keyList;
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		DangaMemCacheClient dmcc = DangaMemCacheClient.getInstance();
		dmcc.setObject("ccy0", "test0");
		dmcc.setObject("ccy1", "test1");
		System.out.println((String)dmcc.getObject("ccy0"));
		System.out.println((String)dmcc.getObject("ccy1"));

		List<String> list = dmcc.getKeys();
		for(String key : list){
			System.out.println(key);
		}

	}
}

3.说明

本人将其写成一个工具来适用于仅仅缓存不存数据库的情况,当然能够写一个service在供spring来调用!

我的CSDN博客地址: http://blog.csdn.net/caicongyang

时间: 2024-12-19 19:12:55

Memcachedclientutils类的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys

类图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

Python-class类的相关总结

在Python中,所有的数据类型都可以视为对象,自定义的对象数据类型就是面向对象中的类(class)的概念. 面向对象编程:object oriented programming简称OOP. 1 ###简单举例,以登记学生的姓名和成绩举例 2 #!/usr/bin/python 3 #-*- coding:utf-8 -*- 4 class Student(object): ##定义student类 5 def __init__(self, name, score): ##__init__可以绑