mybatis plus使用redis作为二级缓存的方法

作者:shuangyueliao 时间:2023-11-19 08:34:58 

建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。为了方便,这里我们将缓存放到mapper层。mybatis-plus整合redis作为二级缓存与mybatis整合redis略有不同。

1. mybatis-plus开启二级缓存

mybatis-plus.configuration.cache-enabled=true

2. 定义RedisTemplate的bean交给spring管理,这里为了能将对象直接存取到redis中,进行了一些序列化的操作


@Bean(value = "redisTemplate")
 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
   RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
   redisTemplate.setConnectionFactory(connectionFactory);
   //Use Jackson 2Json RedisSerializer to serialize and deserialize the value of redis (default JDK serialization)
   Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
   ObjectMapper objectMapper = new ObjectMapper();
   objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
   //将类名称序列化到json串中
   objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
   //设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
   objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
   jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

//Use String RedisSerializer to serialize and deserialize the key value of redis
   RedisSerializer redisSerializer = new StringRedisSerializer();
   //key
   redisTemplate.setKeySerializer(redisSerializer);
   redisTemplate.setHashKeySerializer(redisSerializer);
   //value
   redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
   redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

redisTemplate.afterPropertiesSet();
   return redisTemplate;

}

3. 自定义自己的缓存管理


package com.qctchina.headsetserver.config;

import com.qctchina.headsetserver.util.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisServerCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;

import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* @author shuangyueliao
* @create 2019/9/10 14:02
* @Version 0.1
*/
@Slf4j
public class MybatisRedisCache implements Cache {

// 读写锁
 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);

//这里使用了redis缓存,使用springboot自动注入
 private RedisTemplate<String, Object> redisTemplate;

private String id;

public MybatisRedisCache(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 (redisTemplate == null) {
     //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
     redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
   }
   if (value != null) {
     redisTemplate.opsForValue().set(key.toString(), value);
   }
 }

@Override
 public Object getObject(Object key) {
   if (redisTemplate == null) {
     //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
     redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
   }
   try {
     if (key != null) {
       return redisTemplate.opsForValue().get(key.toString());
     }
   } catch (Exception e) {
     e.printStackTrace();
     log.error("缓存出错 ");
   }
   return null;
 }

@Override
 public Object removeObject(Object key) {
   if (redisTemplate == null) {
     //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
     redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
   }
   if (key != null) {
     redisTemplate.delete(key.toString());
   }
   return null;
 }

@Override
 public void clear() {
   log.debug("清空缓存");
   if (redisTemplate == null) {
     redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
   }
   Set<String> keys = redisTemplate.keys("*:" + this.id + "*");
   if (!CollectionUtils.isEmpty(keys)) {
     redisTemplate.delete(keys);
   }
 }

@Override
 public int getSize() {
   if (redisTemplate == null) {
     //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
     redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
   }
   Long size = redisTemplate.execute((RedisCallback<Long>) RedisServerCommands::dbSize);
   return size.intValue();
 }

@Override
 public ReadWriteLock getReadWriteLock() {
   return this.readWriteLock;
 }
}

SpringUtil是手动获取bean的工具类


@Component
public class SpringUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
   SpringUtil.applicationContext = applicationContext;
 }

public static Object getBean(String name){
   return applicationContext.getBean(name);
 }

public static <T> T getBean(String name, Class<T> clazz){
   return applicationContext.getBean(name, clazz);
 }

public static <T> T getBean(Class<T> clazz){
   return applicationContext.getBean(clazz);
 }
}

4. 在mapper上加上注解@CacheNamespace


@CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
public interface CommonMapper extends BaseMapper<Common> {

如果调用该mapper下的方法,那么会使用redis缓存

mybatis plus使用redis作为二级缓存的方法

总结

以上所述是小编给大家介绍的mybatis plus使用redis作为二级缓存的方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.cnblogs.com/shuangyueliao/p/11504604.html

标签:mybatis,plus,redis,二级缓存
0
投稿

猜你喜欢

  • 浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别

    2023-10-29 20:08:53
  • C#设置软件开机自动运行的方法(修改注册表)

    2022-08-27 21:05:46
  • eclipse中自动生成javadoc文档的方法

    2022-04-08 17:54:12
  • C#对文件进行加密解密代码

    2023-03-22 12:17:18
  • JVM之参数分配(全面讲解)

    2023-11-09 08:19:10
  • Java 调整格式日志输出

    2021-10-05 23:09:14
  • Android帧动画、补间动画、属性动画用法详解

    2023-02-06 15:02:47
  • spring mvc实现文件上传并携带其他参数的示例

    2023-11-20 11:54:06
  • Java元注解Retention代码示例介绍

    2023-10-21 02:32:32
  • IntelliJ IDEA 2022.2 正式发布新功能体验

    2021-08-14 02:47:33
  • android 控件同时监听单击和双击实例

    2022-11-16 15:45:33
  • SpringBoot文件分片上传教程

    2023-07-21 21:08:40
  • 解决Java API不能远程访问HBase的问题

    2023-11-27 04:17:48
  • Java Iterator迭代器_动力节点Java学院整理

    2022-11-08 13:50:39
  • Spark JDBC操作MySQL方式详细讲解

    2021-05-24 12:41:51
  • SprinBoot整合Quart实现定时调度的示例代码

    2021-12-07 21:30:59
  • 深入解析Java的设计模式编程中的模板方法模式

    2023-11-01 13:31:14
  • 史上最简洁C# 生成条形码图片思路及示例分享

    2023-08-24 15:50:25
  • Unity3D UGUI实现缩放循环拖动卡牌展示效果

    2022-02-19 10:37:24
  • 详解java调用python的几种用法(看这篇就够了)

    2023-04-10 22:15:57
  • asp之家 软件编程 m.aspxhome.com