Rumah > pangkalan data > Redis > teks badan

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

PHPz
Lepaskan: 2023-05-27 19:43:05
ke hadapan
1907 orang telah melayarinya

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
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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 }
Salin selepas log masuk

Output cetakan -

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

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>
Salin selepas log masuk

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 }
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!