import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.redisson.RedissonClient;
import org.redisson.core.RBucket;
import org.redisson.core.RSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.yijiupi.himalaya.order.Constants;
/**
* *******************************************
* ClassName: MybatisRedisCache
*
* @Description: Mybatis 基于redis 的缓存
*
* @author 章英杰
* @date 2016年5月10日
*
********************************************
*/
public class MybatisRedisCache implements Cache{
private Logger logger=LoggerFactory.getLogger(getClass());
private RedissonClient redissonClient;
private String id;
private RSet<String> keys;
public MybatisRedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
this.id = id;
logger.info("redis>>>>MybatisRedisCache:id="+this.id);
if(null==redissonClient){
redissonClient=AppConfig.getBean(RedissonClient.class);
}
keys=redissonClient.getSet(Constants.MYBATIS_CACHE_ID+ id);
}
@Override
public String getId() {
return id;
}
@Override
public void putObject(Object key, Object value) {
RBucket<Object> obj= redissonClient.getBucket(key.toString());
obj.set(value, Constants.MYBATIS_CACHE_TIME_TO_LIVE, Constants.MYBATIS_CACHE_TIME_UNIT);
if(!keys.contains(key.toString())){
keys.add(key.toString());
}
}
@Override
public Object getObject(Object key) {
RBucket<Object> obj= redissonClient.getBucket(key.toString());
return obj.get();
}
@Override
public Object removeObject(Object key) {
RBucket<Object> obj= redissonClient.getBucket(key.toString());
Boolean flag=false;
if(obj.delete()){
flag=keys.remove(key.toString());
}
return flag;
}
@Override
public void clear() {
for(String key:keys){
RBucket<Object> obj= redissonClient.getBucket(key.toString());
obj.delete();
}
keys.clear();
}
@Override
public int getSize() {
return keys.size();
}
@Override
public ReadWriteLock getReadWriteLock() {
return redissonClient.getReadWriteLock(getId());
}
}