欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

建議緩存放到 service 層,你可以自定義自己的 BaseServiceImpl 重寫注解父類方法,繼承自己的實現(xiàn)。為了方便,這里我們將緩存放到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作為二級緩存的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • Java for循環(huán)幾種寫法整理

    Java for循環(huán)幾種寫法整理

    這篇文章主要介紹了Java for循環(huán)幾種寫法整理的相關資料,需要的朋友可以參考下
    2017-02-02
  • 實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗問題

    實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗問題

    這篇文章主要介紹了實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁)

    Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁)

    這篇文章主要介紹了Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談springmvc 通過異常增強返回給客戶端統(tǒng)一格式

    淺談springmvc 通過異常增強返回給客戶端統(tǒng)一格式

    這篇文章主要介紹了淺談springmvc 通過異常增強返回給客戶端統(tǒng)一格式。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 詳解Java?@Documented注解的作用

    詳解Java?@Documented注解的作用

    @Documented和@Deprecated注解長得有點像,@Deprecated是用來標注某個類或者方法不建議再繼續(xù)使用,@Documented只能用在注解上,本文將通過示例詳細說說@Documented注解的作用,需要的可以參考一下
    2022-09-09
  • 第三方包jintellitype實現(xiàn)Java設置全局熱鍵

    第三方包jintellitype實現(xiàn)Java設置全局熱鍵

    本文主要介紹了,在java中使用第三方插件包jintellitype來實現(xiàn)全局熱鍵,非常的簡單,但是很實用,有需要的朋友可以參考下,歡迎一起來參與改進此項目
    2014-09-09
  • Spring底層原理深入分析

    Spring底層原理深入分析

    Spring框架是一個開放源代碼的J2EE應用程序框架,由Rod Johnson發(fā)起,是針對bean的生命周期進行管理的輕量級容器(lightweight container)。 Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,提供了功能強大IOC、AOP及Web MVC等功能
    2022-07-07
  • java 指定某個jdk版本方法

    java 指定某個jdk版本方法

    這篇文章主要介紹了java 指定某個jdk版本方法的相關資料,需要的朋友可以參考下
    2017-05-05
  • Java深入了解數(shù)據(jù)結構之優(yōu)先級隊列(堆)

    Java深入了解數(shù)據(jù)結構之優(yōu)先級隊列(堆)

    普通的隊列是一種先進先出的數(shù)據(jù)結構,元素在隊列尾追加,而從隊列頭刪除。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先刪除。優(yōu)先隊列具有最高級先出 (first in, largest out)的行為特征。通常采用堆數(shù)據(jù)結構來實現(xiàn)
    2022-01-01
  • springmvc整合ssm配置的詳細代碼

    springmvc整合ssm配置的詳細代碼

    今天通過實例代碼給大家介紹了springmvc整合ssm配置的詳細方法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11

最新評論