|  |  | 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; | 
|  |  | } | 
|  |  |  | 
|  |  | } | 
|  |  |  | 
... | ... |  |