12.19 redis缓存
---恢复内容开始---
命中:应用程序从key中获取数据,取到后返回
失效:到设置的失效时间后就失效
更新:应用程序把数据存到数据库中后又放回去
在项目中使用redis方法
结合业务场景,避免滥用
@Cacheable 第一次会调用方法,并将返回的数据存在redis里面的key中,第二次直接从key中取值------------------该标签一般用于查询方法
@CachePut 每次都会调用方法并执行里面的内容(注意,是每次都会执行方法),并将返回的内容添加到redis中去,(返回值与redis已缓存的数据类型一样时才能覆盖之前的数据.同时调用查询等方法时的返回值对象与更改的返回对象必须一致,因为他们是对同一对象进行存储操作,如果类型不一致,导致redis存值不统一而无法进行更新同步,另在返回值不一致的情况下用@CacheEvict注解删除redis里面的数据再调用查询方法 存值进去以完成跟新 )*----------------------一般用于对数据进行更改操作
@CacheEvict 在调用方法执行完毕后清除原来redis缓存的数据,此时redis里面没有值,需重新调用方法(查询方法或者其他含@Cacheable注解)存值,一般在数据库数据更改时使用,(用于返回值与已缓存的数据类型不一样时使用)
CachePut 与 CacheEvict 区别:
CachePut 每次在调用方法后会将返回值存到redis里面去,但是redis里面的返回值类型必须与方法的返回值类型一致;
CacheEvict 每次在调用方法后会将redis里面对应的值删除,同时redis里面的值必须要重新调用方法来存入,常用于方法返回值于redis里面类型不一致时.
1.在项目启动类加上注解@EnableCaching
1
2
3
4
5
6
7
8
|
@SpringBootApplication @EnableCaching public class SellApplication { public static void main(String[] args) { SpringApplication.run(SellApplication. class , args); } } |
2.如果没有jar包,引入依赖
1
2
3
4
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> |
/开启redis缓存,返回对象也必须序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//订单列表
@GetMapping ( "/list" )
@Cacheable (cacheNames = "product" ,key = "123"
//,同时 //开启redis缓存,返回对象也必须序列化 //在类名上面加入注解,@CacheConfig (cacheNames= "product" )作用域时,在方法开启缓存注解中就不用加cacheNames = "product",只需要加KEY就可以 动态传key @Cacheable (cacheNames = "product" ,key = "#openid" ,condition= "#openid==1" ,unless= "#ResultVO<List<OrderDTO>>.getsize()<=0" ) //condition= "#openid==1" 根据传入条件判断,当openid== 1 时才会返回值存到redis中,条件不成立时不会缓存(spel表达式使用) //unless= "#ResultVO<List<OrderDTO>>.getsize()<=0" 根据返回值进行条件,可以根据返回值属性进行是否进行缓存,写的条件要与理想条件相反,例如想查询某 //属性> 1 的时候缓存,则unless里面条件要写成某属性<= 1 public ResultVO<List<OrderDTO>> list( @RequestParam ( "openid" ) String openid, @RequestParam (value = "page" , defaultValue = "0" ) Integer page, @RequestParam (value = "size" , defaultValue = "10" ) Integer size) { if (StringUtils.isEmpty(openid)) { log.error( "【查询订单列表】openid为空" ); throw new SellException(ResultEnum.PARAM_ERROR); } PageRequest request = new PageRequest(page, size); Page<OrderDTO> orderDTOPage = orderService.findList(openid, request); return ResultVOUtil.success(orderDTOPage.getContent()); } |
//返回类型bea里面要序列化实现Serializable: implements
Serializable
1
2
3
4
5
6
|
@Data public class ResultVO<T> implements Serializable{ //生成Id可以使用插件SerialVersionUID生成,生成的码可以保证唯一,用快捷键直接生成,安装插件后, // 在keymap中找到SerialVersionUID插件,并设置快捷键,再使用快捷键生成,本机 ctrl+alt+反斜杠 private static final long serialVersionUID = 3068837394742385883L; |
注意:数据库更新时理想状态是redis里面数据一起更新
---恢复内容结束---