import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.danga.MemCached.MemCachedClient;
import com.howbuy.common.utils.StringUtil;
/**
* @ClassName: MemcacheUtil
* @Description: 缓存操作工具类,缓存机制采用memcache,如果
* memcache缓存服务器异常,则采用本地缓存方式存储信息
* @author Polo Yuan lizhuan.yuan@howbuy.com
* @date 2013-5-31 下午04:28:50
*
*/
public class MemcacheUtil {
/**
* logger
*/
private static final Logger logger = LoggerFactory.getLogger(MemcacheUtil.class);
/**
* 本地缓存存储
*/
private static Map<String, Object> localCacheMap = new HashMap<String, Object>();
/**
* 本地缓存过期信息存储
*/
private static Map<String, Long> localCacheExpiryMap = new HashMap<String, Long>();
private static MemCachedClient memCachedClient = new MemCachedClient("memcache");
public static MemCachedClient getMemCachedClient() {
logger.info("memCache缓存服务器状态:" + (memCachedClient == null ? "异常" : "正常"));
return memCachedClient;
}
/**
* 根据键获取对象
* @param key 键
* @return Object 对象
*/
public static Object getObject(String key) {
Object obj = null;
if(StringUtil.isEmpty(key)) {
return obj;
}
MemCachedClient memCachedClient = getMemCachedClient();
if(null != memCachedClient) {
obj = memCachedClient.get(key);
} else {// 如果远端缓存出错
if(localCacheMap.containsKey(key)) {
obj = localCacheMap.get(key);
}
}
return obj;
}
/**
* 保存对象到缓存,保存为永久有效
* @param key 健
* @param obj 对象
*/
public static void saveObject(String key, Object obj) {
if(StringUtil.isEmpty(key) || null == obj) {
return;
}
MemCachedClient memCachedClient = getMemCachedClient();
if(null != memCachedClient) {
memCachedClient.set(key, obj);
} else {// 如果远端缓存出错
localCacheMap.put(key, obj);
}
}
/**
* 保存对象到缓存
* @param key 健
* @param obj 对象
* @param expiryTimes 过期时间,毫秒数,如果过期时间小于1000,则认为永久有效
*/
public static void saveObject(String key, Object obj, long expiryTimes) {
if(StringUtil.isEmpty(key) || null == obj) {
return;
}
if(expiryTimes < 1000) {// 如果过期时间小于1000,则认为永久有效
saveObject(key, obj);
}
MemCachedClient memCachedClient = getMemCachedClient();
if(null != memCachedClient) {
memCachedClient.set(key, obj, new Date(expiryTimes));
} else {// 如果远端缓存出错
localCacheMap.put(key, obj);
localCacheExpiryMap.put(key, System.currentTimeMillis() + expiryTimes);
}
}
/**
* 获取指定键的值是否过期
* @param key 健
* @param expiryTimes 过期时间,毫秒数
* @return boolean true:已过期,false:未过期
*/
public static boolean isHasExpired(String key, long expiryTimes) {
boolean isHasExpired = true;
if(StringUtil.isEmpty(key)) {
return isHasExpired;
}
MemCachedClient memCachedClient = getMemCachedClient();
if(null != memCachedClient) {
Object obj = memCachedClient.get(key);
if(null == obj) {// 如果已经过期
isHasExpired = true;
} else {// 没有过期就更新
saveObject(key, obj, expiryTimes);
isHasExpired = false;
}
} else {// 如果远端缓存出错
if(localCacheExpiryMap.containsKey(key)) {
long expiredTimes = localCacheExpiryMap.get(key);
if(expiredTimes < System.currentTimeMillis()) {// 如果已经过期
localCacheExpiryMap.remove(key);
localCacheMap.remove(key);
isHasExpired = true;
} else {// 没有过期就更新
Object obj = localCacheMap.get(key);
saveObject(key, obj, expiryTimes);
isHasExpired = false;
}
}
}
return isHasExpired;
}
/**
* 删除指定键的值
* @param key 键
*/
public static void removeObject(String key) {
if(StringUtil.isEmpty(key)) {
return;
}
MemCachedClient memCachedClient = getMemCachedClient();
if(null != memCachedClient) {
memCachedClient.delete(key);
} else {// 如果远端缓存出错
localCacheMap.remove(key);
localCacheExpiryMap.remove(key);
}
}
}
- 浏览: 269264 次
- 性别:
- 来自: 上海
最新评论
-
zuo_qin_bo:
if(df==null){ //这个地方并发多的情况 ...
ThreadLocal解决dateFormat多线程错误 -
kongnan93:
好文!赞一个!!!!
jquery blockUI 居中显示 -
cxc_110928:
如果加上不能出现连续的数字或者字母 如 1234 abcd ...
用java 匹配一个数字和字母密码的正则表达式 -
wzwahl36:
http://www.atool.org/json2javab ...
JSON和JAVA的POJO的相互转换
相关推荐
标题 "php5.3 _32位_redis_memcahce_sphinx扩展" 涉及的是在PHP 5.3 32位环境下安装和使用Redis、Memcache和Sphinx这三个扩展的过程。这些扩展是PHP与特定数据库和缓存系统交互的重要工具。 1. **Redis扩展**: ...
//创建多个memcache服务使用. //addServer 会根据负载均衡算法,自动放入每个服务器 $mem->add("name","zs",0,100); // $get_result = $mem->get('name'); // var_dump($get_result); echo "欧了"; ?>
Hibernate4集成memcache用jar合集 hibernate配置 <property name="hibernate.cache.region.factory_class">com.googlecode.hibernate.memcached.MemcachedRegionFactory</property>
解压后,运行`memcached.exe`可执行文件,通过命令行参数来设置监听端口、最大内存使用量等配置。例如,你可以用以下命令启动Memcached服务: ``` memcached.exe -d install -p 11211 -m 64 ``` 这将安装Memcached...
目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以...
2. **Java与Memcached的连接**: 在Java工程中,我们通常使用第三方库(如spymemcached或xmemcached)来实现与Memcached服务器的通信。这些库提供了简单的API,允许开发者方便地进行数据的设置(set)、获取(get)、...
单机比memcahced好的东西单机比memcahced好的东西
如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce。首先我们必须要安装,接下来如何使用memcache,有需要的朋友可以下载看看
kvs与memcahce的功能很相似,但是相对memcache来说更容易使用。 kvs提供基于http的接口, 用户可以通过浏览器直接get, set or delete. eg: http://127.0.0.1/set?key=foo&val=12345 添加一个key-value ...
包含最简单的memcache的使用,测试类MemCached.java; 在此基础上增加了memcahce和spring的整合,顺便使用了ibati,测试类SpringMemcacheTest.java 代码简洁,适合研究,参考
PHP5.3版本在windows下安装memcahce的时候报如下错误: PHP Warning: PHP Startup: memcache: Unable to initialize module Module compiled with module API=20090626, debug=0, thread-safety=0 ...
"nts"代表Non Thread Safe(非线程安全),意味着这个扩展不适用于多线程环境,而是在单线程或不使用线程的环境中运行。"vc14"表明它是用Visual C++ 2015 (VC++ 14)编译器构建的,这是Windows上PHP的一个常见编译...
一个php内存缓存Memcached类代码,构造方法,用于添加服务器并创建memcahced对象,获取memcached对象,检查mem是否连接成功,向memcache中添加数据,获取memcahce中保存的数据,删除和同一个表相关的所有缓存。
一个php内存缓存Memcached类代码,构造方法,用于添加服务器并创建memcahced对象,获取memcached对象,检查mem是否连接成功,向memcache中添加数据,获取memcahce中保存的数据,删除和同一个表相关的所有缓存。
压缩包内的"memcahce1.rar"和"memcache的源代码.txt"可能是项目源码的分卷或文档,前者可能包含源代码的压缩部分,后者可能是关于源代码的说明或者阅读指南。 总结,通过研究Memcached的源代码,我们可以深入理解其...