Это 11-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов
Я случайно откопал код много лет назад и обнаружил, что был очень молод в то время. Кластеру Redis действительно потребовалось много времени, чтобы получить доступ к Spring. В то время я намеренно решил ошибку в сцене. Это автоматически восстанавливает последний статус кластера после того, как кластер Redis выходит из строя. Но до сих пор я никогда не использовал кластер. Таким образом, ошибка в то время заключалась в том, была ли она неправильно настроена или существовала. Это должно быть проверено автором в будущем! ! !
В предыдущей статье подробно описывалась сырная работа Redis и построение кластера. Теперь мы начинаем интегрировать его в наш реальный проект. В моем проекте используется стандартный фреймворк ssm, фреймворк ssm здесь не упоминается, и интеграция начинается напрямую.
- Сначала представьте наш пакет jar в управлении maven
<!--1.7.2 开始支持Redis 集群-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<!-- Redis 缓存Jar -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!--下面就是spring的maven坐标了,这里就不写了,读者自己引入-->
- Мы можем настроить Redis в файле конфигурации Spring, но чтобы отделить Redis и упростить его изменение, я удалю его в другом XML-файле, просто включив этот файл конфигурации Redis в файл конфигурации Spring.
- Все следующие записи обрабатываются в файле конфигурации Redis.
Конфигурация пула соединений Redis
- Это просто для установки некоторых основных свойств пула соединений, таких как максимальное количество соединений, оценка атрибутов перед соединением и т. д.
<bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
-
maxIdle: контролирует максимальное количество экземпляров jedis со статусом ожидания в пуле;
-
При заимствовании экземпляра jedis нужно ли заранее выполнять операцию проверки; если да, то полученный экземпляр jedis доступен
-
maxWaitMillis: указывает максимальное время ожидания при заимствовании экземпляра jedis.Если время ожидания превышено, JedisConnectionException будет выброшено напрямую;
Конфигурация кластера Redis
Здесь мы вводим в проект сервис Redis, который мы открыли в предыдущей статье. ClusterNodes — это наш сервис Redis, один за другим.
<!-- Redis集群配置 -->
<bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
<property name="maxRedirects" value="3"></property>
<property name="clusterNodes">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7000"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
</set>
</property>
</bean>
Фабрика соединений Redis
Мы вводим вышеупомянутый сервисный узел Redis и пул соединений в фабрику, и есть проект по созданию доступного jedis, чтобы предоставить нам операции CURD для кэширования! !
<!-- ReDis连接工厂 -->
<bean id="redis4CacheConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-arg name="clusterConfig" ref="redisClusterConfig" />
<property name="timeout" value="${redis.timeout}" />
<property name="poolConfig" ref="redisPoolConfig" />
</bean>
Шаблоны Redis
При условии, что джедаи работают, мы должны выпустить шаблон, чтобы мы могли позвонить! .
<!-- 存储序列化 -->
<bean name="stringRedisSerializer"
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<!-- 集群Resis使用模板 -->
<bean id="clusterRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redis4CacheConnectionFactory" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
<property name="hashValueSerializer" ref="stringRedisSerializer" />
</bean>
вызов проекта
Jedis был настроен в файле конфигурации.Нам нужно использовать этот шаблон только для выполнения операций CURD на Redis. Ниже приведен простой столбец
clusterRedisTemplate.execute(new RedisCallback<Long>() {
public Long doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] keyb = key.getBytes();
byte[] valueb = toByteArray(value);
// 判断当前值是否已经存在
if (connection.exists(keyb)) {
// 删除原数据
connection.del(keyb);
}
connection.set(keyb, valueb);
return 1L;
}
});
Проверьте исходный код
В классе RedisClusterConfiguration мы передаем узел службы Redis, устанавливаем свойство и затем начинаем выполнять следующий код в этом классе.
Затем мы передаем эти узлы на заводе,
Эта фабрика предоставляет мне метод afterproperties, что означает метод, который выполняется после установки этих параметров.
Здесь мы видим метод creatPool, который создает соединение в пуле соединений.
Исправление ошибки
Будет проблема с вышеуказанным развертыванием, то есть в проекте доступное подключение службы Redis будет выбираться в пуле переподключения каждый раз при его инициализации.Когда служба Redis не работает, наш проект будет продолжать подключаться к Служба Redis Только мы Только когда проект можно будет перезапустить, проект выберет новую службу Redis из пула подключений.
- Решение Я реконструирую пул соединений каждый раз, когда работаю с Redis, чтобы каждый раз обращаться к пулу соединений, чтобы найти действительно доступную службу Redis.
- Решение состоит в том, чтобы внедрить RedisNode в проект и каждый раз выполнять метод creatPool, который мы видели в прошлый раз.
/** Redis模板注入 */
@Resource
private RedisClusterConfiguration redisClusterConfig;
private JedisConnectionFactory redis4CacheConnectionFactory;
@Resource
private RedisTemplate<String, Object> clusterRedisTemplate;
//重构连接池
private void init(){
redis4CacheConnectionFactory=new JedisConnectionFactory(redisClusterConfig);
redis4CacheConnectionFactory.afterPropertiesSet();
clusterRedisTemplate.setConnectionFactory(redis4CacheConnectionFactory);
}
Опять проблема.Пул соединений инициализируется каждый раз,что очень дорого на пуле соединений.Решения пока нет,но изначально хочу через redis sentinel обнаружить сервис Redis в кластере Redis. Когда Redis не работает, API, предоставленный sentinel, используется для уведомления проекта о необходимости перестроить пул соединений и повторно подключиться к новой службе Redis.