redis.clients.jedis.Exceptions.JedisDataException: ERR 構文エラー。CLIENT (LIST | KILL ip:port) を試してください。

目次

1. エラー分析

2. Redisが接続されているか確認する

3. レタスを使う


1. エラー分析

このエラーの問題は主に、application.properties ファイル内の Redis 構成が正しいかどうかに依存します。

# Redis服务器配置
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password=111111(没有设置密码就不要这段就行)

# Redis连接池配置
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.data.redis.timeout=30000

Redis 接続プール構成がapplication.propertiesファイル内にある場合は、それが正しいはずです。ただし、依然として Redis 接続の問題が発生しているため、このエラーには他の理由が考えられます。

2. Redisが接続されているか確認する

まず、Redis サーバーが実行中であり、アプリケーションが配置されているホストからアクセスできることを確認します。次のコマンドを使用して、Redis サーバーが適切に実行されているかどうかをテストできます。

コマンドを使用します:

redis-cliping

 Redis サーバーが実行されていない場合は、必ず起動してください。

次に、アプリケーション コード、特に Redis 関連の部分をチェックして、間違った Redis コマンドが送信されていないことを確認してください。アプリケーションおよび Redis サーバーと互換性のあるバージョンの Redis クライアント ライブラリを使用していることを確認してください。

3. レタスを使う

問題が解決しない場合は、Spring Boot 2.x でデフォルトでサポートされている Redis クライアントである Lettuce を Redis クライアントとして使用するように切り替えてみてください。以下に、pom.xmlLettuce 依存関係を追加する方法の例を示します。

        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </dependency>

Redis 接続ファクトリー構成を変更して、Lettuce と連携できるようにすることができます。

RedisConfig.java

import java.time.Duration;

/**
 * Redis 配置类
 */
@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
        lettuceConnectionFactory.setHostName("127.0.0.1");
        lettuceConnectionFactory.setPort(6379);
        lettuceConnectionFactory.setPassword("111111");

        System.out.println("Redis 连接工厂:" + lettuceConnectionFactory.toString());
        return lettuceConnectionFactory;
    }

Lettuce は Redis クライアントとして使用され、Jedis に依存しなくなります。Lettuce に切り替えた後、アプリケーションを再度実行して、同じ問題が引き続き発生するかどうかを確認します。

RedisConfig 構成を完了する

package com.tscabinet.config;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.serializer.*;
import redis.clients.jedis.JedisPoolConfig;

import java.time.Duration;

/**
 * Redis 配置类
 */
@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
        lettuceConnectionFactory.setHostName("127.0.0.1");
        lettuceConnectionFactory.setPort(6379);
        lettuceConnectionFactory.setPassword("111111");

        System.out.println("Redis 连接工厂:" + lettuceConnectionFactory.toString());
        return lettuceConnectionFactory;
    }


    /**
     * 配置缓存管理器
     * @param factory Redis 线程安全连接工厂
     * @return 缓存管理器
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 生成两套默认配置,通过 Config 对象即可对缓存进行自定义配置
        RedisCacheConfiguration cacheConfig1 = RedisCacheConfiguration.defaultCacheConfig()
                // 设置过期时间 10 分钟
                .entryTtl(Duration.ofMinutes(10))
                // 设置缓存前缀
                .computePrefixWith(cacheName -> "cache:user:" + cacheName + ":")
                // 禁止缓存 null 值
                .disableCachingNullValues()
                // 设置 key 序列化
                .serializeKeysWith(keyPair())
                // 设置 value 序列化
                .serializeValuesWith(valuePair());

        RedisCacheConfiguration cacheConfig2 = RedisCacheConfiguration.defaultCacheConfig()
                // 设置过期时间 30 秒
                .entryTtl(Duration.ofSeconds(30))
                .computePrefixWith(cacheName -> "cache:admin:" + cacheName + ":")
                .disableCachingNullValues()
                .serializeKeysWith(keyPair())
                .serializeValuesWith(valuePair());

        RedisCacheConfiguration cacheConfig3 = RedisCacheConfiguration.defaultCacheConfig()
                // 设置过期时间 30 秒
                .entryTtl(Duration.ZERO)
                .computePrefixWith(cacheName -> "cache:NoTime:" + cacheName + ":")
                .disableCachingNullValues()
                .serializeKeysWith(keyPair())
                .serializeValuesWith(valuePair());

        // 返回 Redis 缓存管理器
        return RedisCacheManager.builder(factory)
                .withCacheConfiguration("user", cacheConfig1)
                .withCacheConfiguration("admin", cacheConfig2)
                .withCacheConfiguration("NoTime", cacheConfig3)
                .build();
    }

    /**
     * 配置键序列化
     * @return StringRedisSerializer
     */
    private RedisSerializationContext.SerializationPair<String> keyPair() {
        return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
    }

    /**
     * 配置值序列化,使用 GenericJackson2JsonRedisSerializer 替换默认序列化
     * @return GenericJackson2JsonRedisSerializer
     */
    private RedisSerializationContext.SerializationPair<Object> valuePair() {
        return RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
    }

}

おすすめ

転載: blog.csdn.net/Lushengshi/article/details/132753921