Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyelesaikan pengecualian tamat masa apabila Springboot2.x menyepadukan salad dan bersambung ke gugusan redis

Bagaimana untuk menyelesaikan pengecualian tamat masa apabila Springboot2.x menyepadukan salad dan bersambung ke gugusan redis

PHPz
PHPzke hadapan
2023-05-27 19:43:051884semak imbas

Latar Belakang: Baru-baru ini, saya sedang melakukan ujian tekanan pada sistem Springboot yang dibangunkan oleh Yixin, saya mendapati bahawa apabila saya mula-mula memulakan ujian tekanan, saya boleh mengakses data daripada kelompok redis secara normal , dan kemudian saya terus menggunakan jmeter untuk melakukan ujian tekanan, saya mendapati Redis tiba-tiba mula melontarkan gesaan yang tidak normal seperti gila: Perintah tamat masa selepas 6 saat...

  1 Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 6 second(s)  2     at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51)  3     at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:114)  4     at io.lettuce.core.cluster.ClusterFutureSyncInvocationHandler.handleInvocation(ClusterFutureSyncInvocationHandler.java:123)  5     at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)  6     at com.sun.proxy.$Proxy134.mget(Unknown Source)  7     at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.mGet(LettuceStringCommands.java:119)  8     ... 15 common frames omitted

Saya tergesa-gesa menyemak redis dan mendapati bahawa semua nod dalam kluster adalah normal, dan penggunaan CPU dan memori adalah normal. Ia adalah kurang daripada 20%. Baidu, saya mendapati bahawa ramai orang telah mengalami situasi yang sama. Sesetengah orang berkata bahawa tetapan tamat masa harus diubah. Saya mengikuti penyelesaian ini dan menetapkan nilai tamat masa kepada nilai yang lebih besar, tetapi masalah tamat masa masih tidak diselesaikan.

Antaranya, pakej kebergantungan untuk springboot untuk mengendalikan redis ialah——

  1 <dependency>  2     <groupId>org.springframework.boot</groupId>  3     <artifactId>spring-boot-starter-data-redis</artifactId>  4 </dependency>

Konfigurasi kluster——

  1 redis:  2   timeout: 6000ms  3   cluster:  4     nodes:  5       - xxx.xxx.x.xxx:6379  6       - xxx.xxx.x.xxx:6379  7       - xxx.xxx.x.xxx:6379  8   jedis:  9     pool: 10       max-active: 1000 11       max-idle: 10 12       min-idle: 5 13       max-wait: -1

Klik pada spring-boot-starter-data-redis dan cari di dalam Mengandungi kebergantungan pada salad:

Bagaimana untuk menyelesaikan pengecualian tamat masa apabila Springboot2.x menyepadukan salad dan bersambung ke gugusan redis

Springboot1.x menggunakan jedis secara lalai, dan Springboot2.x menggunakan salad secara lalai. Kami hanya boleh mengesahkan bahawa dalam kelas konfigurasi pemuatan pemacu redis, keluarkan maklumat RedisConnectionFactory:

  1 @Configuration  2 @AutoConfigureAfter(RedisAutoConfiguration.class)  3 public class Configuration {  4     @Bean  5     public StringRedisTemplate redisTemplate(RedisConnectionFactory factory) {  6         log.info("测试打印驱动类型:"+factory);  7 }

Output cetakan -

测试打印驱动类型:org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory@74ee761e

Ia boleh dilihat bahawa sambungan pemandu salad digunakan di sini , oleh itu, apabila ia digantikan dengan sambungan pemacu jedis yang kerap digunakan sebelum ini, masalah Perintah tamat masa selepas 6 saat tidak lagi berlaku.

  1 <dependency>  2     <groupId>org.springframework.boot</groupId>  3     <artifactId>spring-boot-starter-data-redis</artifactId>  4     <exclusions>  5         <exclusion>  6             <groupId>io.lettuce</groupId>  7             <artifactId>lettuce-core</artifactId>  8         </exclusion>  9     </exclusions> 10 </dependency> 11 <dependency> 12     <groupId>redis.clients</groupId> 13     <artifactId>jedis</artifactId> 14 </dependency>

Maka persoalannya ialah, bagaimanakah Springboot2.x menggunakan salad secara lalai? Kita boleh memasukkan bahagian redis Springboot2 🎜>

  1 @Configuration(  2     proxyBeanMethods = false  3 )  4 @ConditionalOnClass({RedisOperations.class})  5 @EnableConfigurationProperties({RedisProperties.class})  6 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})  7 public class RedisAutoConfiguration {  8     public RedisAutoConfiguration() {  9    } 10    ......省略 11 }

Ini bermakna apabila menggunakan kebergantungan spring-boot-starter-data-redis, kedua-dua pemacu salad dan jedis boleh diimport secara automatik, kedua-dua pemandu tidak akan wujud pada masa yang sama, yang tidak masuk akal, oleh itu, perintah di sini adalah sangat penting.

Masukkan LettuceConnectionConfiguration.class dan JedisConnectionConfiguration.class masing-masing, masing-masing menunjukkan kod teras yang perlu melibatkan artikel ini:

  1   2 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})  3

Ia boleh dilihat bahawa LettuceConnectionConfiguration.class dan JedisConnectionConfiguration.class mempunyai yang sama Anotasi @ConditionalOnMissingBean({RedisConnectionFactory.class}), yang bermaksud bahawa jika kacang RedisConnectionFactory telah didaftarkan dalam bekas, kacang lain yang serupa dengannya tidak lagi akan dimuatkan dan didaftarkan, untuk LettuceConnectionConfiguration dan JedisConnectionConfiguration masing-masing Dengan @ConditionalOnMissingBean({RedisConnectionFactory.class}) anotasi, hanya satu daripada dua boleh dimuatkan dan didaftarkan ke dalam bekas, dan satu lagi tidak akan dimuatkan dan didaftarkan.

Maka timbul persoalan, siapa yang akan didaftarkan dahulu?

Ini berbalik kepada ayat yang disebutkan di atas, susunan dalam @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) adalah sangat penting di hadapan, yang bermaksud LettuceConnectionConfiguration akan didaftarkan.

Ia boleh dilihat bahawa Springboot menggunakan salad untuk menyambung ke redis secara lalai.

Apabila kami memperkenalkan pakej ketergantungan spring-boot-starter-data-redis, ia sebenarnya bersamaan dengan memperkenalkan pakej salad Pada masa ini, pemandu salad akan digunakan pemacu salad lalai, pasang terus salad Hanya kecualikan kebergantungan.

  1 //LettuceConnectionConfiguration  2 @ConditionalOnClass({RedisClient.class})  3 class LettuceConnectionConfiguration extends RedisConnectionConfiguration {  4    ......省略  5     @Bean  6     @ConditionalOnMissingBean({RedisConnectionFactory.class})  7     LettuceConnectionFactory redisConnectionFactory(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers, ClientResources clientResources) throws UnknownHostException {  8         LettuceClientConfiguration clientConfig = this.getLettuceClientConfiguration(builderCustomizers, clientResources, this.getProperties().getLettuce().getPool());  9         return this.createLettuceConnectionFactory(clientConfig); 10    } 11 } 12 //JedisConnectionConfiguration 13 @ConditionalOnClass({GenericObjectPool.class, JedisConnection.class, Jedis.class}) 14 class JedisConnectionConfiguration extends RedisConnectionConfiguration { 15    ......省略 16     @Bean 17     @ConditionalOnMissingBean({RedisConnectionFactory.class}) 18     JedisConnectionFactory redisConnectionFactory(ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) throws UnknownHostException { 19         return this.createJedisConnectionFactory(builderCustomizers); 20    } 21 } 22

Kemudian perkenalkan kebergantungan jedis——

  1 <dependency>  2     <groupId>org.springframework.boot</groupId>  3     <artifactId>spring-boot-starter-data-redis</artifactId>  4     <exclusions>  5         <exclusion>  6             <groupId>io.lettuce</groupId>  7             <artifactId>lettuce-core</artifactId>  8         </exclusion>  9     </exclusions> 10 </dependency>

Dengan cara ini, apabila melakukan anotasi import RedisAutoConfiguration, kerana kebergantungan salad tidak ditemui, anotasi ini @Import({ LettuceConnectionConfiguration.class , JedisConnectionConfiguration di kedudukan kedua JedisConnectionConfiguration.class}) kini sah dan boleh didaftarkan ke bekas sebagai pemacu springboot untuk mengendalikan redis.

Apakah perbezaan antara salad dan jedis?

lettuce: Lapisan bawah dilaksanakan dalam netty, thread-safe dan hanya mempunyai satu tika secara lalai.

jedis: Boleh disambungkan terus ke pelayan redis dan digunakan dengan kumpulan sambungan untuk meningkatkan sambungan fizikal.

Cari kaedah yang ralat berlaku mengikut gesaan pengecualian LettuceConverters.toBoolean(this.getConnection().zadd(key, score, value)) dalam kod berikut——

  1 <dependency>  2     <groupId>redis.clients</groupId>  3     <artifactId>jedis</artifactId>  4 </dependency>

LettuceConverters.toBoolean() menukar panjang kepada Boolean Dalam keadaan biasa, this.getConnection().zadd(key, score, value) mengembalikan 1 jika penambahan berjaya, jadi LettuceConverters.toBoolean(1) mendapat adalah benar. , jika tidak, jika penambahan baharu gagal, 0 dikembalikan, iaitu LettuceConverters.toBoolean(0) Terdapat juga kes ketiga, iaitu, pengecualian berlaku dalam this.getConnection().zadd(key, score, value). ) kaedah Apakah yang berlaku jika pengecualian berlaku?

Sepatutnya apabila sambungan gagal.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian tamat masa apabila Springboot2.x menyepadukan salad dan bersambung ke gugusan redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam