Redis(二十八)-简单一文了解SpringBoot与Redis的整合(哨兵模式)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 您好,我是码农飞哥,感谢您阅读本文!本文主要介绍SpringBoot如何整合Redis。

引入依赖

啥都不说,先引入依赖,SpringBoot其实已经整合好了redis,这里就直接使用Spring的redis来操作。

<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>2.1.2.RELEASE</version>
            </dependency>

Redis的配置

最简单的配置(单机模式)

直接在application.yml 添加如下配置:

spring:
  redis:
    host: 127.0.0.1
    password: 123456
    port: 6379
    database: 1

配置好之后就可以直接使用StringRedisTemplate 以及RedisTemplate<Object, Object> 两个redis客户端的操作类了。这是由于SpringBoot的自动配置,SpringBoot通过RedisProperties类来映射yml中的Redis配置,通过RedisAutoConfiguration配置类来加载Redis配置。

哨兵模式配置

1.在yml文件中配置好哨兵

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
    password: 123456
    lettuce:
      pool:
        max-idle: 30
    database: 1

2. 定义配置类

// 定义配置类
@Configuration
// 启动自动配置
@EnableAutoConfiguration
public class RedisSentinelConfig {
    private static Logger logger = LoggerFactory.getLogger(RedisSentinelConfig.class);
    @Value("#{'${spring.redis.sentinel.nodes}'.split(',')}")
    private List<String> nodes;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.sentinel.nodes}")
    private String redisNodes;
    @Value("${spring.redis.sentinel.master}")
    private String master;
  // 定义redis的连接池
    @Bean(name = "poolConfig")
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisPoolConfig poolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        return poolConfig;
    }
  //定义RedisSentinelConfiguration,用于设置哨兵
    @Bean
    public RedisSentinelConfiguration sentinelConfiguration() {
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
        //配置matser的名称
        redisSentinelConfiguration.master(master);
        //数据库是1库
        redisSentinelConfiguration.setDatabase(1);
        redisSentinelConfiguration.setPassword(password);
        //配置redis的哨兵sentinel
        Set<RedisNode> redisNodeSet = new HashSet<>();
        nodes.forEach(x -> {
            redisNodeSet.add(new RedisNode(x.split(":")[0], Integer.parseInt(x.split(":")[1])));
        });
        logger.info("redisNodeSet -->" + redisNodeSet);
        redisSentinelConfiguration.setSentinels(redisNodeSet);
        return redisSentinelConfiguration;
    }
  //定义工厂类
    @Bean
    public JedisConnectionFactory redisConnectionFactory(
            JedisPoolConfig poolConfig,
            RedisSentinelConfiguration sentinelConfig) {
        return new JedisConnectionFactory(sentinelConfig, poolConfig);
    }

这样就定义好了。

源码分析

RedisAutoConfiguration配置类的代码如下;

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
  //定义了RedisTemplate<Object, Object>的实例,只有当存在名为redisTemplate的时才启动
  @Bean
  @ConditionalOnMissingBean(name = "redisTemplate")
  public RedisTemplate<Object, Object> redisTemplate(
    RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
  RedisTemplate<Object, Object> template = new RedisTemplate<>();
  template.setConnectionFactory(redisConnectionFactory);
  return template;
  }
  //定义了StringRedisTemplate的实例
  @Bean
  @ConditionalOnMissingBean
  public StringRedisTemplate stringRedisTemplate(
    RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
  StringRedisTemplate template = new StringRedisTemplate();
  template.setConnectionFactory(redisConnectionFactory);
  return template;
  }
}

代码说明:

1.@Configuration注解标记RedisAutoConfiguration类是一个配置类,可以替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。通过该注解之后可以保证Bean是单例的。

2.@ConditionalOnClass 的作用是定义条件装配,只有当RedisOperations类存在时才启动该配置

3.@EnableConfigurationProperties 的作用是开启@ConfigurationProperties。@ConfigurationProperties的作用是将配置文件转换成类对象,便于修改或者获取值。

4.@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })的作用是引入LettuceConnectionConfiguration和JedisConnectionConfiguration两个配置类,其中LettuceConnectionConfiguration配置类中定义了LettuceConnectionFactory连接工厂类,JedisConnectionConfiguration定义了JedisConnectionFactory连接工厂类。

总结

本文详细介绍了如何在SpringBoot中整合Redis。最简单的单机模式的Redis整合只需要在yml文件中配置redis数据库的地址即可,其他哨兵模式和集群模式的Redis配置需要自己定义配置类。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
360 0
|
27天前
|
NoSQL Java Linux
SpringBoot 整合Redis
SpringBoot 整合Redis
16 0
|
2月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
56 0
|
5天前
|
缓存 NoSQL Java
springboot业务开发--springboot集成redis解决缓存雪崩穿透问题
该文介绍了缓存使用中可能出现的三个问题及解决方案:缓存穿透、缓存击穿和缓存雪崩。为防止缓存穿透,可校验请求数据并缓存空值;缓存击穿可采用限流、热点数据预加载或加锁策略;缓存雪崩则需避免同一时间大量缓存失效,可设置随机过期时间。文章还提及了Spring Boot中Redis缓存的配置,包括缓存null值、使用前缀和自定义过期时间,并提供了改造代码以实现缓存到期时间的个性化设置。
|
7天前
|
存储 NoSQL Java
Spring Boot与Redis:整合与实战
【4月更文挑战第29天】Redis,作为一个高性能的键值存储数据库,广泛应用于缓存、消息队列、会话存储等多种场景中。在Spring Boot应用中整合Redis可以显著提高数据处理的效率和应用的响应速度。
18 0
|
9天前
|
监控 NoSQL Redis
Redis的哨兵模式详解
Redis的哨兵模式详解
27 0
QGS
|
12天前
|
NoSQL 关系型数据库 MySQL
手拉手Springboot+RocketMQ+Redis抢单实现10W级QPS
手拉手Springboot+RocketMQ+Redis抢单实现10W级QPS
QGS
30 3
|
17天前
|
NoSQL 数据可视化 Java
Springboot整合redis
Springboot整合redis
|
17天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
163 10
|
27天前
|
NoSQL Java Redis
Springboot整合redis
Springboot整合redis