当前位置: 首页 > news >正文

redis作为mybaits(mybatisplus)的缓存

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置application.yml文件

spring:data:redis:# 地址host: 127.0.0.1# 端口port: 6379# 数据库索引database: 8# 密码password: root# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms
# MyBatis配置
# mybatis:
mybatis-plus:global-config:banner: false# 搜索指定包别名typeAliasesPackage: com.hongri.**.domain# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*Mapper.xml# 加载全局的配置文件configLocation: classpath:mybatis/mybatis-config.xml
配置mybatis-config.xml
  • cacheEnabled一定要开启,要不然缓存不生效
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 全局参数 --><settings><!-- 使全局的映射器启用或禁用缓存 --><setting name="cacheEnabled" value="true"/><!-- 允许JDBC 支持自动生成主键 --><setting name="useGeneratedKeys" value="true"/><!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 --><setting name="defaultExecutorType" value="SIMPLE"/><!-- 指定 MyBatis 所用日志的具体实现 --><setting name="logImpl" value="SLF4J"/><!-- 使用驼峰命名法转换字段 --><!-- <setting name="mapUnderscoreToCamelCase" value="true"/> --></settings></configuration>

redis配置

RedisConfig
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** Redis配置*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {@Bean(name = "mybaitsCacheTemplate")public RedisTemplate<String, Object> mybaitsTedisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 解决反序列化 LocalDateTime 的错误objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);// 解决 LocalDateTime 序列化失败的问题objectMapper.registerModule(new JavaTimeModule());objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.WRAPPER_ARRAY);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key 采用 String 的序列化方式template.setKeySerializer(stringRedisSerializer);// value 序列化方式采用 jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash 的 key 也采用 String 的序列化方式template.setHashKeySerializer(stringRedisSerializer);// hash 的 value 序列化方式采用 jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}@Beanpublic DefaultRedisScript<Long> limitScript() {DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setScriptText(limitScriptText());redisScript.setResultType(Long.class);return redisScript;}/*** 限流脚本*/@Contract(pure = true)private @NotNull String limitScriptText() {return "local key = KEYS[1]\n" +"local count = tonumber(ARGV[1])\n" +"local time = tonumber(ARGV[2])\n" +"local current = redis.call('get', key);\n" +"if current and tonumber(current) > count then\n" +"    return tonumber(current);\n" +"end\n" +"current = redis.call('incr', key)\n" +"if tonumber(current) == 1 then\n" +"    redis.call('expire', key, time)\n" +"end\n" +"return tonumber(current);";}}
MyBatisRedisCache
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class MyBatisRedisCache implements Cache {private static RedisTemplate<String , Object> redisTemplate;private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);private String id;public MyBatisRedisCache(String id) {if (StringUtils.isEmpty(id)) {throw new IllegalArgumentException("cache instances require an id.");}this.id = "key前缀:" + id;//this.id = id;if (redisTemplate == null) {redisTemplate = SpringUtils.getBean("mybaitsCacheTemplate");}}@Overridepublic String getId() {return this.id;}@Overridepublic void putObject(Object key, Object value) {if (!StringUtils.isEmpty(value)) {redisTemplate.opsForHash().put(id, key.toString() , value);//log.info("mybatis缓存,{}:[{}]" , key , value );}}@Overridepublic Object getObject(Object key) {if (!StringUtils.isEmpty(key)) {Object object = redisTemplate.opsForHash().get(this.id, key.toString());//log.info("mybatis缓存读取,{}:[{}]", key , object);return object;}return null;}@Overridepublic Object removeObject(Object key) {if (!StringUtils.isEmpty(key)) {redisTemplate.delete(key.toString());//log.info("mybatis缓存删除,{}", key);}return null;}@Overridepublic void clear() {redisTemplate.delete(id.toString());}@Overridepublic int getSize() {return redisTemplate.opsForHash().size(id.toString()).intValue();}@Overridepublic ReadWriteLock getReadWriteLock() {return readWriteLock;}}

使用缓存

  • 在mapper上添加@CacheNamespace注解
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.common.core.domain.entity.SysUser;
import com.common.core.redis.MyBatisRedisCache;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 用户表 数据层*/
@CacheNamespace(implementation = MyBatisRedisCache.class,eviction = MyBatisRedisCache.class)
public interface SysUserMapper extends BaseMapper<SysUser> {/*** 根据条件分页查询用户列表** @param sysUser 用户信息* @return 用户信息集合信息*/public List<SysUser> selectUserList(SysUser sysUser);
}
  • 我们每次调用
http://www.lryc.cn/news/444121.html

相关文章:

  • 【环境配置】AST: Asymmetric Student-Teacher Networks for Industrial Anomaly Detection
  • TinkerTool System for Mac实用软件系统维护工具
  • 物理学基础精解【9】
  • Flask-JWT-Extended登录验证
  • Altium Designer(AD)百度云下载与安装(附安装步骤)
  • 无人机视角下的车辆数据集
  • 【MYSQL】聚合查询、分组查询、联合查询
  • 使用IDA Pro动态调试Android APP
  • JS中的for...in和for...of有什么区别?
  • 【C++篇】引领C++模板初体验:泛型编程的力量与妙用
  • 在react中 使用redux
  • 计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习
  • Spring-bean的生命周期-终篇
  • Kotlin 枚举和 when 表达式(六)
  • 数字范围按位与
  • WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库
  • Nature Electronics |无感佩戴的纤维基电子皮肤(柔性半导体器件/柔性健康监测/电子皮肤/柔性传感/纤维器件)
  • 深入剖析Docker容器安全:挑战与应对策略
  • 后端技术打怪升级之路
  • Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero
  • 计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)
  • 测试面试题:接口自动化测试流程?
  • Golang面试题
  • 《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)
  • 计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档
  • 【数据结构与算法】LeetCode:二分查找
  • 专题·大模型安全 | 生成式人工智能的内容安全风险与应对策略
  • CORS跨域+Nginx配置、Apache配置
  • 文件查找和打包压缩【1.7】
  • 速盾:cdn一般多长时间清理下缓存?