import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
import java.time.Duration;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Configuration
@EnableAutoConfiguration
public class RedisConfig {
@Value("${spring.redis.host:}")
private String host;
@Value("${spring.redis.port:6379}")
private int port;
@Value("${spring.redis.timeout:10000}")
private int timeout;
@Value("${spring.redis.lettuce.pool.max-idle:10}")
private int maxIdle;
@Value("${spring.redis.lettuce.pool.max-wait:1500}")
private long maxWaitMillis;
@Value("${spring.redis.lettuce.pool.max-active:180}")
private int maxActive;
@Value("${spring.redis.password:}")
private String password;
@Value("${spring.redis.database:}")
private String database;
@Value("${spring.redis.sentinel.nodes:}")
private String nodes;
@Value("${spring.redis.sentinel.master:}")
private String master;
@Bean
@ConfigurationProperties(prefix="spring.redis")
public JedisPoolConfig getRedisConfig(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(maxIdle);
config.setMaxWaitMillis(maxWaitMillis);
config.setMaxTotal(maxActive);
return config;
}
// @Bean
// public RedisSentinelConfiguration sentinelConfiguration(){
// RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
// //配置matser的名称
// redisSentinelConfiguration.master(master);
// //配置redis的哨兵sentinel
// Set redisNodeSet = new HashSet<>();
// if (StringUtils.isNotBlank(master) && StringUtils.isNotBlank(nodes)) {
// String[] nodeSplit = nodes.split(",");
// List nodeList = Arrays.asList(nodeSplit);
// nodeList.forEach(x->{
// redisNodeSet.add(new RedisNode(x.split(":")[0],Integer.parseInt(x.split(":")[1])));
// });
// }
// redisSentinelConfiguration.setSentinels(redisNodeSet);
redisSentinelConfiguration.setSentinelPassword(password);
// return redisSentinelConfiguration;
// }
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
JedisConnectionFactory jedisConnectionFactory = null;
//判断redis是单机模式还是哨兵模式
if (StringUtils.isBlank(master) || StringUtils.isBlank(nodes)) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPassword(password);
redisStandaloneConfiguration.setDatabase(Integer.parseInt(database));
redisStandaloneConfiguration.setPort(port);
JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
jedisClientConfiguration.connectTimeout(Duration.ofMillis(timeout));
JedisClientConfiguration jedisClientConfigurationNew = jedisClientConfiguration.usePooling().poolConfig(jedisPoolConfig).build();
jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,jedisClientConfigurationNew);
} else {
RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
//配置matser的名称
redisSentinelConfiguration.master(master);
//配置redis的哨兵sentinel
Set redisNodeSet = new HashSet<>();
if (StringUtils.isNotBlank(nodes)) {
String[] nodeSplit = nodes.split(",");
List nodeList = Arrays.asList(nodeSplit);
nodeList.forEach(x->{
redisNodeSet.add(new RedisNode(x.split(":")[0],Integer.parseInt(x.split(":")[1])));
});
}
redisSentinelConfiguration.setSentinels(redisNodeSet);
redisSentinelConfiguration.setPassword(password);
jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration,jedisPoolConfig);
}
return jedisConnectionFactory;
}
@Bean
public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(jedisConnectionFactory);
return redisTemplate;
}
}
四、Redis调用方法Service
新增一个IRedisService接口
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface IRedisService {
String get(String key);
boolean set(String key, Object value);
Object hget(String hkey, String key);
boolean expire(String key, int second);
void del(String... key);
public long getExpire(String key);
public boolean hasKey(String key);
public boolean set(String key, Object value, long time);
public long incr(String key, long delta);
public long decr(String key, long delta);
public Map