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

发布于:2024-12-18 ⋅ 阅读:(85) ⋅ 点赞:(0)

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();
}

网站公告

今日签到

点亮在社区的每一天
去签到