您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么利用Redis作為Mybatis的二級緩存”,在日常操作中,相信很多人在怎么利用Redis作為Mybatis的二級緩存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么利用Redis作為Mybatis的二級緩存”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
關于Mybatis-Plus的基礎設置就不多做介紹了,只說和二級緩存有關的。
首先在配置文件開啟二級緩存。
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl cache-enabled: true # 開啟二級緩存 mapper-locations: classpath:*/mapper/*.xml
這部分就是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; } }
我們只需要實現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的記錄:
2.第二次查詢,直接走緩存
3.重啟項目,依然可以直接查緩存
不知道有沒有細心的同學注意到這樣一行日志:
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的二級緩存”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。