SpringBoot详解整合Spring Cache实现Redis缓存流程

yizhihongxing

让我来详细讲解一下“SpringBoot详解整合Spring Cache实现Redis缓存流程”的完整攻略。

1. Spring Cache 简介

Spring Cache 是 Spring 官方提供的缓存框架,它通过提供 CacheManager 统一管理缓存和缓存操作,屏蔽了不同缓存框架的差异,使得我们只需要处理统一缓存接口即可,极大地降低了使用缓存的难度。

2. 整合 Spring Cache 实现 Redis 缓存的流程

2.1 配置 Redis

首先,需要在 Spring Boot 项目中引入 Redis 相关的依赖包,这里以 Redisson 为例,实现 Redis 缓存。在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.15.5</version>
</dependency>

然后在 application.properties 中添加 Redis 配置:

# Redis 配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
spring.redis.timeout=60000

2.2 创建 RedisCacheManager

接着,需要创建一个 RedisCacheManager ,用于统一管理 Redis 缓存,可以通过继承 CachingConfigurerSupport 类并重写 cacheManager() 方法来实现:

@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
    // redis 配置项
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.timeout}")
    private int timeout;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.database}")
    private int database;

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 配置序列化方式
        RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .transactionAware()
                .build();
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);
        config.setPassword(password);
        config.setDatabase(database);
        return new LettuceConnectionFactory(config);
    }
}

2.3 在 Service 中使用 RedisCache

最后,在 Service 中使用 RedisCache 注解即可:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    @Cacheable(value="user", key="#id")
    public User getUserById(Long id) {
        return userRepository.findById(id);
    }

    @Override
    @Cacheable(value="user", key="#username")
    public User getUserByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    @Override
    @CachePut(value="user", key="#user.id")
    public void saveUser(User user) {
        userRepository.save(user);
    }

    @Override
    @CacheEvict(value="user", key="#id")
    public void deleteUserById(Long id) {
        userRepository.deleteById(id);
    }
}

这里使用了 4 个 Spring Cache 注解:

  • @Cacheable:查询缓存,如果缓存中有数据,直接返回,否则执行方法并将返回值存入缓存;
  • @CachePut:更新缓存,每次都会执行方法并将返回值存入缓存;
  • @CacheEvict:删除缓存,移除指定 key 的缓存;
  • @Caching:组合注解,允许在一个方法上应用多个注解。

2.4 示例说明

以一个简单的用户系统为例,演示如何使用 Spring Cache 实现 Redis 缓存。

2.4.1 用户实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    private String email;

    private Integer age;

    private Boolean enabled;

    private Date createTime;

    private Date updateTime;
}

2.4.2 UserRepository

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findById(Long id);
    User findByUsername(String username);
}

2.4.3 UserService

public interface UserService {
    User getUserById(Long id);

    User getUserByUsername(String username);

    void saveUser(User user);

    void deleteUserById(Long id);
}

2.4.4 UserServiceImpl

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    @Cacheable(value="user", key="#id")
    public User getUserById(Long id) {
        return userRepository.findById(id);
    }

    @Override
    @Cacheable(value="user", key="#username")
    public User getUserByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    @Override
    @CachePut(value="user", key="#user.id")
    public void saveUser(User user) {
        userRepository.save(user);
    }

    @Override
    @CacheEvict(value="user", key="#id")
    public void deleteUserById(Long id) {
        userRepository.deleteById(id);
    }
}

当然,上述示例还需要进行完整的项目部署和测试,这里为了讲解完整流程,就不展开了。

如果您还有疑问,可以通过我的 GitHub 公开代码库了解更具体的代码实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot详解整合Spring Cache实现Redis缓存流程 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java中mybatis的三种分页方式

    Java中mybatis的分页方式有以下3种: 使用MySQL的Limit语句进行分页: 在Mapper接口中定义方法 public List<User> findByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageS…

    Java 2023年5月20日
    00
  • jsp编程常用技巧小结

    JSP编程常用技巧小结 1. 使用 EL 表达式简化页面逻辑 使用 EL(表达式语言) 可以让我们在 JSP 页面上通过简单的语法实现对页面数据的操作。例如,我们可以在页面上直接输出 JavaBean 对象的属性值,或者进行简单的逻辑操作。 <p>当前用户是:${sessionScope.user.username}</p> <…

    Java 2023年6月15日
    00
  • Java Arrays.sort()用法详解

    Java Arrays.sort()用法详解 Arrays.sort()是Java中的一个标准库函数,用于对数组进行排序,它可以对任何类型的数组进行排序(例如,整型、浮点数、字符串等等),本文将对该函数的用法进行详解。 语法 Arrays.sort(array, [fromIndex], [toIndex], [comparator]) array 参数是要…

    Java 2023年5月26日
    00
  • Java中Cookie和Session的那些事儿

    Java中Cookie和Session的那些事儿 在Web开发中,Cookie和Session是两个非常重要的概念。Cookie是一种机制,用于在客户端保留用户信息,而Session则是一种服务器端的机制,用于跟踪用户的状态。 Cookie 什么是Cookie Cookie是一种存储在用户计算机上的数据,用于在客户端保持状态信息。当用户访问页面时,Cooki…

    Java 2023年5月20日
    00
  • Java实现Fibonacci(斐波那契)取余的示例代码

    下面是Java实现Fibonacci取余的示例代码完整攻略。 什么是斐波那契数列 斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……。这个数列从第3项开始,每一项都等于前两项之和。 如何实现取余功能 通过取余运算,可以有效地提高程序的效率,避免计算数值过大而发生数据溢出的情况。 在Java中,可以通过取模(%)运算符来实现取余操…

    Java 2023年5月18日
    00
  • mybatis-plus中BaseMapper入门使用

    下面我详细讲解一下“mybatis-plus中BaseMapper入门使用”的完整攻略。 什么是mybatis-plus mybatis-plus是mybatis的增强工具,它可以让我们更方便、更快捷地开发mybatis项目。其中最为常用的模块就是BaseMapper,它提供了单表CRUD的基本SQL,减少了我们重复写SQL的工作量。 BaseMapper的…

    Java 2023年5月20日
    00
  • hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统

    下面是 “Hadoop入门之通过Java代码实现将本地文件上传到Hadoop的文件系统”的攻略。 步骤一:安装Hadoop 首先需要安装配置好Hadoop。具体安装过程这里不再赘述,可以参考官方文档:https://hadoop.apache.org/docs/r3.2.2/index.html 步骤二:引入Hadoop的依赖包 在java项目中使用Hado…

    Java 2023年5月20日
    00
  • springmvc @RequestBody String类型参数的使用

    好的。 在SpringMVC中使用@RequestBody注解可以将请求体中的JSON对象映射为方法参数中的Java对象。针对参数为String类型的情况,可以直接通过@RequestBody注解将请求体中的字符串映射到String类型的方法参数中。 下面是使用@RequestBody注解的示例代码: @Controller public class Use…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部