Lujianlong

  • 主页
  • 随笔
  • 相册
所有文章 友链 关于我

Lujianlong

  • 主页
  • 随笔
  • 相册

Springboot中基于注解使用缓存

2019-08-21

文章导航

× 文章目录
  1. 1. 一、概述
  2. 2. 二、常用注解及其参数
  3. 3. 三、简单的使用

一、概述

Spring定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持使用JCache(JSR-107)注解简化我们开发;

  1. Cache接口为缓存的组件规范了定义,包含缓存的各种操作集合;
  2. Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,
    ConcurrentMapCache等;
  3. 每次调用需要缓存功能的方法时,Spring会检查指定参数所指定的目标方法是否
    已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法;
    并缓存结果后返回给用户。下次调用直接从缓存中获取。
  4. 使用Spring缓存抽象时我们需要关注以下两点;
  • 确定方法需要被缓存以及他们的缓存策略
  • 从缓存中读取之前缓存存储的数据

    二、常用注解及其参数

  1. 注解简介
注解 功能
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict 清空缓存
@CachePut 对存入缓存的数据进行更新
@EnableCaching 开启基于注解的缓存
@Caching 定义复杂的缓存规则
  1. @Cacheable/@CachePut/@CacheEvict主要的参数
常用参数 功能介绍 使用
value/cacheNames 缓存的名称,在spring配置文件中定义,必须指定至少一个 @Cacheable(value =”user”)或者 @Cacheable(value={“user”,”mycache”};
key 缓存的key,可以为空,如果指定要按照SpEL表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @Cacheable(value = {“user”},key = “#id”)
condition 缓存的条件,可以为空,使用SpEL编写,返回true或者false,只有为true才进行缓存/清除缓存,在调用方法之前之后都能判断 @Cacheable(value=”user”,condition=”#id>2”)
allEntries(@CacheEvict) 是否清空所有缓存内容,缺省为false,如果指定为true,则方法调用后将立即清空所有缓存 @CachEvict(value=”user”,allEntries=true)
beforeInvocation(@CacheEvict) 是否在方法执行前就清空,缺省为false,如果指定为true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 @CachEvict(value=”user”,beforeInvocation=true)
unless(@CachePut)(@Cacheable) 用于否决缓存的,不像condition,该表达式只方法执行之后判断,此时可以拿到返回值result进行判断。条件为true不会缓存,fasle才缓存 @Cacheable(value=”user”,unless=”#result == null”)
sync 是否支持异步 @Cacheable(value = {“user”},key = “#id”,sync = true)
keyGenerator 指定key的生成策略,不能和key同时使用 @Cacheable(value ={“user”},keyGenerator = “myKeyGenerator”)
cacheManager 用来指定缓存管理器
  1. Cache SpEL available metadata(可用的缓存元数据)
名字 位置 描述 示例
methodName root object 当前被调用的方法名 #root.methodName
method root object 当前被调用的方法 #root.method.name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象类 #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”,”cache2”})),则有两个cache #root.caches[0]
argumentname evaluation context 方法参数的名字.可以直接#参数名,也可以使用#p0或#a0的形式,0代表参数的索引; #iban、#a0、#p0
result evaluation context 方法执行后的返回值(仅当方法执行之后的判断有效,如”unless” cache put’的表达式’cache evict’的表达式,beforeInvocation=false) #result

三、简单的使用

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.example.jpa.controller;

import com.example.jpa.entity.User;
import com.example.jpa.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

@Autowired
private UserService userService;

@Cacheable(value = {"user"},key = "#id") //调用方法之前调用
@GetMapping("/user")
public User getUserById(@RequestParam Integer id){
return userService.getUserById(id);
}

@GetMapping("/users")
public List<User> getAll(){
return userService.getAll();
}

@Cacheable(value = "user",key = "#pageOffset")
@GetMapping("/usersByPage")
public Page<User> getAllByPage(@RequestParam Integer pageOffset,@RequestParam Integer pageSize){
return userService.getAll(PageRequest.of(pageOffset,pageSize));
}

@CachePut(value = "user",key = "#result.id") //即调用方法又更新缓存数据
@PostMapping("/user")
public User saveUser(@RequestBody User user){
return userService.saveUser(user);
}

//@CachePut(value = "user",key = "#result.id") //即调用方法又更新缓存数据
@Caching
@PutMapping("/user")
public User updateUser(@RequestBody User user){
return userService.updateUser(user);
}

@CacheEvict(value = "user",key = "#id")
@DeleteMapping("/user")
public void deleteUser(Integer id){
userService.deleteUserById(id);
}


}

==在这里碰到了一个问题,在更新数据的时候怎么确保分页里面的缓存数据也随之更新而不是返回更新前的数据?==

本文作者: Lujianlong
本文链接: http://yoursite.com/2019/08/21/Springboot中基于注解使用缓存/
本文访问量:178 次
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
知识共享许可协议
赏

谢谢你请我吃糖果

支付宝
微信
  • springboot
  • caching

扫一扫,分享到微信

微信分享二维码
MySQL的sql语句整理(超详细)
Spring Boot中整合Druid和Jpa实现简单的curd
© 2019 Lujianlong
本站总访问量35776人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 密码学基础
  • Base64算法
  • yillia
  • yilia
  • helper_live2d
  • mysql
  • gitment评论系统
  • 加密与解密类
  • 密钥生成器
  • springboot
  • caching
  • SpEL表达式
  • 静态资源映射规则
  • 日常bug
  • JDBC driver异常
  • maven
  • 本地jar包引入
  • java.security包
  • oracle
  • sql
  • servlet三大组件的注册
  • java
  • ini4j的使用
  • 分页查询
  • Monogdb进阶
  • java8
  • stream
  • LifecycleException解决思路
  • 使用方法
  • lombok
  • swagger2
  • devtools
  • vue
  • vue组件介绍
  • vue项目的搭建
  • vue父子组件间传值
  • 添加依赖
  • mongodb进阶
  • 多数据源
  • docker
  • 安装mysql
  • 虚拟机的安装
  • 对称加密算法
  • git
  • GIT 项目并托管到 GITHUB 仓库
  • 日常bug记录
  • 数字签名算法
  • github
  • 消息摘要算法
  • 证书和密钥的存储类
  • slf4j引入异常
  • ASN.1
  • 日志
  • Log4j日志配置
  • druid和jpa的简单使用
  • markdown
  • 配置文件的注入
  • 实现HttpServletRequest.getInputStream多次读取
  • druid和mysql的简单使用
  • 数字证书
  • 手撸ini文件的读写和修改
  • 自定义starter
  • 非对称加密算法

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • maven项目中引入本地jar包

    2019-10-21

    #maven#本地jar包引入

  • oracle使用sql语句删除某用户下所有的表

    2019-10-21

    #oracle#sql

  • MySQL的sql语句整理(超详细)

    2019-10-21

    #mysql

  • Springboot中基于注解使用缓存

    2019-08-20

    #springboot#caching

  • Spring Boot中整合Druid和Jpa实现简单的curd

    2019-08-18

    #springboot#druid和jpa的简单使用

  • springboot中集成druid和mybatits

    2019-08-15

    #springboot#druid和mysql的简单使用

  • 在docker中安装mysql详细攻略

    2019-08-13

    #docker#安装mysql

  • 自定义starter(实现HttpServletRequest重复读取)

    2019-08-13

    #springboot#自定义starter

  • Markdown语法整理(超详细)

    2019-07-31

    #markdown

  • SpringBoot中servlet三大组件的注册[Servlet,Filter,Listener]

    2019-07-24

    #springboot#servlet三大组件的注册

  • ASN.1入门(超详细)

    2019-07-18

    #ASN.1

  • SpringBoot的静态资源映射规则

    2019-07-16

    #springboot#静态资源映射规则

  • Springboot配置文件值注入

    2019-07-04

    #springboot#配置文件的注入

  • SpEL(Spring表达语言)表达式详述

    2019-07-04

    #springboot#SpEL表达式

  • 实现HttpServletRequest.getInputStream多次读取

    2019-06-28

    #日常bug#实现HttpServletRequest.getInputStream多次读取

  • Log4j日志配置

    2019-06-28

    #日志#Log4j日志配置

  • vue父子组件间传值

    2019-06-22

    #vue#vue父子组件间传值

  • vue组件介绍

    2019-06-22

    #vue#vue组件介绍

  • 前端项目中怎么添加依赖

    2019-06-22

    #vue#添加依赖

  • vue项目的搭建和常见问题的解决

    2019-06-22

    #vue#vue项目的搭建

  • mongodb多条件分页查询的三种方法

    2019-06-09

    #分页查询#Monogdb进阶

  • 多数据源mongodb的使用

    2019-06-08

    #mongodb进阶#多数据源

  • 手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)

    2019-06-07

    #java#手撸ini文件的读写和修改

  • java使用ini4j读写和修改ini配置文件(支持section)

    2019-06-07

    #java#ini4j的使用

  • JAVA8新特性之stream

    2019-05-19

    #java8#stream

  • Base64算法

    2019-05-19

    #密码学基础#Base64算法

  • 消息摘要算法(进阶)

    2019-05-19

    #密码学基础#消息摘要算法

  • 初等数据加密--对称加密算法

    2019-05-19

    #密码学基础#对称加密算法

  • 高等数据加密--非对称加密算法

    2019-05-19

    #密码学基础#非对称加密算法

  • 数字签名算法

    2019-05-19

    #密码学基础#数字签名算法

  • 数字证书

    2019-05-19

    #密码学基础#数字证书

  • JCE加密和解密(基础篇)

    2019-05-19

    #密码学基础#加密与解密类

  • KeyGenerator和KeyPairGenerator

    2019-05-19

    #密码学基础#密钥生成器

  • 证书和密钥的存储类

    2019-05-19

    #密码学基础#证书和密钥的存储类

  • 数字签名算法

    2019-05-19

    #密码学基础#数字签名算法

  • java.security包的部分类详解

    2019-05-19

    #密码学基础#java.security包

  • 消息摘要算法

    2019-05-19

    #密码学基础#消息摘要算法

  • 密码学基础

    2019-05-19

    #密码学基础

  • 三个简化开发的小技巧

    2019-05-19

    #lombok#swagger2#devtools

  • You must configure either the server or JDBC driver (via the serverTimezone conf解决办法

    2019-05-19

    #日常bug#JDBC driver异常

  • org.apache.catalina.LifecycleException解决办法

    2019-05-19

    #日常bug#LifecycleException解决思路

  • 安装虚拟机时趟过的坑

    2019-05-19

    #日常bug#虚拟机的安装

  • 解决slf4j导入失败

    2019-05-19

    #日常bug#slf4j引入异常

  • 将一个已存在的目录转换为一个 GIT 项目并托管到 GITHUB 仓库

    2019-05-19

    #git#GIT 项目并托管到 GITHUB 仓库

  • Hexo yilia主题的使用方法

    2019-05-19

    #yilia#使用方法

  • Hexo博客yilia主题添加Gitment评论系统

    2019-05-19

    #yilia#gitment评论系统

  • Hexo+yilia添加helper-live2d插件实现宠物动画

    2019-05-19

    #yilia#helper_live2d

  • Hexo+Github实现相册功能

    2019-05-12

    #yillia

  • 无法登陆github官网的解决办法

    2019-05-09

    #github

  • 前端开发兼容ie9趟过的坑

    2019-05-09

    #日常bug记录

  • Hello World

    2019-04-15

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家