java整合redis
一,工具类
在Java中使用Redis,编写一个Redis工具类的主要好处有:
- 复用连接:在工具类中创建Jedis连接池,应用不同地方可以复用这个连接池中的连接,避免每次都创建新连接。这可以提高性能,减少连接开销。
- 统一错误处理:在工具类中可以统一对Redis连接和操作失败进行错误处理,避免出现未处理的JedisException导致应用异常。
- 简化操作:可以在工具类中封装常用的Redis操作,简化调用代码。比如设置值get/set,HASH操作hget/hset等。
- 线程安全:如果使用JedisPool,它是线程安全的,可以在多线程环境下安全使用。如果每个线程创建自己的Jedis连接,需要手动处理线程同步,较为繁琐。
- 可扩展: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
- 在pom.xml中添加Redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置Redis连接信息
在application.yml文件中添加以下配置信息:
spring:
redis:
host: localhost
port: 6379
password: yourpassword
新版本
spring:
data:
redis:
host: localhost
port: 6379
password: yourpassword
- 创建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;
}
}
- 使用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。
三、哨兵
- 添加依赖:
<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>
- 配置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:
- 配置类
@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集群的步骤:
- 在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>
- 配置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
- 创建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;
}
}
- 使用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);
}
五,报错
- 启动项目报错:Unparseable port number
查看yml配置文件中的nodes:是否正确
格式如下:
nodes: node1:port1,node2:port2,node3:port3...
- 使用redis是显示超时:io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.157.131:6379
解决方法:
方法一:关闭防火墙
在Linux中,可以使用以下命令来关闭防火墙:
- 对于CentOS 6及以下版本/RHEL 6及以下版本:
service iptables stop
此命令将停止iptables防火墙服务。
- 对于CentOS 7及以上版本/RHEL 7及以上版本:
systemctl stop firewalld
此命令将停止firewalld防火墙服务。
方法二:开放防火墙端口
- 查看linux的防火墙端口是否开启
可以使用 firewall-cmd --zone=public --list-ports 查询开放了哪些防火墙端口
firewall-cmd --zone=public --list-ports
- 开启端口号
-
开启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
方法三:编辑防火墙配置文件
- 或者编辑防火墙配置文件:
vim /etc/sysconfig/iptables-config
- 添加如下:
-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。