锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring Boot整合Redis的哨兵模式

Spring Boot整合Redis的哨兵模式

0
  • JAVA
  • 发布于 2024-08-13
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

目录

Spring Boot 整合 Redis 的哨兵模式

准备工作

添加依赖

Redis 配置

创建 Redis 配置类

使用 Redis 缓存

运行应用程序

总结

Spring Boot 整合 Redis 的哨兵模式

在开发中,Redis 是一个非常流行和强大的缓存数据库。为了保证高可用性和容错性,Redis 提供了哨兵模式(Sentinel)来处理主从切换和故障转移。 本篇技术博客将介绍如何在 Spring Boot 应用中使用 Redis 的哨兵模式进行高可用缓存服务的搭建。

准备工作

在开始之前,确保你已经安装和启动了 Redis 服务器,并按照 Redis 的哨兵模式配置了主节点和从节点。

添加依赖

在 pom.xml 文件中添加 Spring Data Redis 和 Jedis 的依赖:

xmlCopy code
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

Redis 配置

在 application.yaml 文件中进行 Redis 的配置,包括主服务器和哨兵节点的信息:

yamlCopy code
spring:
  redis:
    sentinel:
      master: mymaster  # 主节点名称
      nodes: host1:port1,host2:port2,host3:port3  # 哨兵节点列表

创建 Redis 配置类

创建一个 Redis 的配置类,用于配置 Redis 连接工厂和缓存管理器:

javaCopy code
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Value("${spring.redis.sentinel.master}")
    private String master;
    @Value("${spring.redis.sentinel.nodes}")
    private String sentinelNodes;
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration()
                .master(master);
        Set<String> nodes = new HashSet<>(Arrays.asList(sentinelNodes.split(",")));
        nodes.forEach(node -> {
            String[] parts = node.split(":");
            sentinelConfiguration.sentinel(parts[0], Integer.parseInt(parts[1]));
        });
        return new JedisConnectionFactory(sentinelConfiguration);
    }
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)); // 设置缓存过期时间为10分钟
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .transactionAware()
                .build();
    }
}

在这个配置类中,我们首先通过读取配置文件中的主节点名称和哨兵节点列表来创建 RedisSentinelConfiguration 对象。然后,我们遍历哨兵节点列表并将它们添加到配置中。 接下来,我们使用 JedisConnectionFactory 来创建 RedisConnectionFactory,并将之前创建的 RedisSentinelConfiguration 传递给它。 最后,我们创建了 RedisCacheConfiguration 并设置了一个常见的缓存过期时间,然后使用它来构建 RedisCacheManager。

使用 Redis 缓存

在 Spring Boot 的服务类或控制器中,我们可以使用 @Cacheable、@CachePut 和 @CacheEvict 等注解来实现缓存功能。这些注解可以应用于方法上,以指定需要缓存的方法或操作。

javaCopy code
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    @CachePut(value = "users", key = "#user.id")
    public User saveUser(User user) {
        return userRepository.save(user);
    }
    @CacheEvict(value = "users", key = "#id")
    public void deleteUserById(Long id) {
        userRepository.deleteById(id);
    }
}

运行应用程序

现在,我们已经完成了 Spring Boot 的 Redis 哨兵模式配置和使用 Redis 缓存的代码编写。 运行应用程序,并在需要使用缓存的地方使用上述的 @Cacheable、@CachePut 和 @CacheEvict 注解,Spring Boot 将自动处理缓存,并通过 Redis 的哨兵模式提供高可用性和容错性。

当结合实际应用场景进行 Redis 的哨兵模式配置时,通常是为了实现高可用的缓存服务。下面给出一个示例代码,假设我们有一个商品管理系统,我们使用 Redis 缓存来存储商品信息,并保证缓存的高可用性。 首先,我们需要在 Spring Boot 应用中配置 Redis 的哨兵模式并使用 Redis 缓存。可以参考上面提到的配置和代码。 然后,我们可以在商品服务类中使用 Redis 缓存来存储和获取商品信息。

javaCopy code
@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;
    @Cacheable(value = "products", key = "#id")
    public Product getProductById(Long id) {
        // 先从缓存中获取商品信息
        // 如果缓存中不存在,从数据库中获取,并将结果存入缓存
        return productRepository.findById(id).orElse(null);
    }
    @CachePut(value = "products", key = "#product.id")
    public Product saveProduct(Product product) {
        // 保存商品信息到数据库,并将结果存入缓存
        return productRepository.save(product);
    }
    @CacheEvict(value = "products", key = "#id")
    public void deleteProductById(Long id) {
        // 从数据库中删除商品信息,并从缓存中移除对应的数据
        productRepository.deleteById(id);
    }
}

在上述代码中,我们使用 @Cacheable 注解将 getProductById 方法标记为可缓存的。当调用该方法时,Spring Boot 会首先尝试从缓存中获取商品信息。如果缓存中存在对应的数据,则直接返回缓存中的数据;如果缓存中不存在,则会从数据库中获取商品信息,并将结果存入缓存。 使用 @CachePut 注解将 saveProduct 方法标记为缓存更新的操作。该方法用于保存或更新商品信息到数据库,并将最新的商品信息存入缓存。通过指定相同的缓存名称和缓存键,可以覆盖之前的缓存数据。 使用 @CacheEvict 注解将 deleteProductById 方法标记为缓存失效的操作。该方法用于删除数据库中的商品信息,并从缓存中移除相应的数据。 通过以上示例代码,我们可以实现基于 Redis 的哨兵模式的高可用缓存服务。在生产环境中,可以部署多个 Redis 节点,并使用哨兵模式来实现主从切换和故障转移,以确保缓存服务的可用性和容错性。 请注意,上述示例代码中的 ProductRepository 是一个假设的商品数据访问接口,具体的实现根据实际情况进行编写。另外,还需要在 application.yaml 中配置正确的 Redis 主节点和哨兵节点的信息。

Spring Boot 中如何使用 Redis 的哨兵模式: 首先,确保已经引入 Spring Data Redis 和 Lettuce 依赖。

xmlCopy code
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
</dependency>

接下来,在 application.properties(或 application.yml)中进行配置,包括 Redis 的哨兵节点和密码等信息:

propertiesCopy code
# Redis配置
spring.redis.sentinel.master=my-master
spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
spring.redis.password=your-password

然后,使用 @Configuration 注解创建一个配置类,配置 RedisTemplate 和 LettuceConnectionFactory:

javaCopy code
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
@Configuration
public class RedisConfig {
    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration() {
        RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();
        configuration.master("my-master");
        configuration.sentinel("127.0.0.1", 26379);
        configuration.sentinel("127.0.0.1", 26380);
        configuration.sentinel("127.0.0.1", 26381);
        configuration.setPassword(RedisPassword.of("your-password"));
        return configuration;
    }
    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory(RedisSentinelConfiguration redisSentinelConfiguration) {
        return new LettuceConnectionFactory(redisSentinelConfiguration);
    }
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

最后,可以在业务逻辑中使用自动注入的 RedisTemplate 来操作 Redis 数据:

javaCopy code
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }
    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

在上述示例代码中,我们首先创建了一个 RedisConfig 配置类,通过 @Bean 注解配置了 RedisSentinelConfiguration 和 LettuceConnectionFactory。然后,我们创建了一个 RedisTemplate 并将 LettuceConnectionFactory 注入其中。最后,我们在 RedisService 服务类中使用自动注入的 RedisTemplate 来操作 Redis 数据。 请注意,上述示例代码中的配置信息和 Redis 连接参数是示例,实际应用中需要根据实际情况进行配置和更改。

总结

通过本篇技术博客,我们学习了如何在 Spring Boot 应用中使用 Redis 的哨兵模式进行高可用性缓存服务的搭建。 要注意的是,为了实现真正的高可用性,需要在实际生产环境中正确配置 Redis 的主节点和哨兵节点。

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.