|
|
package com.sunyo.wlpt.message.bus.service.cache;
|
|
|
|
|
|
import org.apache.ibatis.cache.Cache;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
|
|
import org.springframework.util.DigestUtils;
|
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.concurrent.locks.ReadWriteLock;
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @author 子诚
|
|
|
* Description:自定义Redis作为mybatis二级缓存实现
|
|
|
* 时间:2020/8/6 9:37
|
|
|
*/
|
|
|
public class RedisCache implements Cache {
|
|
|
|
|
|
/**
|
|
|
* slf4j的日志记录器
|
|
|
*/
|
|
|
private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
|
|
|
|
|
|
/**
|
|
|
* 用于事务性缓存操作的读写锁
|
|
|
*/
|
|
|
private static final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
|
|
|
|
|
|
/**
|
|
|
* 缓存对象的是失效时间,30分钟
|
|
|
*/
|
|
|
private static final long CACHE_TIME_IN_MINT = 30;
|
|
|
|
|
|
/**
|
|
|
* 当前放入缓存的mapper的namespace
|
|
|
*/
|
|
|
private final String id;
|
|
|
|
|
|
/**
|
|
|
* 必须存在构造方法
|
|
|
*/
|
|
|
public RedisCache(String id)
|
|
|
{
|
|
|
this.id = id;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 返回cache唯一标识
|
|
|
*/
|
|
|
@Override
|
|
|
public String getId()
|
|
|
{
|
|
|
return this.id;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 缓存放入值 redis RedisTemplate StringRedisTemplate
|
|
|
*
|
|
|
* @param key hash_key
|
|
|
* @param value hash_value
|
|
|
*/
|
|
|
@Override
|
|
|
public void putObject(Object key, Object value)
|
|
|
{
|
|
|
RedisTemplate redisTemplate = getRedisTemplate();
|
|
|
// 使用redis的hash类型作为缓存存储模型
|
|
|
redisTemplate.opsForHash().put(id.toString(), key.toString(), value);
|
|
|
redisTemplate.expire(id.toString(), CACHE_TIME_IN_MINT, TimeUnit.MINUTES);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 缓存中中获取数据
|
|
|
*/
|
|
|
@Override
|
|
|
public Object getObject(Object key)
|
|
|
{
|
|
|
RedisTemplate redisTemplate = getRedisTemplate();
|
|
|
//根据key 从redis的hash类型中获取数据
|
|
|
return redisTemplate.opsForHash().get(id.toString(), key.toString());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 注意:这个方法为mybatis保留方法 默认没有实现 后续版本可能会实现
|
|
|
*
|
|
|
* @param key hash_key
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
public Object removeObject(Object key)
|
|
|
{
|
|
|
RedisTemplate redisTemplate = getRedisTemplate();
|
|
|
redisTemplate.delete(key);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void clear()
|
|
|
{
|
|
|
logger.info("清空->{}<-缓存", id);
|
|
|
RedisTemplate redisTemplate = getRedisTemplate();
|
|
|
// 清空 namespace
|
|
|
redisTemplate.delete(id.toString());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用来计算缓存数量
|
|
|
*/
|
|
|
@Override
|
|
|
public int getSize()
|
|
|
{
|
|
|
RedisTemplate redisTemplate = getRedisTemplate();
|
|
|
// 获取hash中key value数量
|
|
|
return redisTemplate.opsForHash().size(id.toString()).intValue();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 封装redisTemplate
|
|
|
*
|
|
|
* @return RedisTemplate
|
|
|
*/
|
|
|
private RedisTemplate getRedisTemplate()
|
|
|
{
|
|
|
//通过application工具类获取redisTemplate
|
|
|
RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
|
|
|
redisTemplate.setKeySerializer(new StringRedisSerializer());
|
|
|
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
|
|
|
return redisTemplate;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 封装一个对key进行md5处理方法
|
|
|
*/
|
|
|
private String getKeyToMD5(String key)
|
|
|
{
|
|
|
return DigestUtils.md5DigestAsHex(key.getBytes());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public ReadWriteLock getReadWriteLock()
|
|
|
{
|
|
|
return readWriteLock;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
...
|
...
|
|