springboot Redis 缓存
1,先整合 redis 和 mybatis
步骤一: springboot 整合 redis
步骤二: springboot 整合 mybatis
2,启动类添加 @EnableCaching 注解,开启缓存
因为缓存获取不到数据要到数据库获取,所以还要扫描 mybatis 接口路径
@SpringBootApplication
@MapperScan("com.test.Idao")
@EnableCaching
public class StringbootRedisCacheApplication { public static void main(String[] args) {
SpringApplication.run(StringbootRedisCacheApplication.class, args);
}
}
3,增(获取)、删、改缓存注解
@Cacheable 获取缓存 ---- 该注解用于方法上,方法不一定执行
@Cacheable(cacheNames = "user", key="#id"),在 redsi 中 key 是 cacheNames 和 key 拼接而成,如果 id 为 1 ,具体的 key 为:user::1
cacheNames 随意指定,key 只能是来自于当前方法的参数
会根据 key 先到 redis 获取数据,如果没获取到,就运行方法到数据库取得数据并放入 redis,下次调用该方法就不会到数据库了
@CachePut 更新缓存 ---- 该注解用于方法上,方法每次都会执行
配置和 @Cacheable 一致
先到数据库修改数据,再根据 key 到 redis 中查询,如果有数据就更新,如果没有就添加,值是方法的返回值
@CacheEvict 删除缓存 ---- 该注解用于方法上,方法每次都会执行
配置和 @Cacheable 一致
根据 key 到 redis 中查询,如果有数据就删除
@CacheConfig ---- 该注解用于类上,用于简化上面 3 个配置,可以一次性定义 cacheNames ,方法上配置别的属性即可
示例
// key 只能是 id,因为参数是 id
@Cacheable(cacheNames="user", key="#id")
public User getUserById(int id){} // 如果参数是对象,key 可以是参数的任意属性名
@CachePut(cacheNames="user", key="#user.id")
public User updateUserById(User user){} // 如果参数是基本类型,可以不配置 key,默认就是该参数作为 key
@CacheEvict(cacheNames="user")
public User deleteUserById(int id){} // CacheConfig 配置了 cacheNames="user",所有方法的cacheNames都是 user
@CacheConfig(cacheNames="user")
public class UserService{
@Cacheable
public User getUserById(int id){}
@CachePut(key="#user.id")
public User updateUserById(User user){}
}
坑:
1,如果 key 不是唯一的(比如用户表中的 name 字段作为缓存的 key ),结果就会在缓存中一个 key 查出一个 list ,这是修改要特别注意因为 @CacheEvict 注解会把该方法的返回值作为 value 覆盖原来的 value,我有个这样的需求,我的解决办法是:修改方法不做缓存操作,方法执行完后调用一个方法来清除原来的缓存,这样能解决数据的准确性,但是每当修改后要再查询数据的话就需要把 mysql 数据放入 redis
2,在 pojo 类上不能使用 @Repository 注解,建议使用 @Component
3,各个缓存方法只能在外部调用才会生效(比如在 service 层定义,在 controller 层调用)
springboot Redis 缓存的更多相关文章
- springboot redis 缓存对象
只要加入spring-boot-starter-data-redis , springboot 会自动识别并使用redis作为缓存容器,使用方式如下 gradle加入依赖 compile(" ...
- SpringBoot Redis缓存 @Cacheable、@CacheEvict、@CachePut
文章来源 https://blog.csdn.net/u010588262/article/details/81003493 1. pom.xml <dependency> <gro ...
- springboot + redis缓存使用
[参照资料] 1.spring boot 官网文档 2.https://www.cnblogs.com/gdpuzxs/p/7222309.html [项目结构] [pom.xml配置] <?x ...
- 从.Net到Java学习第七篇——SpringBoot Redis 缓存穿透
从.Net到Java学习系列目录 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数 ...
- 微服务-Springboot+Redis缓存管理接口代码实现
废话少说,上代码,结合代码讲解: 一.创建maven工程:导入依赖: <packaging>war</packaging><!--修改jdk的版本--><pr ...
- springboot redis 缓存跨域丢失问题
对于前后端分离的项目,在开发阶段经常会遇到跨域的问题. 1.首先,对于后台的处理方式,第一种是用 @CrossOrigin 注解,@crossorigin是后端SpringMVC框架(需4.2版本以上 ...
- spring-boot的spring-cache中的扩展redis缓存的ttl和key名
原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...
- java框架之SpringBoot(11)-缓存抽象及整合Redis
Spring缓存抽象 介绍 Spring 从 3.1 版本开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cache ...
随机推荐
- 一个applicationContext 加载错误导致的阻塞解决小结
问题为对接一个sso的验证模块,正确的对接姿势为,接入一个 filter, 然后接入一个 SsoListener . 然而在接入之后,却导致了应用无法正常启动,或者说看起来很奇怪,来看下都遇到什么样的 ...
- hbase概念解析
hbase是一种nosql数据库.是一个高可靠,高性能,面向列,可伸缩,实时读取的分布式数据库. hbase一般由行键,时间戳,列族,列,表格单元,行组成. 行一般由一个行键和一个或多个具有关联关系值 ...
- MySQL数据库的锁机制
在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...
- 机器学习入门14 - 神经网络简介 (Introduction to Neural Networks)
原文链接:https://developers.google.com/machine-learning/crash-course/introduction-to-neural-networks/ 神经 ...
- DedeCMS上传视频
DedeCMS建站方便快捷,但是在上传视频时会出现问题,主要是文件格式与大小限制,需要修改配置文件,修改的地方主要有: 1.修改 DedeCMS系统配置参数--附件设置--允许的多媒体软件类型(以MP ...
- python基础-变量运算符(3)
一.注释 注释就是对代码的解释和说明.目的是为了让别人和自己很容易看懂.为了让别人一看就知道这段代码是做什么用的.正确的程序注释一般包括序言性注释和功能性注释.序言性注释的主要内容包括模块的接口.数据 ...
- 课程回顾-Convolutional Neural Networks
为什么卷积层计算量更低paddingStrided convolution多维卷积LeNet 参数卷积网络的好处参数共享稀疏连接经典网络实现LeNet-5AlexNetVGGResNet残差块iden ...
- HDU 1006 Digital Roots
Problem Description The digital root of a positive integer is found by summing the digits of the int ...
- MySQL GTID你知多少
MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...
- python中执行该文件,就调用 mian 方法
代码: test.py import student def main(): st = student.student(1001, 'tommy', 18) st.sing() st.dance() ...