Browse Source

update MybatisPlus整合Redis二级缓存

疯狂的狮子li 3 years ago
parent
commit
24da85fea3

+ 102 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/MybatisPlusRedisCache.java

@@ -0,0 +1,102 @@
+package com.ruoyi.common.core.mybatisplus;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.ruoyi.common.core.redis.RedisCache;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.cache.Cache;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * mybatis-redis 二级缓存
+ *
+ * @author Lion Li
+ */
+@Slf4j
+public class MybatisPlusRedisCache implements Cache {
+
+	private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
+
+	private RedisCache redisCache;
+
+	private String id;
+
+	public MybatisPlusRedisCache(final String id) {
+		if (id == null) {
+			throw new IllegalArgumentException("Cache instances require an ID");
+		}
+		this.id = id;
+	}
+
+	@Override
+	public String getId() {
+		return this.id;
+	}
+
+	@Override
+	public void putObject(Object key, Object value) {
+		if (redisCache == null) {
+			redisCache = SpringUtil.getBean(RedisCache.class);
+		}
+		if (value != null) {
+			redisCache.setCacheObject(key.toString(), value);
+		}
+	}
+
+	@Override
+	public Object getObject(Object key) {
+		if (redisCache == null) {
+			//由于启动期间注入失败,只能运行期间注入,这段代码可以删除
+			redisCache = SpringUtil.getBean(RedisCache.class);
+		}
+		try {
+			if (key != null) {
+				return redisCache.getCacheObject(key.toString());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("缓存出错");
+		}
+		return null;
+	}
+
+	@Override
+	public Object removeObject(Object key) {
+		if (redisCache == null) {
+			redisCache = SpringUtil.getBean(RedisCache.class);
+		}
+		if (key != null) {
+			redisCache.deleteObject(key.toString());
+		}
+		return null;
+	}
+
+	@Override
+	public void clear() {
+		log.debug("清空缓存");
+		if (redisCache == null) {
+			redisCache = SpringUtil.getBean(RedisCache.class);
+		}
+		Collection<String> keys = redisCache.keys("*:" + this.id + "*");
+		if (!CollectionUtils.isEmpty(keys)) {
+			redisCache.deleteObject(keys);
+		}
+	}
+
+	@Override
+	public int getSize() {
+		RedisTemplate<String, Object> redisTemplate = SpringUtil.getBean("redisTemplate");
+		Long size = redisTemplate.execute(RedisServerCommands::dbSize);
+		return size.intValue();
+	}
+
+	@Override
+	public ReadWriteLock getReadWriteLock() {
+		return this.readWriteLock;
+	}
+}

+ 4 - 1
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java

@@ -1,7 +1,9 @@
 package com.ruoyi.demo.mapper;
 
-import com.ruoyi.demo.domain.TestDemo;
+import com.ruoyi.common.core.mybatisplus.MybatisPlusRedisCache;
 import com.ruoyi.common.core.page.BaseMapperPlus;
+import com.ruoyi.demo.domain.TestDemo;
+import org.apache.ibatis.annotations.CacheNamespace;
 
 /**
  * 测试单表Mapper接口
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.page.BaseMapperPlus;
  * @author Lion Li
  * @date 2021-05-30
  */
+@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class)
 public interface TestDemoMapper extends BaseMapperPlus<TestDemo> {
 
 }

+ 4 - 1
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java

@@ -1,7 +1,9 @@
 package com.ruoyi.demo.mapper;
 
-import com.ruoyi.demo.domain.TestTree;
+import com.ruoyi.common.core.mybatisplus.MybatisPlusRedisCache;
 import com.ruoyi.common.core.page.BaseMapperPlus;
+import com.ruoyi.demo.domain.TestTree;
+import org.apache.ibatis.annotations.CacheNamespace;
 
 /**
  * 测试树表Mapper接口
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.page.BaseMapperPlus;
  * @author Lion Li
  * @date 2021-05-30
  */
+@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class)
 public interface TestTreeMapper extends BaseMapperPlus<TestTree> {
 
 }

+ 3 - 0
ruoyi-generator/src/main/resources/vm/java/mapper.java.vm

@@ -2,6 +2,8 @@ package ${packageName}.mapper;
 
 import ${packageName}.domain.${ClassName};
 import com.ruoyi.common.core.page.BaseMapperPlus;
+import com.ruoyi.common.core.mybatisplus.MybatisPlusRedisCache;
+import org.apache.ibatis.annotations.CacheNamespace;
 
 /**
  * ${functionName}Mapper接口
@@ -9,6 +11,7 @@ import com.ruoyi.common.core.page.BaseMapperPlus;
  * @author ${author}
  * @date ${datetime}
  */
+@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class)
 public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}> {
 
 }