/** * 版本修订记录 * 创建:2013-1-20 * 版本: * * 修订1: 说明: * 修订2: 说明: */ package org.howsun.redis; import java.util.Date; import org.howsun.log.Log; import org.howsun.log.LogFactory; import org.howsun.test.RunTimeConsuming; import org.howsun.util.Objects; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import redis.clients.jedis.ShardedJedis; /** * 描述: * @author howsun * @version 3.0 * Building Time 2013-1-20 * */ //@org.howsun.dcs.ContractService("cacheService") public class JedisCacheService implements CacheService { private Log log = LogFactory.getLog(JedisCacheService.class); protected ShardedCacheFactory cacheFactory; protected JdkSerializationRedisSerializer serializer; protected boolean report = false; public void setCallback(CacheObjectTransfCallbacker callbacker){ callbacker.setCallback(this); } //-------------------------------------read---------------------------------- @Override public String get(String key) { long start = System.currentTimeMillis(); String result = null; ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); result = jedis.get(key); } catch (Exception e) { log.error("获取缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } if(report){ log.info(String.format("The [%s]'s cache %s, total time of %s milliseconds by it.", key, result == null ? "did not got":"is got", System.currentTimeMillis() - start)); } return result; } @SuppressWarnings("unchecked") @Override public <T> T get(final String key, Class<T> clazz) { Object obj = getObject(key); if(obj != null && Objects.isTheClass(obj, clazz)){ return (T)obj; } return null; } @Override public Object getObject(String key){ long start = System.currentTimeMillis(); Object result = null; ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); byte[] value = jedis.get(key.getBytes("UTF-8")); result = serializer.deserialize(value); } catch (Exception e) { log.error("获取缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } if(report){ log.info(String.format("The [%s]'s cache %s, total time of %s milliseconds by it.", key, result == null ? "did not got":"is got", System.currentTimeMillis() - start)); } return result; } @Override public boolean exists(String key) { if(key == null){ return false; } ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); return jedis.exists(key); } catch (Exception e) { log.error("操作缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return false; } //-------------------------------------write---------------------------------- public void set(String key, String value) { set(key, value, -1); } public void set(String key, String value, int offset) { setStringValue(key, value, offset); } public String set(String key, Object value){ return set(key, value, -1); } public String set(String key, Object value, int seconds){ return setObject(key, value, seconds); } /** * 设置过期时间 */ public Long expire(String key, int seconds){ ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); return jedis.expire(key, seconds); } catch (Exception e) { log.error("操作缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return null; } /**指定在未来日期过期*/ public Long expireAt(String key, Date date){ ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); final long rawTimeout = date.getTime() / 1000; return jedis.expireAt(key, rawTimeout); } catch (Exception e) { log.error("获取缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return null; } @Override public long remove(String key) { ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); return jedis.del(key); } catch (Exception e) { log.error("删除缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return -1; } public void destroy(){ if(this.cacheFactory != null){ try { cacheFactory.destroy(); } catch (Exception e) { log.info("关闭错误:",e); } } } //-----------------------------------Private method------------------------------ private String setObject(String key, Object value, int seconds) { ShardedJedis jedis = null; if(value instanceof String){ return setStringValue(key, value.toString(), seconds); } try { jedis = cacheFactory.getResource(); byte[] keyBytes = key.getBytes("UTF-8"); byte result[] = serializer.serialize(value); if(seconds > -1){ return jedis.setex(keyBytes, seconds, result); }else{ return jedis.set(keyBytes, result); } } catch (Exception e) { log.error("获取缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return null; } private String setStringValue(String key, String value, int seconds) { ShardedJedis jedis = null; try { jedis = cacheFactory.getResource(); if(seconds > -1){ return jedis.setex(key, seconds, value); }else{ return jedis.set(key, value); } } catch (Exception e) { log.error("获取缓存失败:", e); } finally{ if(jedis != null){ try {cacheFactory.returnResource(jedis);} catch (Exception e2) { log.error("不能释放缓存操纵对象:",e2); } } } return null; } public void setCacheFactory(ShardedCacheFactory cacheFactory) { this.cacheFactory = cacheFactory; } public ShardedCacheFactory getCacheFactory() { return cacheFactory; } public JdkSerializationRedisSerializer getSerializer() { return serializer; } public void setSerializer(JdkSerializationRedisSerializer serializer) { this.serializer = serializer; } public boolean isReport() { return report; } public void setReport(boolean report) { this.report = report; } public static void main(String[] args) { RunTimeConsuming run = new RunTimeConsuming() { @Override public void run() { } }; System.out.println(run.consume()); } }