91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用Redis作為Mybatis的二級緩存

發布時間:2022-08-11 14:28:44 來源:億速云 閱讀:199 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么利用Redis作為Mybatis的二級緩存”,在日常操作中,相信很多人在怎么利用Redis作為Mybatis的二級緩存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么利用Redis作為Mybatis的二級緩存”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

要優雅就選擇Mybatis-Plus

關于Mybatis-Plus的基礎設置就不多做介紹了,只說和二級緩存有關的。

首先在配置文件開啟二級緩存。

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    cache-enabled: true   # 開啟二級緩存
  mapper-locations: classpath:*/mapper/*.xml

Redis配置

這部分就是Redis的基本用法:

  redis:
    host: 101.411.160.111
    database: 0
    port: 6311
    password: 1111111

配置RedisTemplate

@Configuration
public class RedisConfig {
    /**
     * 設置系列化方式、事務等配置
     */
    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
    {
        RedisTemplate<String,Serializable> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        //設置key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //設置value的序列化方式json
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

自定義Mybatis緩存

我們只需要實現Cache這個接口。

@Slf4j
public class MybatisRedisCache implements Cache {
    private static final String COMMON_CACHE_KEY = "mybatis";
    // 讀寫鎖
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true)
    private final RedisTemplate<String, Object> redisTemplate;
    private final String nameSpace;

    public MybatisRedisCache(String nameSpace) {
        if (nameSpace == null) {
            throw new IllegalArgumentException("Cache instances require an ID");
        }
        redisTemplate = SpringUtil.getBean("redisTemplate");
        this.nameSpace = nameSpace;
    }
    @Override
    public String getId() {
        return this.nameSpace;
    }

    private String getKeys() {

        return COMMON_CACHE_KEY + "::" + nameSpace + "::*";
    }

    private String getKey(Object key) {
        return COMMON_CACHE_KEY + "::" + nameSpace + "::" + DigestUtils.md5Hex(String.valueOf(key));
    }
    @Override
    public void putObject(Object key, Object value) {
        redisTemplate.opsForValue().set(getKey(key), value, 10, TimeUnit.MINUTES);
    }
    @Override
    public Object getObject(Object key) {
        try {
            return redisTemplate.opsForValue().get(getKey(key));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("緩存出錯 ");
        }
        return null;
    }

    @Override
    public Object removeObject(Object o) {
        Object n = redisTemplate.opsForValue().get(getKey(o));
        redisTemplate.delete(getKey(o));
        return n;
    }

    @Override
    public void clear() {
        Set<String> keys = redisTemplate.keys(getKeys());
        if (CollectionUtil.isNotEmpty(keys)) {
            assert keys != null;
            redisTemplate.delete(keys);
        }
    }
    @Override
    public int getSize() {
        Set<String> keys = redisTemplate.keys(getKeys());
        if (CollectionUtil.isNotEmpty(keys)) {
            assert keys != null;
            return keys.size();
        }
        return 0;
    }
    @Override
    public ReadWriteLock getReadWriteLock() {
        return this.readWriteLock;
    }
}

測試

1.第一次查詢,走數據庫,并寫入緩存。

怎么利用Redis作為Mybatis的二級緩存

看看Redis的記錄:

怎么利用Redis作為Mybatis的二級緩存

2.第二次查詢,直接走緩存

怎么利用Redis作為Mybatis的二級緩存

3.重啟項目,依然可以直接查緩存

怎么利用Redis作為Mybatis的二級緩存

緩存命中率(Cache Hit Ratio)

不知道有沒有細心的同學注意到這樣一行日志:

Cache Hit Ratio [com.yitiao.mapper.ArticleMapper]: 0.5

最后這個0.5就是緩存命中率,代表一共查詢兩次,命中一次緩存一次。

一級緩存和二級緩存

一級緩存

一級緩存 Mybatis 的一級緩存是指 SQLSession,一級緩存的作用域是 SQlSession , Mabits 默認開啟一級緩存。 在同一個SqlSession中,執行相同的SQL查詢時;第一次會去查詢數據庫,并寫在緩存中,第二次會直接從緩存中取。 當執行SQL時候兩次查詢中間發生了增刪改的操作,則SQLSession的緩存會被清空。

每次查詢會先去緩存中找,如果找不到,再去數據庫查詢,然后把結果寫到緩存中。 Mybatis的內部緩存使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結果集映射成的java對象。 SqlSession執行insert、update、delete等操作commit后會清空該SQLSession緩存。

二級緩存

二級緩存 二級緩存是 mapper 級別的,Mybatis默認是沒有開啟二級緩存的。 第一次調用mapper下的SQL去查詢用戶的信息,查詢到的信息會存放到該 mapper 對應的二級緩存區域。 第二次調用 namespace 下的 mapper 映射文件中,相同的sql去查詢用戶信息,會去對應的二級緩存內取結果。

怎么利用Redis作為Mybatis的二級緩存

到此,關于“怎么利用Redis作為Mybatis的二級緩存”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安阳市| 太白县| 巍山| 望都县| 马边| 邳州市| 长顺县| 龙井市| 长乐市| 腾冲县| 额敏县| 文水县| 屯昌县| 伊宁市| 来安县| 邵武市| 宜春市| 宁都县| 安徽省| 霸州市| 昔阳县| 白河县| 镇巴县| 汝城县| 虹口区| 阜平县| 泸溪县| 政和县| 彭阳县| 称多县| 安宁市| 东港市| 西林县| 漳平市| 文昌市| 泾源县| 柘荣县| 扶绥县| 玛沁县| 新巴尔虎左旗| 廊坊市|