package org.dayatang.cache.redis; import org.apache.commons.lang3.SerializationUtils; import org.dayatang.cache.Cache; import org.dayatang.cache.redis.pool.JedisPoolUtil; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * Created by lingen on 14-7-15. * cache的redis实现 */ public class RedisBasedCache implements Cache { private JedisPool jedisPool = null; private JedisTemplate template; public RedisBasedCache(String host, int port) { jedisPool = new JedisPool(JedisPoolUtil.createJedisPoolConfig(), host, port); template = new JedisTemplate(jedisPool); } public RedisBasedCache(String host, int port, String password) { jedisPool = new JedisPool(JedisPoolUtil.createJedisPoolConfig(), host, port, 10000, password); template = new JedisTemplate(jedisPool); } @Override public Object get(final String key) { return template.execute(new JedisFunction<Object>() { @Override public Object doInRedis(Jedis jedis) { final byte[] keyBytes = SerializationUtils.serialize(key); return SerializationUtils.deserialize(jedis.get(keyBytes)); } }); } @Override public Map<String, Object> get(final String... keys) { return template.execute(new JedisFunction<Map<String, Object>>() { @Override public Map<String, Object> doInRedis(Jedis jedis) { final Map<String, Object> values = new HashMap<String, Object>(); for (String key : keys) { byte[] keyBytes = SerializationUtils.serialize(key); values.put(key, SerializationUtils.deserialize(jedis.get(keyBytes))); } return values; } }); } @Override public void put(final String key, final Object value) { template.execute(new JedisAction() { @Override public void doInRedis(Jedis jedis) { byte[] keyBytes = SerializationUtils.serialize(key); byte[] valueBytes = SerializationUtils.serialize((Serializable) value); jedis.set(keyBytes, valueBytes); } }); } @Override public void put(String key, Object value, Date expiry) { long livingSeconds = (expiry.getTime() - new Date().getTime()) / 1000; put(key, value, livingSeconds); } @Override public void put(final String key, final Object value, final long livingSeconds) { template.execute(new JedisAction() { @Override public void doInRedis(Jedis jedis) { byte[] keyBytes = SerializationUtils.serialize(key); byte[] valueBytes = SerializationUtils.serialize((Serializable) value); jedis.setex(keyBytes, (int) livingSeconds, valueBytes); } }); } @Override public boolean remove(final String key) { return template.execute(new JedisFunction<Boolean>() { @Override public Boolean doInRedis(Jedis jedis) { try { jedis.del(SerializationUtils.serialize(key)); return true; } catch (Exception e) { return false; } } }); } @Override public boolean containsKey(final String key) { return template.execute(new JedisFunction<Boolean>() { @Override public Boolean doInRedis(Jedis jedis) { return jedis.exists(SerializationUtils.serialize(key)); } }); } }