spring cache缓存

spring cache缓存

  • 导入坐标
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>  		            		       	 <version>2.7.3</version> 
</dependency>
  • 常用注解

在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:

注解说明
@EnableCaching开启缓存注解功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。

例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

1. @EnableCaching

@EnableCaching 注解用于开启Spring缓存注解功能,通常加在Spring Boot应用的启动类上:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching // 开启缓存注解功能
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
2. @Cacheable

@Cacheable 注解用于在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "users", key = "#userId")
    public User getUserById(Long userId) {
        // 模拟从数据库中查询数据
        return findUserByIdFromDatabase(userId);
    }

    private User findUserByIdFromDatabase(Long userId) {
        // 模拟数据库查询
        return new User(userId, "John Doe");
    }
}
3. @CachePut

@CachePut 注解用于将方法的返回值放到缓存中:

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 模拟更新数据库中的数据
        updateUserInDatabase(user);
        return user;
    }

    private void updateUserInDatabase(User user) {
        // 模拟数据库更新
        // ...
    }
}
4. @CacheEvict

@CacheEvict 注解用于将一条或多条数据从缓存中删除:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#userId")
    public void deleteUser(Long userId) {
        // 模拟从数据库中删除数据
        deleteUserFromDatabase(userId);
    }

    private void deleteUserFromDatabase(Long userId) {
        // 模拟数据库删除
        // ...
    }
}
综合示例

以下是一个综合示例,展示如何在同一个服务类中使用这些注解:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "users", key = "#userId")
    public User getUserById(Long userId) {
        // 模拟从数据库中查询数据
        return findUserByIdFromDatabase(userId);
    }

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 模拟更新数据库中的数据
        updateUserInDatabase(user);
        return user;
    }

    @CacheEvict(value = "users", key = "#userId")
    public void deleteUser(Long userId) {
        // 模拟从数据库中删除数据
        deleteUserFromDatabase(userId);
    }

    private User findUserByIdFromDatabase(Long userId) {
        // 模拟数据库查询
        return new User(userId, "John Doe");
    }

    private void updateUserInDatabase(User user) {
        // 模拟数据库更新
        // ...
    }

    private void deleteUserFromDatabase(Long userId) {
        // 模拟数据库删除
        // ...
    }
}

自定义键值对的使用示例:根据查询条件生成键值

/**
 * 分页查询菜品
 *
 * @param dishPageQueryDTO 查询条件
 * @return 菜品列表
 */
@GetMapping("/page")
@Cacheable(cacheNames = "dishCache", keyGenerator = "customKeyGenerator")
public Result getDishesByPage(DishPageQueryDTO dishPageQueryDTO) {
    log.info("菜品分页查询:{}", dishPageQueryDTO);
    PageResult dishesByPage = dishService.getDishesByPage(dishPageQueryDTO);
    return Result.success(dishesByPage);
}

image-20240713004156426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值