package com.monkeylessey.redis; import com.monkeylessey.utils.ApplicationContextUtil; import org.apache.ibatis.cache.Cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; /** * mybatis二级缓存使用redis * @author 29443 * @version 1.0 * @date 2022/4/11 */ public class MybatisRedisCache implements Cache { // 必须要定义一个id,以及id的构造函数(这个id是Mapper的namespace) private final String id; private RedisTemplate redisTemplate; public MybatisRedisCache(String id) { this.id = id; System.out.println("id的值为:" + id); // 因为Cache的实现类是mybatis实例化的,并不是由Spring容器管理。所以我们并不能直接注入RedisTemplate。 //redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); } // getId()必须返回该id @Override public String getId() { return id; } // 添加缓存 @Override public void putObject(Object key, Object value) { if (redisTemplate == null) { redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); } redisTemplate.opsForHash().put(id, key.toString(), value); } // 获取缓存 @Override public Object getObject(Object key) { if (redisTemplate == null) { redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); } return this.redisTemplate.opsForHash().get(id,key.toString()); } // 从3.3.0开始,此方法仅在回滚期间调用 @Override public Object removeObject(Object key) { return null; } // 删除缓存 @Override public void clear() { if (redisTemplate == null) { redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); } redisTemplate.delete(id); } @Override public int getSize() { if (redisTemplate == null) { redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); } return Math.toIntExact(redisTemplate.opsForHash().size(id)); } }