Redis(12)springboot整合redis

一,工具类

在Java中使用Redis,编写一个Redis工具类的主要好处有:

  1. 复用连接:在工具类中创建Jedis连接池,应用不同地方可以复用这个连接池中的连接,避免每次都创建新连接。这可以提高性能,减少连接开销。
  2. 统一错误处理:在工具类中可以统一对Redis连接和操作失败进行错误处理,避免出现未处理的JedisException导致应用异常。
  3. 简化操作:可以在工具类中封装常用的Redis操作,简化调用代码。比如设置值get/set,HASH操作hget/hset等。
  4. 线程安全:如果使用JedisPool,它是线程安全的,可以在多线程环境下安全使用。如果每个线程创建自己的Jedis连接,需要手动处理线程同步,较为繁琐。
  5. 可扩展:Redis工具类可以根据需要不断扩展,增加更多Redis功能和操作。
    一个简单的Redis工具类示例:
public class RedisUtil {
    private static JedisPool jedisPool;

    static {
        //创建Jedis连接池
        jedisPool = new JedisPool("localhost", 6379);
    }

    public static String get(String key) {
        Jedis jedis = jedisPool.getResource();   //从池中获取连接
        String value = jedis.get(key);        //获取键值
        jedis.close();                        //使用完毕,关闭连接
        return value;
    }

    public static void set(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        jedis.set(key, value);
        jedis.close();
    }
}

然后在代码中可以这样简单使用:

String value = RedisUtil.get("key");
RedisUtil.set("key", "value");

所以,总结来说,编写Redis工具类的主要目的是为了提高性能,简化操作,统一错误处理,保证线程安全并支持功能扩展。这是在Java中使用Redis的最佳实践。

redis工具类(springboot)

二、单节点redis

  1. 在pom.xml中添加Redis的依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis连接信息

在application.yml文件中添加以下配置信息:

spring:
  redis:
    host: localhost
    port: 6379
    password: yourpassword

新版本

spring:
	data:
	  redis:
	    host: localhost
	    port: 6379
	    password: yourpassword
  1. 创建RedisTemplate Bean

在Spring Boot应用程序中使用RedisTemplate类与Redis进行交互,我们需要创建一个RedisTemplate Bean,并将其注入到其他类中。

@Configuration
public class RedisConfig {

   /**
     * springboot2.x 使用LettuceConnectionFactory 代替 RedisConnectionFactory
     * application.yml配置基本信息后,springboot2.x  RedisAutoConfiguration能够自动装配
     * LettuceConnectionFactory 和 RedisConnectionFactory 及其 RedisTemplate
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}
  1. 使用RedisTemplate操作Redis
@Autowired
RedisTemplate<String, Object> redisTemplate;

public void setValue(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
    return (String) redisTemplate.opsForValue().get(key);
}

使用Spring Boot整合单节点Redis,可以轻松地实现对Redis的操作。以上步骤可以帮助您开始使用Redis。

三、哨兵

  1. 添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
  1. 配置Redis哨兵信息:
spring:
  redis:
    client-type: LETTUCE
    sentinel:
      master: mymaster
      nodes: 192.168.109.134:26380,192.168.109.134:26381,192.168.109.134:26382
      password:
  1. 配置类
@Configuration
public class RedisConfig {

    @Autowired
    private Environment environmet;

    @Bean("lettuceConnectionFactory")
    public RedisConnectionFactory lettuceConnectionFactory() {
        String master = environmet.getProperty("spring.redis.sentinel.master");
        Set<String> nodes = StringUtils.commaDelimitedListToSet(environmet.getProperty("spring.redis.sentinel.nodes"));
        String password = environmet.getProperty("spring.redis.sentinel.password");

        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(master, nodes);
        sentinelConfig.setPassword(RedisPassword.of(password));
        return new LettuceConnectionFactory(sentinelConfig);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(@Qualifier("lettuceConnectionFactory") RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }
}

四、集群

由于Redis集群是由多个Redis节点组成的,因此在配置Redis集群时,需要指定多个Redis节点的信息。下面是在Spring Boot中配置Redis集群的步骤:

  1. 在pom.xml中添加Redis的依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
  1. 配置Redis连接信息

在application.yml文件中添加以下配置信息:

格式:

spring:
  redis:
    cluster:
      nodes: node1:port1,node2:port2,node3:port3...
spring:
	redis:
		cluster:
		#集群中所有节点
			nodes: 192.168.109.149:6379,192.168.109.149:6380,192.168.109.149:6381,192.168.109.149:6382,192.168.109.149:6383,192.168.109.149:6384 

  1. 创建RedisTemplate Bean

在Spring Boot应用程序中使用RedisTemplate类与Redis进行交互,我们需要创建一个RedisTemplate Bean,并将其注入到其他类中。

@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate= new RedisTemplate<>();
        // 可根据需要添加序列化器
        // template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return template;
    }

}
  1. 使用RedisTemplate操作Redis
@Autowired
RedisTemplate<String, Object> redisTemplate;

public void setValue(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
    return (String) redisTemplate.opsForValue().get(key);
}

五,报错

  1. 启动项目报错:Unparseable port number

查看yml配置文件中的nodes:是否正确

格式如下:

nodes: node1:port1,node2:port2,node3:port3...
  1. 使用redis是显示超时:io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.157.131:6379

解决方法:

方法一:关闭防火墙

在Linux中,可以使用以下命令来关闭防火墙:

  1. 对于CentOS 6及以下版本/RHEL 6及以下版本:
service iptables stop

此命令将停止iptables防火墙服务。

  1. 对于CentOS 7及以上版本/RHEL 7及以上版本:
systemctl stop firewalld

此命令将停止firewalld防火墙服务。

方法二:开放防火墙端口

  1. 查看linux的防火墙端口是否开启

可以使用 firewall-cmd --zone=public --list-ports 查询开放了哪些防火墙端口

firewall-cmd --zone=public --list-ports
  1. 开启端口号
  • 开启6379,6380,6381,6382,6383,6384端口号

    firewall-cmd --zone=public --add-port=6379/tcp --permanent
    firewall-cmd --zone=public --add-port=6380/tcp --permanent
    firewall-cmd --zone=public --add-port=6381/tcp --permanent
    firewall-cmd --zone=public --add-port=6382/tcp --permanent
    firewall-cmd --zone=public --add-port=6383/tcp --permanent
    firewall-cmd --zone=public --add-port=6384/tcp --permanent
    
  • 刷新(重新加载端口号)

    firewall-cmd --reload
    
  • 查看6379,6380,6381,6382,6383,6384端口号是否已经开启

    firewall-cmd --zone=public --list-ports
    

方法三:编辑防火墙配置文件

  1. 或者编辑防火墙配置文件:
vim  /etc/sysconfig/iptables-config
  1. 添加如下:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6380 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6381 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6382 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6383 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6384 -j ACCEPT

以上是在Spring Boot中配置Redis集群的步骤。需要注意的是,当使用Redis集群时,需要使用集群模式下的RedisTemplate。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bilal-abdurehim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值