1、 引入jar包
2、 實現Mybatis緩存接口
public class RedisCache implements Cache {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private String id;
private static JedisConnectionFactory jedisConnectionFactory;
protected static Logger logger = LogManager.getLogger();
public RedisCache(String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
logger.debug("---------------------Mybatis RedisCache:id=" + id + "---------------------");
this.id = id;
}
/**
* 清除所有數據
*/
@Override
public void clear() {
JedisConnection connection = null;
try {
connection = (JedisConnection) jedisConnectionFactory.getConnection();
connection.flushAll();
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* @return
*/
@Override
public String getId() {
return this.id;
}
/**
* 得到指定key的 value
* @param key
* @return object
*/
@Override
public Object getObject(Object key) {
Object result = null;
JedisConnection connection = null;
try {
connection = (JedisConnection) jedisConnectionFactory.getConnection();
result = SerializeUtil.unserialize(connection.get(SerializeUtil.serialize(key)));
//result = SerializeUtil.unserialize(connection.hGet(RedisCache.this.id.toString().getBytes(), key.toString().getBytes()));
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
return result;
}
/**
* 得到當前db的key值
* @return int
*/
@Override
public int getSize() {
int result = 0;
JedisConnection connection = null;
try {
connection = (JedisConnection) jedisConnectionFactory.getConnection();
result = Integer.valueOf(connection.dbSize().toString());
// result = Integer.valueOf(connection.hGetAll(RedisCache.this.id.toString().getBytes()).size());
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
return result;
}
/**
* 寫入 key-value
* @param key
* @param value
*/
@Override
public void putObject(Object key, Object value) {
JedisConnection connection = null;
try {
logger.debug("------------------Redis Put Object:" + key.toString() + ":" + value.toString() + "-------------------");
connection = (JedisConnection) jedisConnectionFactory.getConnection();
connection.set(SerializeUtil.serialize(key), SerializeUtil.serialize(value));
// connection.hSet(RedisCache.this.id.toString().getBytes(),key.toString().getBytes(),SerializeUtil.serialize(value));
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* 刪除指定key的值
* @param key
* @return
*/
@Override
public Object removeObject(Object key) {
JedisConnection connection = null;
Object result = null;
try {
connection = (JedisConnection) jedisConnectionFactory.getConnection();
result = connection.expire(SerializeUtil.serialize(key), 0);
//或者 result = connection.del(SerializeUtil.serialize(key));
// result = connection.hDel(RedisCache.this.id.toString().getBytes(),key.toString().getBytes());
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
return result;
}
@Override
public ReadWriteLock getReadWriteLock() {
return this.readWriteLock;
}
/**
* 注入jedisConnectionFactory
* @param jedisConnectionFactory
*/
public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
RedisCache.jedisConnectionFactory = jedisConnectionFactory;
}
}
3、 使用中間類解決RedisCache.jedisConnectionFactory的靜態注入,從而使MyBatis實現第三方緩存
public class RedisCacheTransfer {
@Autowired
public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
RedisCache.setJedisConnectionFactory(jedisConnectionFactory);
}
}
<!-- 使用中間類解決RedisCache.jedisConnectionFactory的靜態注入,從而使MyBatis實現第三方緩存 -->
<bean id="redisCacheTransfer" class="org.xkp.util.RedisCacheTransfer">
<property name="jedisConnectionFactory" ref="jedisConnFactory"/>
</bean>
4、使用Spring管理與redis的連接
<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.1.111"/>
<property name="port" value="6379"/>
<!--<property name="poolConfig" ref="poolConfig"/>-->
<!--<constructor-arg ref="redisSentinelConfiguration"/>-->
<property name="timeout" value="10000"/>
</bean>
5、在mapper映射文件中開啓二級緩存
<cache type="org.xkp.util.RedisCache"/>