最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis plus使用redis作為二級緩存的方法

 更新時間:2019年09月11日 10:13:18   作者:shuangyueliao  
這篇文章主要介紹了mybatis plus使用redis作為二級緩存的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

建議緩存放到 service 層,你可以自定義自己的 BaseServiceImpl 重寫注解父類方法,繼承自己的實現(xiàn)。為了方便,這里我們將緩存放到mapper層。mybatis-plus整合redis作為二級緩存與mybatis整合redis略有不同。

1. mybatis-plus開啟二級緩存

mybatis-plus.configuration.cache-enabled=true

2. 定義RedisTemplate的bean交給spring管理,這里為了能將對象直接存取到redis中,進(jìn)行了一些序列化的操作

@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);
    //將類名稱序列化到j(luò)son串中
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    //設(shè)置輸入時忽略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> {

如果調(diào)用該mapper下的方法,那么會使用redis緩存

總結(jié)

以上所述是小編給大家介紹的mybatis plus使用redis作為二級緩存的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

最新評論

延吉市| 从化市| 淄博市| 荣昌县| 红河县| 五莲县| 天长市| 天镇县| 永和县| 金塔县| 疏附县| 革吉县| 金沙县| 循化| 安西县| 普宁市| 神农架林区| 竹山县| 宁陕县| 顺平县| 大余县| 大新县| 定边县| 尚义县| 融水| 明水县| 启东市| 多伦县| 贵德县| 历史| 加查县| 太保市| 富民县| 成安县| 保山市| 兴仁县| 莱阳市| 吴旗县| 湘潭县| 尚义县| 井研县|