注解方式使用 Redis 缓存
使用缓存有两个前置步骤
在
pom.xml
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 整合redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- springboot测试 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
在启动类上加注解 @EnableCaching
@SpringBootApplication
@EnableCaching
public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}
}
常用的注解有以下几个@Cacheable、@CachePut、@CacheEvict
添加缓存
缓存的key就是配置在注解里面的值product::123,值是你方法的返回值,如果没有返回值,值就是org.springframework.cache.support.NullValue
在需要加缓存的方法上添加注解 @Cacheable(cacheNames = "product", key = "123")
,
cacheNames
和 key
都必须填,如果不填 key
,默认的 key
是当前的方法名,更新缓存时会因为方法名不同而更新失败。
如在订单列表上加缓存
@RequestMapping(value = "/list", method = RequestMethod.GET)@Cacheable(cacheNames = "product", key = "123")public List<Product> list() {List<Product> products=new ArrayList<>();for (int i = 0; i < 3; i++) {Product product=new Product();product.setId(i+1);product.setName("第"+(i+1)+"件商品");product.setPrice((double) ((i+1)*100));products.add(product);}return products;}
可能会报错,原因是对象未序列化。让对象实现 Serializable
方法即可。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product implements Serializable {private Integer id;private String name;private Double price;
}
重启项目访问订单列表,在 rdm 里查看 Redis 缓存,有 product::123
说明缓存成功。
更新缓存
在需要更新缓存的方法上加注解: @CachePut(cacheNames = "product", key = "123")
注意
cacheNames
和key
要跟@Cacheable()
里的一致,才会正确更新。
@CachePut()
和@Cacheable()
注解的方法返回值要一致
删除缓存
在需要删除缓存的方法上加注解:@CacheEvict(cacheNames = "product", key = "123")
,执行完这个方法之后会将 Redis 中对应的记录删除。
其他常用功能
cacheNames
也可以统一写在类上面,@CacheConfig(cacheNames = "product")
,具体的方法上就不用写啦。
@RestController
@CacheConfig(cacheNames = "product")
public class ProdectController {}
Key 也可以动态设置为方法的参数
@GetMapping("/detail")@Cacheable(cacheNames = "product", key = "#id")public Product detail(@RequestParam("id") Integer id){if (id==1){return new Product(1,"电冰箱",20d);}else if (id==2){return new Product(2,"洗衣机",30d);}else {return new Product(3,"彩电",40d);}}
如果参数是个对象,也可以设置对象的某个属性为 key。比如其中一个参数是 user 对象,key 可以写成
key="#user.id"
缓存还可以设置条件。
设置当 openid 的长度大于3时才缓存
@GetMapping("/detailOnCondition")@Cacheable(cacheNames = "product", key = "#id", condition = "#id > 2")public void detail(@RequestParam("id") String id){System.out.println("id是"+id);}
还可以指定 unless
即条件不成立时缓存。#result
代表返回值,意思是当返回码不等于 0 时不缓存,也就是等于 0 时才缓存。
@GetMapping("/detailOnConditionAndUnless")@Cacheable(cacheNames = "product", key = "#id", condition = "#id > 2", unless = "#result!= 0")public Integer detailOnConditionAndUnless(@RequestParam("id") Integer id){if (id==3){return 0;}else {return 1;}}
注解方式使用 Redis 缓存相关推荐
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...
- cacheput注解 用法_以注解的方式使用redis缓存得用法@CachePut , @CacheEvict, @Cacheable...
第一步:在启动类加注解@EnableCaching @SpringBootApplication @EnableCaching //@MapperScan(basePackages = "c ...
- SpringBoot缓存管理(二) 整合Redis缓存实现
SpringBoot支持的缓存组件 觅波小说网 https://www.3812.info 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springfr ...
- Redis -- 缓存穿透和雪崩
文章目录 一.缓存穿透 1.1 概念 1.2 解决方案 1.3 布隆过滤器的工作原理 二.缓存击穿 2.1 概念 2.2 解决方案 三.缓存雪崩 3.1 概念 3.2 解决方案 用户的数据一般是存储于 ...
- 使用shiro的会话管理和redis缓存管理来构建登录模块spring+struts+hibernate(SSH)
shiro是一个很好用的安全框架,主要表现在用户认证,权限认证,会话管理,如果想优化还可以做Cache管理,我们不需要做太多工作在用户身份token安全方面(记录shiro及用redis开发的步骤及一 ...
- Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案
前言 在日常的项目中,缓存的使用场景是比较多的.缓存是分布式系统中的重要组件,主要解决在高并发.大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问.本文以Redis作为缓存时,针对常见的缓存 ...
- Redis - 缓存雪崩,缓存穿透,缓存击穿
Redis是一个完全开源的,遵守BSD协议的,高性能的key-value的数据存储结构系统,它支持数据持久化,可以将内存中的数据保存在磁盘中.不仅支持简单的key-value类型的数据结构,同事还提供 ...
- Spring Boot集成Redis缓存之注解方式
首先还是加入依赖Jar pom.xml中加入依赖 <!-- 加载spring boot redis 包 --><dependency><groupId>org.sp ...
- redis使用@Cacheable等注解为接口添加缓存
缓存处理方式应该是 先从缓存中拿数据,如果有,直接返回. 如果拿到的为空,则数据库查询,然后将查询结果存到缓存中. 由此实现方式应该如下: private String baseKey = " ...
最新文章
- 类变量利用Java反射获取类的私有变量值
- Ganglia 调试技巧
- 回文数的个数、杨辉三角
- SAP UI5 how the ui library theme parameter is loaded
- html 替代table,Iframe的缺点,div或者table成为替代者
- 2019ICPC西安邀请赛 E. Tree(树剖 + 线段树)
- 【渝粤题库】国家开放大学2021春2503学前儿童健康教育题目
- 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化
- 高中计算机学考操作ppt,高中信息技术基础学考专题复习(共25张PPT)
- JMS学习二(简单的ActiveMQ实例)
- 一大早,分享一个好消息
- Angr安装与使用之使用篇(十)
- c语言是高级编程语言吗,C语言是高级编程语言吗?
- 初次使用dcm4che-tool-findscu做查询
- 作为空降领导,该如何做?
- “本人成分” 如何填写
- Excel表格如何设置下拉选项并应用到整列
- CPU GPU 扫盲帖
- 公网对讲机与传统对讲机的发展与融合分析
- Java基本数据类型初始值(默认值)