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:
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 }
1 2 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) 3
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
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!