Mybatis-plus基于redis實現(xiàn)二級緩存過程解析
1. mybatis-plus開啟二級緩存
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 # 連接超時時間(毫秒)默認是2000ms
lettuce:
pool:
max-active: 200 # 連接池最大連接數(shù)(使用負值表示沒有限制)
max-wait: -1ms # 連接池最大阻塞等待時間(使用負值表示沒有限制)
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自動注入
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來序列化和反序列化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("緩存出錯 ");
}
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ù)實際情況二選一即可!
@CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
@Mapper
public interface SysConfigDao extends BaseMapper<SysConfig> {}
如果調用該mapper下的方法,那么會使用redis緩存

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
redis之基于SpringBoot實現(xiàn)Redis stream實時流事件處理方式
這篇文章主要介紹了redis之基于SpringBoot實現(xiàn)Redis stream實時流事件處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Java數(shù)據(jù)結構中雙向鏈表的實現(xiàn)
這篇文章主要介紹了Java數(shù)據(jù)結構中雙向鏈表的實現(xiàn),雙向鏈表是一種常見的數(shù)據(jù)結構,它允許在鏈表中的任意位置進行高效的插入和刪除操作,需要的朋友可以參考下2022-05-05
關于springcloud報錯報UnsatisfiedDependencyException的問題
這篇文章主要介紹了關于springcloud報錯報UnsatisfiedDependencyException的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

