Mybatis-plus基于redis實(shí)現(xiàn)二級(jí)緩存過(guò)程解析
1. mybatis-plus開(kāi)啟二級(jí)緩存
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://192.168.222.155:3306/sys?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf-8 username: root password: 123456 redis: host: 39.104.203.155 port: 6380 password: 123456 database: 1 timeout: 2000ms # 連接超時(shí)時(shí)間(毫秒)默認(rèn)是2000ms lettuce: pool: max-active: 200 # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) max-wait: -1ms # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) max-idle: 100 # 連接池中的最大空閑連接 min-idle: 50 # 連接池中的最小空閑連接 shutdown-timeout: 100ms # sentinel: # 哨兵模式 # master: mymaster # nodes: 192.168.222.155:26379,192.168.222.155:26380,192.168.222.155:26381 mybatis-plus: mapper-locations: classpath*:/mapper/*.xml type-aliases-package: com.redis.shaobing.entity global-config: db-config: id-type: auto table-underline: true configuration: cache-enabled: true map-underscore-to-camel-case: true
2. 自定義自己的緩存管理
package com.redis.shaobing.utils; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.cache.Cache; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; 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自動(dòng)注入 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; } public RedisTemplate<String, Object> getRedisTemplate() { redisTemplate = (RedisTemplate<String, Object>) ApplicationContextUtils.getBean("redisTemplate"); Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); //使用StringRedisSerializer來(lái)序列化和反序列化redis的key值 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(serializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(serializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } @Override public String getId() { return this.id; } @Override public void putObject(Object key, Object value) { redisTemplate = getRedisTemplate(); if (value != null) { redisTemplate.opsForHash().put(id.toString(), key.toString(), value); } } @Override public Object getObject(Object key) { redisTemplate = getRedisTemplate(); try { if (key != null) { return redisTemplate.opsForHash().get(id.toString(), key.toString()); } } catch (Exception e) { e.printStackTrace(); log.error("緩存出錯(cuò) "); } return null; } @Override public Object removeObject(Object key) { redisTemplate = getRedisTemplate(); if (key != null) { redisTemplate.delete(key.toString()); } return null; } @Override public void clear() { System.out.println("清空緩存"); log.debug("清空緩存"); redisTemplate = getRedisTemplate(); redisTemplate.delete(id.toString()); } @Override public int getSize() { redisTemplate = getRedisTemplate(); Long size = redisTemplate.opsForHash().size(id.toString()); return size.intValue(); } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } }
3. 在mapper上加上注解@CacheNamespace或者在Mpper.xml中加入<cache type="com.redis.shaobing.utils.MybatisRedisCache"/>
兩種方式根據(jù)實(shí)際情況二選一即可!
@CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
@Mapper
public interface SysConfigDao extends BaseMapper<SysConfig> {}
如果調(diào)用該mapper下的方法,那么會(huì)使用redis緩存
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
xxl-job如何濫用netty導(dǎo)致的問(wèn)題及解決方案
本篇文章講解xxl-job作為一款分布式任務(wù)調(diào)度系統(tǒng)是如何濫用netty的,導(dǎo)致了怎樣的后果以及如何修改源碼解決這些問(wèn)題,netty作為一種高性能的網(wǎng)絡(luò)編程框架,十分受大家喜愛(ài),今天就xxl-job濫用netty這一問(wèn)題給大家詳細(xì)下,感興趣的朋友一起看看吧2021-05-05Java操作MinIO實(shí)現(xiàn)文件的上傳和刪除
本文主要介紹如何將本地Java項(xiàng)目resources目錄下的一個(gè)PNG圖片上傳到MinIO,然后將上傳的圖片刪除,文中有詳細(xì)的流程步驟和示例代碼,需要的朋友可以參考下2023-06-06Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄
這篇文章主要介紹了Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢的操作方法
這篇文章主要介紹了Mybatis Criteria的and和or進(jìn)行聯(lián)合條件查詢的方法,本文通過(guò)例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10SpringBoot獲取yml和properties配置文件的內(nèi)容
這篇文章主要為大家詳細(xì)介紹了SpringBoot獲取yml和properties配置文件的內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Spring boot actuator端點(diǎn)啟用和暴露操作
這篇文章主要介紹了Spring boot actuator端點(diǎn)啟用和暴露操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07