【JavaWeb后端学习笔记】Spring Cache实现Redis缓存

打印 上一主题 下一主题

主题 439|帖子 439|积分 1317

Spring Cache是一个框架,实现了基于注解的缓存功能,只须要简单的加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,比方:EHCache,Caffeine,Redis。要想切换缓存实现,只须要导入对应的依赖即可,不须要做其他配置。本文介绍Spring Cache实现Redis缓存。
须要在项目pom文件中导入Spring Cache相关依赖和Redis相关依赖:
  1. <!--  Spring Cache相关依赖  -->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter-cache</artifactId>
  5.     <version>2.7.3</version>
  6. </dependency>
  7. <!--  Redis相关依赖  -->
  8. <dependency>
  9.     <groupId>org.springframework.boot</groupId>
  10.     <artifactId>spring-boot-starter-data-redis</artifactId>
  11. </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是固定的,不推荐利用。
  1. @PostMapping
  2. @CachePut(cacheNames = "userCache", key = "id") // 直接指定key="id",生成的键名固定为userCache::id
  3. public User save(@RequestBody User user){
  4.     userMapper.insert(user);
  5.     return user;
  6. }
复制代码


  • key=“#方法形参.属性”
    方法形参为user,user对象中有一个属性为id,因此key可以设置为key = “#user.id”。而不同的user的id是不同的,因此这样生成的key的值是动态的。推荐利用 key=“#方法形参.属性” 这种方法。
  1. @PostMapping
  2. @CachePut(cacheNames = "userCache", key = "#user.id") // key="#方法形参.属性"。生成的键名为userCache::id属性值,是动态的键名
  3. public User save(@RequestBody User user){
  4.     userMapper.insert(user);
  5.     return user;
  6. }
复制代码


  • 利用result关键字。key = “#result.属性”
    result关键字代表的是方法的返回值。该方法的返回值为User对象,该对象中有个id属性,因此可以通过 key = “#result.属性” 的情势设置key。相识
  1. @PostMapping
  2. @CachePut(cacheNames = "userCache", key = "#result.id") // key = "#result.属性"
  3. public User save(@RequestBody User user){
  4.     userMapper.insert(user);
  5.     return user;
  6. }
复制代码


  • 有多个方法形参的情况下设置key。
    假如方法形参有多个,p0,a0代表第一个形参,p1,a1代表第二个形参,依次类推。所以key可以设置成:key = “#p0.属性”。大概利用root.args[1]代表第一个参数,root.args[2]代表第二个参数,key = “#root.args[1].id”。相识
  1. @PostMapping
  2. @CachePut(cacheNames = "userCache", key = "#p0.id") // key = "#p0.id" 方法中有两个形参,使用第一个形参的id属性设置key
  3. public User save(@RequestBody User user, User user2){
  4.     userMapper.insert(user);
  5.     return user;
  6. }
复制代码


  • key=“#方法形参”
    假如方法形参不是一个引用类型的数据,那么直接设置key=“#方法形参”
  1. @GettMapping
  2. @CachePut(cacheNames = "userCache", key = "#id") // key = "#id"
  3. public User getById(Long id){
  4.     User user = userMapper.getById(id);
  5.     return user;
  6. }
复制代码
2.@CacheEvict
删除缓存有两种情况,第一种为删除单条数据,第二种为删除批量数据。


  • 删除单条缓存数据
    利用 cacheNames 与 key 两个属性指定要删除的键值对数据。这是正确匹配。
  1. @DeleteMapping
  2. @CacheEvict(cacheNames = "userCache", key = "#id") // 删除键为 userCache::id 的键值对,此处id是动态的,指形参的值。
  3. public void deleteById(Long id){
  4.     userMapper.deleteById(id);
  5. }
复制代码


  • 删除批量缓存数据
    利用 cacheNames 与 allEntries 两个属性,cacheNames用于含糊匹配键名,allEntries 用于设置是否删除全部键名由 cacheNames 开头的键值对。
  1. @DeleteMapping("/delAll")
  2. @CacheEvict(cacheNames = "userName", allEntries = true)
  3. public void deleteAll(){
  4.     userMapper.deleteAll();
  5. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表