未完成的redis集成


springmvc + mybatis +redis  没有调研完成的 缓存引入,
查找了各种资料,包括【Iteye上的大神:http://liuyieyer.iteye.com/blog/2081382
【github上的大神:https://github.com/mybatis/redis-cache

package xx.redis;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.ibatis.cache.Cache;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;

public final class RedisCache implements Cache {

 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

 private String id;

 public RedisCache(final String id) {
  if (id == null) {
   throw new IllegalArgumentException("Cache instances require an ID");
  }
  this.id = id;
 }

 private Object execute(RedisCallback callback) {
  Jedis jedis = CachePool.getInstance().getJedis();
  try {
   return callback.doWithRedis(jedis);
  } finally {
   // jedis.close();
   jedis.quit();
  }
 }

 public String getId() {
  return this.id;
 }

 public int getSize() {
  return (Integer) execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    Map<byte[], byte[]> result = jedis.hgetAll(id.toString().getBytes());
    return result.size();
   }
  });
 }

 public void putObject(final Object key, final Object value) {
  execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    jedis.hset(id.toString().getBytes(), key.toString().getBytes(), SerializeUtil.serialize(value));
    return null;
   }
  });
 }

 public Object getObject(final Object key) {
  return execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    Object val = SerializeUtil.unserialize(jedis.hget(id.toString().getBytes(), key.toString().getBytes()));
    System.out.println("get from redis:id=" + key + ",val=" + val);
    return val;
   }
  });
 }

 public Object removeObject(final Object key) {
  return execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    return jedis.hdel(id.toString(), key.toString());
   }
  });
 }

 public void clear() {
  execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    jedis.del(id.toString());
    return null;
   }
  });

 }

 public ReadWriteLock getReadWriteLock() {
  return readWriteLock;
 }

 @Override
 public String toString() {
  return "Redis {" + id + "}";
 }

 /**
  *
  * @ClassName: CachePool
  * @Description: TODO(单例Cache池)
  * @author LiuYi
  */
 public static class CachePool {
  JedisPool pool;
  private static final CachePool cachePool = new CachePool();

  public static CachePool getInstance() {
   return cachePool;
  }

  private CachePool() {
   JedisPoolConfig config = new JedisPoolConfig();
   Properties p = new Properties();
   InputStream f = CachePool.class.getClassLoader().getResourceAsStream("redis.properties");
   try {
    p.load(f);
   } catch (IOException e) {
    e.printStackTrace();
   }
   config.setMaxIdle(Integer.valueOf(p.getProperty("redis.maxIdle")));
   config.setMaxWait(Integer.valueOf(p.getProperty("redis.maxWait")));
   pool = new JedisPool(config, p.getProperty("redis.host"));
  }

  public Jedis getJedis() {
   Jedis jedis = null;
   boolean borrowOrOprSuccess = true;
   try {
    jedis = pool.getResource();
   } catch (JedisConnectionException e) {
    borrowOrOprSuccess = false;
    if (jedis != null)
     pool.returnBrokenResource(jedis);
   } finally {
    if (borrowOrOprSuccess)
     pool.returnResource(jedis);
   }
   jedis = pool.getResource();
   return jedis;
  }

  public JedisPool getJedisPool() {
   return this.pool;
  }

 }
}

================================================

package xx.redis;
import redis.clients.jedis.Jedis;

public interface RedisCallback {

 Object doWithRedis(Jedis jedis);
}

================================================

package xx.redis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.apache.ibatis.cache.CacheException;

public final class SerializeUtil {

 public static byte[] serialize(Object object) {
  ObjectOutputStream oos = null;
  ByteArrayOutputStream baos = null;
  try {
   baos = new ByteArrayOutputStream();
   oos = new ObjectOutputStream(baos);
   oos.writeObject(object);
   byte[] bytes = baos.toByteArray();
   return bytes;
  } catch (Exception e) {
   throw new CacheException(e);
  }
 }

 public static Object unserialize(byte[] bytes) {
  if (bytes == null) {
   return null;
  }
  ByteArrayInputStream bais = null;
  try {
   bais = new ByteArrayInputStream(bytes);
   ObjectInputStream ois = new ObjectInputStream(bais);
   return ois.readObject();
  } catch (Exception e) {
   throw new CacheException(e);
  }
 }

}

================================================
redis.properties 文件:

#redis configuration
redis.host=172.16.180.75
redis.port=6379
redis.pass=
redis.default.db=0
redis.timeout=100000
redis.maxActive=300
redis.maxIdle=100
redis.maxWait=1000
DBSync.testOnBorrow=true

====================================================
mybatis-config.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <settings>
  <setting name="cacheEnabled" value="true" />
<!--   <setting name="lazyLoadingEnabled" value="true" /> -->
<!--   <setting name="multipleResultSetsEnabled" value="true" /> -->
<!--   <setting name="useColumnLabel" value="true" /> -->
<!--   <setting name="useGeneratedKeys" value="false" /> -->
<!--   <setting name="enhancementEnabled" value="false" /> -->
<!--   <setting name="defaultExecutorType" value="SIMPLE" /> -->
 </settings>
</configuration>

spring-mybatis文件
<!-- mybatis文件配置,扫描所有mapper文件 -->
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="mapperLocations">
   <array>
    <value>classpath:conf-mybatis/ext/*Mapper.xml</value>
    <value>classpath:conf-mybatis/*Mapper.xml</value>
   </array>
  </property>
  <property name="configLocation" value="classpath:conf-mybatis/mybatis-config.xml" />
  <property name="dataSource" ref="dataSource" />
  <property name="plugins">
   <ref bean="pageHelper" />
  </property>
 </bean>
=============================================================


 

猜你喜欢

转载自luckytyy.iteye.com/blog/2254099