Spring Cache是一个框架,实现了基于注解的缓存功能,只须要简单的加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,比方:EHCache,Caffeine,Redis。要想切换缓存实现,只须要导入对应的依赖即可,不须要做其他配置。本文介绍Spring Cache实现Redis缓存。
须要在项目pom文件中导入Spring Cache相关依赖和Redis相关依赖:
- <!-- Spring Cache相关依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-cache</artifactId>
- <version>2.7.3</version>
- </dependency>
- <!-- Redis相关依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
复制代码 Spring Cache常用注解:
注解阐明@EnableCaching开启缓存注解功能,通常加在启动类上@Cacheable在方法执行前先查询缓存中是否有数据,假如有数据,则直接返回缓存数据;假如没有缓存数据,调用方法并将方法返回值放到缓存中,通常加载方法上。@CachePut将方法的返回值方法缓存中通常加载方法上。@CacheEvict将一条或多条数据从缓存中删除 通常加载方法上。 下面详细介绍后面三个注解的利用方法:
1.@Cacheable与@CachePut
@Cacheable与@CachePut注解中有两个属性cacheNames、key。Redis是键值对结构的数据库,通过这两个属性设置键名,最终存入Redis中的键名为cacheNames::key
cacheNames为缓存名称,一样平常设置成与业务相关。比方缓存用户相关信息,则可取名为userCache。
key的取值一样平常利用Spring EL语法编写,key的写法有多种:
- key=“直接指定key”
这种方法生成的key是固定的,不推荐利用。
- @PostMapping
- @CachePut(cacheNames = "userCache", key = "id") // 直接指定key="id",生成的键名固定为userCache::id
- public User save(@RequestBody User user){
- userMapper.insert(user);
- return user;
- }
复制代码
- key=“#方法形参.属性”
方法形参为user,user对象中有一个属性为id,因此key可以设置为key = “#user.id”。而不同的user的id是不同的,因此这样生成的key的值是动态的。推荐利用 key=“#方法形参.属性” 这种方法。
- @PostMapping
- @CachePut(cacheNames = "userCache", key = "#user.id") // key="#方法形参.属性"。生成的键名为userCache::id属性值,是动态的键名
- public User save(@RequestBody User user){
- userMapper.insert(user);
- return user;
- }
复制代码
- 利用result关键字。key = “#result.属性”
result关键字代表的是方法的返回值。该方法的返回值为User对象,该对象中有个id属性,因此可以通过 key = “#result.属性” 的情势设置key。相识
- @PostMapping
- @CachePut(cacheNames = "userCache", key = "#result.id") // key = "#result.属性"
- public User save(@RequestBody User user){
- userMapper.insert(user);
- return user;
- }
复制代码
- 有多个方法形参的情况下设置key。
假如方法形参有多个,p0,a0代表第一个形参,p1,a1代表第二个形参,依次类推。所以key可以设置成:key = “#p0.属性”。大概利用root.args[1]代表第一个参数,root.args[2]代表第二个参数,key = “#root.args[1].id”。相识
- @PostMapping
- @CachePut(cacheNames = "userCache", key = "#p0.id") // key = "#p0.id" 方法中有两个形参,使用第一个形参的id属性设置key
- public User save(@RequestBody User user, User user2){
- userMapper.insert(user);
- return user;
- }
复制代码
- key=“#方法形参”
假如方法形参不是一个引用类型的数据,那么直接设置key=“#方法形参”
- @GettMapping
- @CachePut(cacheNames = "userCache", key = "#id") // key = "#id"
- public User getById(Long id){
- User user = userMapper.getById(id);
- return user;
- }
复制代码 2.@CacheEvict
删除缓存有两种情况,第一种为删除单条数据,第二种为删除批量数据。
- 删除单条缓存数据
利用 cacheNames 与 key 两个属性指定要删除的键值对数据。这是正确匹配。
- @DeleteMapping
- @CacheEvict(cacheNames = "userCache", key = "#id") // 删除键为 userCache::id 的键值对,此处id是动态的,指形参的值。
- public void deleteById(Long id){
- userMapper.deleteById(id);
- }
复制代码
- 删除批量缓存数据
利用 cacheNames 与 allEntries 两个属性,cacheNames用于含糊匹配键名,allEntries 用于设置是否删除全部键名由 cacheNames 开头的键值对。
- @DeleteMapping("/delAll")
- @CacheEvict(cacheNames = "userName", allEntries = true)
- public void deleteAll(){
- userMapper.deleteAll();
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |