2011-11-10 20:45:26  浏览:6152

gae 缓存

google 的appengine出新政策啦,真让人蛋疼,尤其是数据库读取率,一不小心就用完了

导致我的博客断断续续维持了几天,

突然有天看到徐明的博客上,有人说可以用缓存机制来减少数据库访问量

于是乎,翻天覆地的找信息

最终还是在google的官网上,看到缓存的用法

慢慢做了之后,发现效果还不错,

中途,还是遇到了不少麻烦,例如:cache中,不能直接放list数组,但是可以放单个对象和map

于是自己封装一下处理类,经过测试,还可以

在这里贴一部分代码出来,仅供参考


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jsr107cache.Cache;
import net.sf.jsr107cache.CacheException;
import net.sf.jsr107cache.CacheFactory;
import net.sf.jsr107cache.CacheManager;

import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.jsr107cache.GCacheFactory;
import com.google.choujone.blog.entity.User;
import java.lang.reflect.*;

/**
 * choujone'blog

 * 功能描述:缓存处理类 2011-11-9
 * 官方地址:http://code.google.com/intl/zh-CN/appengine/docs/java/memcache/usingjcache.html

 */
public class MyCache {
        public static Cache cache;
        private static CacheFactory cacheFactory;
        private static Map props = new HashMap();
//程序启动时,初始化缓存
        static {
                try {
                        props.put(GCacheFactory.EXPIRATION_DELTA, 3600);// 3600秒后过期
                        props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true);// 如果不存在具有该键的值,则添加该值;如果存在具有该键的值,则不执行任何操作

                        cacheFactory = CacheManager.getInstance().getCacheFactory();
                        cache = cacheFactory.createCache(props);
                        System.out.println("启动缓存");
                } catch (CacheException e) {
                        System.out.println("初始化缓存失败!");
                }
        }

        /**
         * 获取缓存yoyo提供的代码
         *
         * @return
         */
        public static Cache getCache() {
                if (cache == null) {
                        try {
                                CacheFactory factory = CacheManager.getInstance()
                                                .getCacheFactory();
                                cache = factory.createCache(Collections.emptyMap());
                        } catch (CacheException e) {
                                e.printStackTrace();
                        }
                }
                return cache;
        }

        /**
         * 专门存放list数组
         *
         * @param
         * @param list
         */
        public static <T> void put(String key, List<T> list) {
                Map<Integer, T> tmap = new HashMap<Integer, T>();
                if (list != null) {
                        // 转换list为数组
                        Integer count = 1;
                        for (T t : list) {
                                tmap.put(count, t);
                                count++;
                        }
                        // 把数组放入缓存中
                        cache.put(key, tmap);
                }
        }

        /**
         * 取值(仅限于需要存list的地方)
         *
         * @param
         * @param key
         * @return
         */
        public static <T> List<T> get(String key) {
                Map<Integer, T> tmap = new HashMap<Integer, T>();
                List<T> list = null;
                tmap = (Map<Integer, T>) cache.get(key);
                if (tmap != null && tmap.size() > 0) {
                        list = new ArrayList<T>();
                        for (Integer c : tmap.keySet()) {
                                list.add(tmap.get(c));
                        }
                }
                return list;
        }

        /**
         * 更新缓存列表
         * 作用:不用访问数据库,直接更新缓存,
         * @param泛型对象
         * @param key 存入缓存中的键
         * @param entity 需要更新的对象
         */
        public static <T> void updateList(String key, T entity) {
                if (entity == null || key == null) {
                        return;
                }
                List<T> list = get(key);
                List<T> newList=new ArrayList<T>();//重新定义一个数组,保存更改之后的内容
                if (list != null && list.size() > 0) {
                        Long entiti_id = getId(entity);// 需要更新的内容
                        for (T t : list) {
                                Long id = getId(t);
                                if (id.equals(entiti_id)) {
                                        newList.add(entity);
                                }else{
                                        newList.add(t);
                                }
                        }
                }
                put(key, newList);// 放到缓存当中
        }

        /**
         * 清理缓存 这个方法没有用,以后可能会重新写
         *
         * @return
         */
        public static boolean refreshCache() {
                boolean flag = false;
                try {
                        cacheFactory = CacheManager.getInstance().getCacheFactory();
                        cache = cacheFactory.createCache(props);
                        flag = true;
                } catch (CacheException e) {
                        System.out.println("清理缓存失败!");
                        flag = false;
                }
                return flag;
        }

        /**
         * 获取编号
         *
         * @param
         * @param t
         * @return
         */
        private static <T> Long getId(T t) {
                Long id = -1L;
                Class c = t.getClass();
                try {
                        Method m = c.getDeclaredMethod("getId", new Class[] {});
                        id = (Long) m.invoke(t, new Class[] {});
                } catch (SecurityException e) {
                        e.printStackTrace();
                } catch (NoSuchMethodException e) {
                        e.printStackTrace();
  &nbs

返回首页