WANG %!s(int64=6) %!d(string=hai) anos
pai
achega
b15efc6418

+ 17 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/DefaultFullObjectCacheController.java

@@ -0,0 +1,17 @@
+package cn.com.qmth.examcloud.web.cache;
+
+public class DefaultFullObjectCacheController implements FullObjectCacheController {
+
+	private Boolean allLoaded = false;
+
+	@Override
+	public boolean allLoaded() {
+		return allLoaded;
+	}
+
+	@Override
+	public void setAllLoaded(boolean allLoaded) {
+		this.allLoaded = allLoaded;
+	}
+
+}

+ 29 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/FullObjectCache.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.examcloud.web.cache;
+
+/**
+ * 全量对象缓存
+ *
+ * @author WANGWEI
+ * @date 2019年3月13日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ * @param <T>
+ */
+public interface FullObjectCache<T> extends ObjectCache<T> {
+
+	/**
+	 * 从数据源(数据库,配置文件等)加载所有缓存项
+	 *
+	 * @author WANGWEI
+	 * @return
+	 */
+	long loadAllFromResource();
+
+	/**
+	 * 获取全量缓存控制器
+	 *
+	 * @author WANGWEI
+	 * @return
+	 */
+	FullObjectCacheController getFullObjectCacheController();
+
+}

+ 28 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/FullObjectCacheController.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.examcloud.web.cache;
+
+/**
+ * 全量缓存控制器
+ *
+ * @author WANGWEI
+ * @date 2019年3月1日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public interface FullObjectCacheController {
+
+	/**
+	 * 缓存是否全部加载
+	 *
+	 * @author WANGWEI
+	 * @return
+	 */
+	public boolean allLoaded();
+
+	/**
+	 * 设置缓存是否全部加载
+	 *
+	 * @author WANGWEI
+	 * @param allLoaded
+	 */
+	public void setAllLoaded(boolean allLoaded);
+
+}

+ 112 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/FullObjectRedisCache.java

@@ -0,0 +1,112 @@
+package cn.com.qmth.examcloud.web.cache;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Arrays;
+
+import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.commons.helpers.ObjectHolder;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+/**
+ * 全量reids缓存
+ *
+ * @author WANGWEI
+ * @date 2019年3月13日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ * @param <T>
+ */
+public abstract class FullObjectRedisCache<T> implements FullObjectCache<T> {
+
+	protected abstract String getKeyPrefix();
+
+	private RedisClient redisClient;
+
+	private FullObjectCacheController fullObjectCacheController = new DefaultFullObjectCacheController();
+
+	private RedisClient getRedisClient() {
+		if (null == redisClient) {
+			redisClient = SpringContextHolder.getBean(RedisClient.class);
+		}
+		return redisClient;
+	}
+
+	protected String buildKey(Object... keys) {
+		String key = getKeyPrefix() + StringUtils.join(Arrays.asList(keys), '_');
+		return key;
+	}
+
+	private T getFromCache(String key) {
+		Object object = getRedisClient().get(key, Object.class);
+		@SuppressWarnings("unchecked")
+		T t = (T) object;
+		return t;
+	}
+
+	@Override
+	public T get(Object... keys) {
+		String key = buildKey(keys);
+		T t = getFromCache(key);
+		if (null == t) {
+			if (getFullObjectCacheController().allLoaded()) {
+				return t;
+			} else {
+				refresh(keys);
+				t = getFromCache(key);
+				return t;
+			}
+		} else {
+			return t;
+		}
+	}
+
+	@Override
+	public void remove(Object... keys) {
+		String key = buildKey(keys);
+		getRedisClient().delete(key);
+	}
+
+	@Override
+	public void refresh(Object... keys) {
+		String key = buildKey(keys);
+		T t = null;
+		try {
+			t = loadFromResource(keys);
+		} catch (Exception e) {
+			throw new ExamCloudRuntimeException("fail to load data. key=" + key, e);
+		}
+		if (null != t) {
+			getRedisClient().set(key, t);
+		} else {
+			getRedisClient().delete(key);
+		}
+	}
+
+	protected abstract List<Object[]> getKeys(final ObjectHolder<Long> beginIndex,
+			final ObjectHolder<Boolean> empty);
+
+	@Override
+	public long loadAllFromResource() {
+		final ObjectHolder<Long> beginIndex = new ObjectHolder<Long>(null);
+		final ObjectHolder<Boolean> empty = new ObjectHolder<Boolean>(false);
+		while (true) {
+			List<Object[]> keysList = getKeys(beginIndex, empty);
+			if (empty.get()) {
+				break;
+			}
+			for (Object[] keys : keysList) {
+				this.refresh(keys);
+			}
+		}
+		getFullObjectCacheController().setAllLoaded(true);
+		return 0;
+	}
+
+	@Override
+	public FullObjectCacheController getFullObjectCacheController() {
+		return fullObjectCacheController;
+	}
+
+}

+ 47 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/ObjectCache.java

@@ -0,0 +1,47 @@
+package cn.com.qmth.examcloud.web.cache;
+
+/**
+ * 对象缓存
+ *
+ * @author WANGWEI
+ * @date 2019年3月13日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ * @param <T>
+ */
+public interface ObjectCache<T> {
+
+	/**
+	 * 从缓存中获取
+	 *
+	 * @author WANGWEI
+	 * @param keys
+	 * @return
+	 */
+	T get(Object... keys);
+
+	/**
+	 * 删除缓存
+	 *
+	 * @author WANGWEI
+	 * @param keys
+	 */
+	void remove(Object... keys);
+
+	/**
+	 * 刷新缓存
+	 *
+	 * @author WANGWEI
+	 * @param keys
+	 */
+	void refresh(Object... keys);
+
+	/**
+	 * 从数据源(数据库,配置文件等)加载单个缓存项
+	 *
+	 * @author WANGWEI
+	 * @param keys
+	 * @return
+	 */
+	T loadFromResource(Object... keys);
+
+}

+ 22 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/RandomCacheBean.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.examcloud.web.cache;
+
+import java.io.Serializable;
+
+public abstract class RandomCacheBean implements Serializable {
+
+	private static final long serialVersionUID = 5409197052989051020L;
+
+	/**
+	 * 是否存在
+	 */
+	private Boolean existing;
+
+	public Boolean getExisting() {
+		return existing;
+	}
+
+	public void setExisting(Boolean existing) {
+		this.existing = existing;
+	}
+
+}

+ 66 - 0
src/main/java/cn/com/qmth/examcloud/web/cache/RandomObjectCache.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.examcloud.web.cache;
+
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Arrays;
+
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+/**
+ * TODO 该类未开发完成
+ *
+ * @author WANGWEI
+ * @date 2019年4月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ * @param <T>
+ */
+public abstract class RandomObjectCache<T extends RandomCacheBean> implements ObjectCache<T> {
+
+	private RedisClient redisClient;
+
+	private RedisClient getRedisClient() {
+		if (null == redisClient) {
+			redisClient = SpringContextHolder.getBean(RedisClient.class);
+		}
+		return redisClient;
+	}
+
+	protected abstract String getKeyPrefix();
+
+	protected String buildKey(Object... keys) {
+		String key = getKeyPrefix() + StringUtils.join(Arrays.asList(keys), '_');
+		return key;
+	}
+
+	private T getFromCache(String key) {
+		Object object = getRedisClient().get(key, Object.class);
+		@SuppressWarnings("unchecked")
+		T t = (T) object;
+		return t;
+	}
+
+	@Override
+	public T get(Object... keys) {
+		String key = buildKey(keys);
+		T t = getFromCache(key);
+
+		if (null == t) {
+			refresh(keys);
+		}
+		t = getFromCache(key);
+		return t;
+	}
+
+	@Override
+	public void remove(Object... keys) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void refresh(Object... keys) {
+		// TODO Auto-generated method stub
+
+	}
+
+}