redis / jedis

Redis Java client
MIT License
11.81k stars 3.86k forks source link

Getting ERR unknown command 'hello' while running CSC as per example of release note #3955

Open atharva29 opened 2 weeks ago

atharva29 commented 2 weeks ago

Expected behavior

Write here what you're expecting ...

Actual behavior

Getting ERR unknown command 'hello' while running CSC as per example of release note

Write here what happens instead ... Getting following error

Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'hello' at redis.clients.jedis.Protocol.processError(Protocol.java:110) at redis.clients.jedis.Protocol.process(Protocol.java:158) at redis.clients.jedis.Protocol.read(Protocol.java:227) at redis.clients.jedis.csc.CacheConnection.protocolRead(CacheConnection.java:40) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:389) at redis.clients.jedis.Connection.getOne(Connection.java:362) at redis.clients.jedis.Connection.helloOrAuth(Connection.java:546) at redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:456) at redis.clients.jedis.csc.CacheConnection.initializeFromClientConfig(CacheConnection.java:33) at redis.clients.jedis.Connection.<init>(Connection.java:69) at redis.clients.jedis.csc.CacheConnection.<init>(CacheConnection.java:21) at redis.clients.jedis.ConnectionFactory.makeObject(ConnectionFactory.java:67) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:566) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:306) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:233) at redis.clients.jedis.util.Pool.getResource(Pool.java:38) at redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:42) at redis.clients.jedis.ConnectionPool.getResource(ConnectionPool.java:9) at redis.clients.jedis.providers.PooledConnectionProvider.getConnection(PooledConnectionProvider.java:83) at redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:23) at redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:308) at redis.clients.jedis.UnifiedJedis.set(UnifiedJedis.java:781) at com.example.redisson_demo.CSCExampleTest.start(CSCExampleTest.java:32) at com.example.redisson_demo.RedissonDemoApplication.main(RedissonDemoApplication.java:18)

Steps to reproduce:

Please create a reproducible case of your problem. Make sure that case repeats consistently and it's not random 1. 2. 3.

Redis / Jedis Configuration

`package com.example.redisson_demo;

import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisClientConfig; import redis.clients.jedis.DefaultJedisClientConfig; import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.RedisProtocol; import redis.clients.jedis.csc.Cache; import redis.clients.jedis.csc.CacheConfig; import redis.clients.jedis.csc.CacheFactory; import redis.clients.jedis.csc.Cacheable; import redis.clients.jedis.csc.DefaultCacheable; import redis.clients.jedis.commands.ProtocolCommand;

import java.util.List; import java.util.stream.Collectors;

public class CSCExampleTest { public void start() {

HostAndPort node = HostAndPort.from("IP address:port");
JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
    .resp3()                // RESP3 protocol is required for client-side caching
    //.user("myuser")       // Redis server username (optional)
    .password("pass")   // Redis user's password (optional)
    .build();

CacheConfig cacheConfig = getCacheConfig();
Cache cache = CacheFactory.getCache(cacheConfig);

try (UnifiedJedis client = new UnifiedJedis(node, clientConfig, cache)) {
  client.set("foo", "bar");
  client.get("foo");
  client.get("foo"); // Cache hit

  System.out.println("Cache size: " + cache.getSize()); // 1
  System.out.println(cache.getStats().toString());

  //Let's change the value of "foo" to invalidate the value stored in the local cache
  client.mset("foo", "new_value", "ignore_me:1", "another_value");

  Thread.sleep(1000); // wait for the cache invalidation to happen

  System.out.println(client.get("foo")); // Cache miss
  System.out.println(cache.getStats().toString());

  client.get("ignore_me:1"); // Client will ignore this key

  System.out.println("Cache size: " + cache.getSize()); // still 1

  // check the cache stats
  System.out.println(cache.getStats().toString());

} catch (InterruptedException e) {
  throw new RuntimeException(e);
}

}

private static CacheConfig getCacheConfig() {

// This is a simple cacheable implementation that ignores keys starting with "ignore_me"
Cacheable cacheable = new DefaultCacheable() {

  final String IGNORE_PREFIX = "ignore_me";

  @Override
  public boolean isCacheable(ProtocolCommand command, List<Object> keys) {
    // assuming we'll only execute methods with string keys
    List<String> stringKeys = keys.stream()
        .filter(obj -> obj instanceof String)
        .map(obj -> (String) obj)
        .collect(Collectors.toList());

    for (String key : stringKeys) {
      if (key.startsWith(IGNORE_PREFIX)) {
        return false;
      }
    }

    return isDefaultCacheableCommand(command);
  }
};

// Create a cache with a maximum size of 10000 entries
return CacheConfig.builder()
    .maxSize(10000)
    .cacheable(cacheable)
    .build();

} }`

Jedis version:

5.2.0-beta5

Redis version:

Java version:

java-21

krishnapal2545 commented 2 weeks ago

Please resolve this issue ....

sazzad16 commented 1 week ago

Please mention your Redis version.