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

 更新时间:2020年08月07日 09:41:18   作者:william_zhao  
这篇文章主要介绍了Mybatis-plus基于redis实现二级缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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缓存

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • spring boot mybatis枚举映射示例代码

    spring boot mybatis枚举映射示例代码

    这篇文章主要给大家介绍了关于spring boot mybatis枚举映射的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • xxl-job如何滥用netty导致的问题及解决方案

    xxl-job如何滥用netty导致的问题及解决方案

    本篇文章讲解xxl-job作为一款分布式任务调度系统是如何滥用netty的,导致了怎样的后果以及如何修改源码解决这些问题,netty作为一种高性能的网络编程框架,十分受大家喜爱,今天就xxl-job滥用netty这一问题给大家详细下,感兴趣的朋友一起看看吧
    2021-05-05
  • 举例讲解Java中Piped管道输入输出流的线程通信控制

    举例讲解Java中Piped管道输入输出流的线程通信控制

    Java中的PipedWriter、PipedReader类管道的读写依赖于PipedOutputStream、PipedInputStream两个管道输入输出类,这里我们将来举例讲解Java中Piped管道输入输出流的线程通信控制:
    2016-06-06
  • java 中Thread.join()的使用方法

    java 中Thread.join()的使用方法

    这篇文章主要介绍了java 中Thread.join()的使用方法的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java操作MinIO实现文件的上传和删除

    Java操作MinIO实现文件的上传和删除

    本文主要介绍如何将本地Java项目resources目录下的一个PNG图片上传到MinIO,然后将上传的图片删除,文中有详细的流程步骤和示例代码,需要的朋友可以参考下
    2023-06-06
  • Spring Security OAuth2集成短信验证码登录以及第三方登录

    Spring Security OAuth2集成短信验证码登录以及第三方登录

    这篇文章主要介绍了Spring Security OAuth2集成短信验证码登录以及第三方登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Mybatis Criteria使用and和or进行联合条件查询的操作方法

    Mybatis Criteria使用and和or进行联合条件查询的操作方法

    这篇文章主要介绍了Mybatis Criteria的and和or进行联合条件查询的方法,本文通过例子给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • SpringBoot获取yml和properties配置文件的内容

    SpringBoot获取yml和properties配置文件的内容

    这篇文章主要为大家详细介绍了SpringBoot获取yml和properties配置文件的内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Spring boot actuator端点启用和暴露操作

    Spring boot actuator端点启用和暴露操作

    这篇文章主要介绍了Spring boot actuator端点启用和暴露操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Spring Boot 中的 SockJS原理及使用方法

    Spring Boot 中的 SockJS原理及使用方法

    SockJS 的主要作用是提供一种 WebSocket 的兼容性解决方案,使得不支持 WebSocket 的浏览器也可以使用 WebSocket,本文介绍了Spring Boot中的SockJS,包括SockJS的原理,使用方法和示例代码,感兴趣的朋友跟随小编一起看看吧
    2023-07-07

最新评论