`

memcahce使用

 
阅读更多


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);
        }
    }
}

分享到:
评论

相关推荐

    php5.3 _32位_redis_memcahce_sphinx扩展

    标题 "php5.3 _32位_redis_memcahce_sphinx扩展" 涉及的是在PHP 5.3 32位环境下安装和使用Redis、Memcache和Sphinx这三个扩展的过程。这些扩展是PHP与特定数据库和缓存系统交互的重要工具。 1. **Redis扩展**: ...

    php_memcahce.dll大全

    //创建多个memcache服务使用. //addServer 会根据负载均衡算法,自动放入每个服务器 $mem-&gt;add("name","zs",0,100); // $get_result = $mem-&gt;get('name'); // var_dump($get_result); echo "欧了"; ?&gt;

    hibernte4集成memcahce

    Hibernate4集成memcache用jar合集 hibernate配置 &lt;property name="hibernate.cache.region.factory_class"&gt;com.googlecode.hibernate.memcached.MemcachedRegionFactory&lt;/property&gt;

    memcahce for windows

    解压后,运行`memcached.exe`可执行文件,通过命令行参数来设置监听端口、最大内存使用量等配置。例如,你可以用以下命令启动Memcached服务: ``` memcached.exe -d install -p 11211 -m 64 ``` 这将安装Memcached...

    memcache-2.2.5

    目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以...

    普通java工程测试连接memcached服务

    2. **Java与Memcached的连接**: 在Java工程中,我们通常使用第三方库(如spymemcached或xmemcached)来实现与Memcached服务器的通信。这些库提供了简单的API,允许开发者方便地进行数据的设置(set)、获取(get)、...

    单机比memcahced好的东西

    单机比memcahced好的东西单机比memcahced好的东西

    使用Memcache在PHP中调试方法的介绍及应用

    如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce。首先我们必须要安装,接下来如何使用memcache,有需要的朋友可以下载看看

    kvs 基于http的跨平台cache系统

    kvs与memcahce的功能很相似,但是相对memcache来说更容易使用。 kvs提供基于http的接口, 用户可以通过浏览器直接get, set or delete. eg: http://127.0.0.1/set?key=foo&val=12345 添加一个key-value ...

    Memcache+spring+ibatis例子,包含单纯memcache例子

    包含最简单的memcache的使用,测试类MemCached.java; 在此基础上增加了memcahce和spring的整合,顺便使用了ibati,测试类SpringMemcacheTest.java 代码简洁,适合研究,参考

    memcached1.2.6 & php_memcace.dll & php5.3 for windows

    PHP5.3版本在windows下安装memcahce的时候报如下错误: PHP Warning: PHP Startup: memcache: Unable to initialize module Module compiled with module API=20090626, debug=0, thread-safety=0 ...

    php7-memcache3.0.8-nts-vc14-x86扩展DLL

    "nts"代表Non Thread Safe(非线程安全),意味着这个扩展不适用于多线程环境,而是在单线程或不使用线程的环境中运行。"vc14"表明它是用Visual C++ 2015 (VC++ 14)编译器构建的,这是Windows上PHP的一个常见编译...

    php的内存缓存memcached类代码

    一个php内存缓存Memcached类代码,构造方法,用于添加服务器并创建memcahced对象,获取memcached对象,检查mem是否连接成功,向memcache中添加数据,获取memcahce中保存的数据,删除和同一个表相关的所有缓存。

    php的内存缓存memcached类代码.zip

    一个php内存缓存Memcached类代码,构造方法,用于添加服务器并创建memcahced对象,获取memcached对象,检查mem是否连接成功,向memcache中添加数据,获取memcahce中保存的数据,删除和同一个表相关的所有缓存。

    memcache的源代码.zip感觉自己水平高的,可以下载研究研究

    压缩包内的"memcahce1.rar"和"memcache的源代码.txt"可能是项目源码的分卷或文档,前者可能包含源代码的压缩部分,后者可能是关于源代码的说明或者阅读指南。 总结,通过研究Memcached的源代码,我们可以深入理解其...

Global site tag (gtag.js) - Google Analytics