Mybatis-plus基于redis实现二级缓存过程解析

作者:william_zhao 时间:2021-12-08 23:34:43 

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 # 连接池最大连接数(使用负值表示没有限制)
   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"/>

两种方式根据实际情况二选一即可!

@CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
@Mapper
public interface SysConfigDao extends BaseMapper<SysConfig> {}

如果调用该mapper下的方法,那么会使用redis缓存

Mybatis-plus基于redis实现二级缓存过程解析

来源:https://www.cnblogs.com/wiliamzhao/p/13334837.html

标签:Mybatis,plus,redis,二级,缓存
0
投稿

猜你喜欢

  • Android如何在Gradle中更改APK文件名详解

    2021-06-02 12:59:31
  • Spring+Junit4进行接口测试实例代码

    2021-09-15 07:44:06
  • java 线程创建多线程详解

    2021-08-06 22:02:22
  • 聊聊Java 中的线程中断

    2021-05-31 02:04:30
  • Java中的Object类用法总结

    2023-06-06 11:48:36
  • 一款域名监控小工具 Domain(IP)Watcher 实现代码

    2023-09-15 11:55:44
  • Jmeter 中 CSV 如何参数化测试数据并实现自动断言示例详解

    2023-10-17 15:37:42
  • Spring Cloud Eureka(全面解析) 大白话

    2022-11-12 22:43:02
  • idea 如何查找类中的某个方法

    2022-03-17 17:17:42
  • Android Jetpack架构组件 ViewModel详解

    2021-09-08 00:29:20
  • C#利用缓存分块读写大文件

    2022-10-20 11:18:22
  • SpringBoot AOP控制Redis自动缓存和更新的示例

    2023-08-31 17:34:37
  • C#实现字符串与图片的Base64编码转换操作示例

    2021-07-06 14:29:21
  • SpringBoot自定义starter启动器的实现思路

    2023-10-09 00:55:15
  • java开发微信公众号支付

    2021-10-24 16:02:40
  • 深入解析Android系统中应用程序前后台切换的实现要点

    2022-09-11 01:26:30
  • CefSharp过滤图片RequestHandler问题

    2023-06-05 03:01:39
  • c# 方法可变数量的参数

    2023-10-06 07:31:21
  • 浅谈Silverlight 跨线程的使用详解

    2021-10-16 01:23:05
  • Android实现沉浸式状态栏功能

    2022-10-25 23:19:36
  • asp之家 软件编程 m.aspxhome.com