成都网站建设设计

将想法与焦点和您一起共享

怎么在mybatis中利用redis作二级缓存

这期内容当中小编将会给大家带来有关怎么在mybatis中利用redis作二级缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联公司专注于企业全网整合营销推广、网站重做改版、尖草坪网站定制设计、自适应品牌网站建设、H5场景定制电子商务商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为尖草坪等各大城市提供网站开发制作服务。

1. mybatis-plus开启二级缓存

mybatis-plus.configuration.cache-enabled=true

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

@Bean(value = "redisTemplate")
  public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate 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 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) SpringUtil.getBean("redisTemplate");
    }
    if (value != null) {
      redisTemplate.opsForValue().set(key.toString(), value);
    }
  }

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

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

  @Override
  public int getSize() {
    if (redisTemplate == null) {
      //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
      redisTemplate = (RedisTemplate) SpringUtil.getBean("redisTemplate");
    }
    Long size = redisTemplate.execute((RedisCallback) 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 getBean(String name, Class clazz){
    return applicationContext.getBean(name, clazz);
  }

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

4. 在mapper上加上注解@CacheNamespace

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

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

怎么在mybatis中利用redis作二级缓存

上述就是小编为大家分享的怎么在mybatis中利用redis作二级缓存了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


分享名称:怎么在mybatis中利用redis作二级缓存
本文路径:http://chengdu.cdxwcx.cn/article/jcoedc.html