import com.danga.MemCached.MemCachedClient; //通用分布式缓存访问public class CommonCache<T> implements Cache<T> { private static MemCachedClient memCachedClient = null; private String base = null; CommonCache(Class<T> t, MemCachedClient client) { memCachedClient = client; base = t.getSimpleName() + "-"; } public T get(String key) { return (T) memCachedClient.get(base + key); } public boolean set(String key, T value) { return memCachedClient.set(base + key, value); } @Override public boolean update(String key, T value) { return memCachedClient.replace(base + key, value); } @Override public boolean delete(String key) { return memCachedClient.delete(base + key); } @Override public boolean add(String key, T value) { return memCachedClient.add(base + key, value); }}//分布式集群访问import com.danga.MemCached.MemCachedClient;import com.schooner.MemCached.SchoonerSockIOPool;import com.yx.cache.util.HashCodeUtil;import com.yx.task.ThreadPoolManager; public class ClusterCache<T> implements Cache<T> { private static MemCachedClient memCachedClient = null; private static ThreadPoolManager taskManager = ThreadPoolManager .getInstance("cache"); private String base = null; private SchoonerSockIOPool pool = SchoonerSockIOPool.getInstance(); ClusterCache(Class<T> t, MemCachedClient client) { memCachedClient = client; base = "i-" + t.getSimpleName() + "-"; } @Override public T get(String key) { T value = null; if (key == null) { return null; } key = base + key; if (pool.getServers().length < 2) { value = (T) memCachedClient.get(key); } else { int hashCode = HashCodeUtil.getHash(key); value = (T) memCachedClient.get(key, hashCode); if (value == null) { hashCode = this.getRehashCode(key, hashCode); value = (T) memCachedClient.get(key, hashCode); if (value != null) {// 如果在另外一台服务器上取到了缓存,则恢复第一台服务器 UpdateTask task = new UpdateTask(key, value); taskManager.submit(task); } } } return value; } @Override public boolean set(String key, T value) { if (key == null) { return false; } key = base + key; boolean result = false; if (pool.getServers().length < 2) { result = memCachedClient.set(key, value); } else { int hashCode = HashCodeUtil.getHash(key); result = memCachedClient.set(key, value, hashCode); // if (result) { hashCode = getRehashCode(key, hashCode); memCachedClient.set(key, value, hashCode); // } } return result; } private int getRehashCode(String key, int oldHashcode) { String host = pool.getHost(key, oldHashcode); int rehashTries = 0; // if (result) { int hashCode = HashCodeUtil.getHash(rehashTries + key); while (host.equals(pool.getHost(key, hashCode))) { rehashTries++; hashCode = HashCodeUtil.getHash(rehashTries + key); } return hashCode; } @Override public boolean update(String key, T value) { if (key == null) { return false; } key = base + key; boolean result = false; if (pool.getServers().length < 2) { result = memCachedClient.replace(key, value); } else { int hashCode = HashCodeUtil.getHash(key); result = memCachedClient.replace(key, value, hashCode); // if (result) { hashCode = getRehashCode(key, hashCode); memCachedClient.replace(key, value, hashCode); // } } return result; } @Override public boolean delete(String key) { if (key == null) { return false; } key = base + key; boolean result = false; if (pool.getServers().length < 2) { result = memCachedClient.delete(key); } else { int hashCode = HashCodeUtil.getHash(key); result = memCachedClient.delete(key, hashCode, null); // if (result) { hashCode = this.getRehashCode(key, hashCode); memCachedClient.delete(key, hashCode, null); // } } return result; } @Override public boolean add(String key, T value) { if (key == null) { return false; } key = base + key; boolean result = false; if (pool.getServers().length < 2) { result = memCachedClient.add(key, value); } else { int hashCode = HashCodeUtil.getHash(key); result = memCachedClient.add(key, value, hashCode); // if (result) { hashCode = getRehashCode(key, hashCode); memCachedClient.add(key, value, hashCode); // } } return result; } static class UpdateTask implements Runnable { private String key; private Object value; UpdateTask(String key, Object value) { this.key = key; this.value = value; } @Override public void run() { memCachedClient.set(key, value, HashCodeUtil.getHash(key)); } } }
评论