Because this article does not introduce the construction of Redis
cluster, here we assume that we already have a Redis cluster environment, and we need to adjust the following parts in our project
Modify the configuration parameters, cluster node and password configuration;
Ensure that the introduced Jedis
version supports setting passwords,spring-data-redis
1.8 or above, SpringBoot
1.5 or above only supports setting password;
InjectionRedisTemplate
;
Write tool classes;
############### Redis 集群配置 ######################### spring.custome.redis.cluster.nodes=172.20.0.1:7001,172.20.0.2:7002,172.20.0.3:7003 spring.custome.redis.cluster.max-redirects=3 spring.custome.redis.cluster.max-active=500 spring.custome.redis.cluster.max-wait=-1 spring.custome.redis.cluster.max-idle=500 spring.custome.redis.cluster.min-idle=20 spring.custome.redis.cluster.timeout=3000 spring.custome.redis.cluster.password=redis.cluster.password
Ensure SpringBoot If the version is greater than 1.4.x, use the following configuration. First exclude the old and middle versions of SpringBoot
, Jedis
and spring-data-redis
, and then rely on the higher version. of Jedis
and spring-data-redis
.
org.springframework.boot spring-boot-starter-data-redis redis.clients jedis org.springframework.data spring-data-redis redis.clients jedis 2.9.0 org.springframework.data spring-data-redis 1.8.0.RELEASE
RedisTemplate
InjectionRedisTemplate
We need three components, namely JedisConnectionFactory
and RedisClusterConfiguration
, JedisPoolConfig
, the following is the code to inject RedisTempalte
. First create JedisConnectFactory
according to the configuration and also need to configure RedisClusterConfiguration
, JedisPoolConfig
, and finally return JedisConnectionFactory
to create RedisTemplate
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisNode; 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.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; import java.util.ArrayList; import java.util.List; public class RedisClusterConfig { @Bean(name = "redisTemplate") @Primary public RedisTemplate redisClusterTemplate(@Value("${spring.custome.redis.cluster.nodes}") String host, @Value("${spring.custome.redis.cluster.password}") String password, @Value("${spring.custome.redis.cluster.timeout}") long timeout, @Value("${spring.custome.redis.cluster.max-redirects}") int maxRedirect, @Value("${spring.custome.redis.cluster.max-active}") int maxActive, @Value("${spring.custome.redis.cluster.max-wait}") int maxWait, @Value("${spring.custome.redis.cluster.max-idle}") int maxIdle, @Value("${spring.custome.redis.cluster.min-idle}") int minIdle) { JedisConnectionFactory connectionFactory = jedisClusterConnectionFactory(host, password, timeout, maxRedirect, maxActive, maxWait, maxIdle, minIdle); return createRedisClusterTemplate(connectionFactory); } private JedisConnectionFactory jedisClusterConnectionFactory(String host, String password, long timeout, int maxRedirect, int maxActive, int maxWait, int maxIdle, int minIdle) { RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); List nodeList = new ArrayList(); String[] cNodes = host.split(","); //分割出集群节点 for (String node : cNodes) { String[] hp = node.split(":"); nodeList.add(new RedisNode(hp[0], Integer.parseInt(hp[1]))); } redisClusterConfiguration.setClusterNodes(nodeList); redisClusterConfiguration.setPassword(password); redisClusterConfiguration.setMaxRedirects(maxRedirect); // 连接池通用配置 GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); genericObjectPoolConfig.setMaxIdle(maxIdle); genericObjectPoolConfig.setMaxTotal(maxActive); genericObjectPoolConfig.setMinIdle(minIdle); genericObjectPoolConfig.setMaxWaitMillis(maxWait); genericObjectPoolConfig.setTestWhileIdle(true); genericObjectPoolConfig.setTimeBetweenEvictionRunsMillis(300000); JedisClientConfiguration.DefaultJedisClientConfigurationBuilder builder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration .builder(); builder.connectTimeout(Duration.ofSeconds(timeout)); builder.usePooling(); builder.poolConfig(genericObjectPoolConfig); JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisClusterConfiguration, builder.build()); // 连接池初始化 connectionFactory.afterPropertiesSet(); return connectionFactory; } private RedisTemplate createRedisClusterTemplate(JedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
In fact, it is basically completed here. We can see that the SpringBoot
project is connected to the Redis
cluster. It is relatively simple. , and if the stand-alone environment used RedisTemplate
before, there is no need to write tool classes now, and the previous operations are still valid.
/** * 删除KEY * @param key * @return */ public boolean delete(String key) { try { return getTemplate().delete(key); } catch (Exception e) { log.error("redis hasKey() is error"); return false; } } /** * 普通缓存获取 * * @param key 键 * @return 值 */ public Object get(String key) { return key == null ? null : getTemplate().opsForValue().get(key); } /** * 普通缓存放入 * * @param key 键 * @param value 值 * @return true成功 false失败 */ public boolean set(String key, Object value) { try { getTemplate().opsForValue().set(key, value); return true; } catch (Exception e) { log.error("redis set() is error"); return false; } } /** * 普通缓存放入并设置时间 * * @param key 键 * @param value 值 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key, Object value, long time) { try { if (time > 0) { getTemplate().opsForValue().set(key, value, time, TimeUnit.SECONDS); } else { set(key, value); } return true; } catch (Exception e) { log.error("redis set() is error"); return false; } } /** * 计数器 * * @param key 键 * @return 值 */ public Long incr(String key) { return getTemplate().opsForValue().increment(key); } public Long incrBy(String key, long step) { return getTemplate().opsForValue().increment(key, step); } /** * HashGet * * @param key 键 不能为null * @param item 项 不能为null * @return 值 */ public Object hget(String key, String item) { return getTemplate().opsForHash().get(key, item); } /** * 获取hashKey对应的所有键值 * * @param key 键 * @return 对应的多个键值 */ public Map hmget(String key) { return getTemplate().opsForHash().entries(key); } /** * 获取hashKey对应的批量键值 * @param key * @param values * @return */ public List<Object> hmget(String key, List values) { return getTemplate().opsForHash().multiGet(key, values); }
The above is the detailed content of How to connect SpringBoot project to Redis cluster. For more information, please follow other related articles on the PHP Chinese website!