skip to Main Content

I wanted to fetch cached(@Cachable) value using redisson client but it return strange data if i use any codec in redisson client (getBucket(“fruit::1”,StringCodec.INSTANCE)) and it throws error unless i use codec.

i have used below code for caching

    @Cacheable(value = "fruits", key = "#id")
    public Fruit getFruitById(int id) {
    // get fruit by id
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Fruit> query = builder.createQuery(Fruit.class);
    Root<Fruit> root = query.from(Fruit.class);
    query.select(root);
    query.where(builder.equal(root.get("id"), id));
    TypedQuery<Fruit> fruitQuery = em.createQuery(query);
    return fruitQuery.getSingleResult();
}

When i use codec for getting that cached data

    RBucket<String> bucket = client.getBucket("fruits::1",
            StringCodec.INSTANCE);
    String fruit = bucket.get();

It returns following strange data

��srcom.home.redis.Fruit��.ܵo*rIidIpriceLnametLjava/lang/String;xp,tpomegrantite

RedisConfiguration

@Bean
public RedisCacheConfiguration cacheConfiguration() {
    RedisCacheConfiguration cacheConfig = RedisCacheConfiguration
            .defaultCacheConfig().entryTtl(Duration.ofSeconds(600))
            .disableCachingNullValues();
    return cacheConfig;
}

@Bean
public RedisCacheManager cacheManager() {
    RedisCacheManager rcm = RedisCacheManager
            .builder(this.getRedissonStoreFactory())
            .cacheDefaults(cacheConfiguration()).transactionAware().build();
    return rcm;
}

@Bean
@Primary
public RedisProperties redisProperties() {
    return new RedisProperties();
}

@Bean
public RedissonConnectionFactory getRedissonStoreFactory() {
    return new RedissonConnectionFactory(getConfig());
}

@Bean
public RedissonNode getNode() {
    RedissonNodeConfig nodeConfig = new RedissonNodeConfig(getConfig());
    nodeConfig.setExecutorServiceWorkers(
            Collections.singletonMap("ensimp", 1));
    RedissonNode node = RedissonNode.create(nodeConfig);
    node.start();
    return node;
}

@Bean
public Config getConfig() 
{
    Config config = new Config();
    RedisProperties properties = redisProperties();
    config.useSingleServer().setAddress(
            "redis://" + properties.getHost() + ":" + properties.getPort());
    return config;
}

redisson.json

{
  "singleServerConfig":{
      "idleConnectionTimeout":500,
      "connectTimeout":1000,
      "timeout":3000,
      "retryAttempts":3,
      "retryInterval":1500,
      "password":null,
      "subscriptionsPerConnection":5,
      "clientName":null,
      "address": "redis://127.0.0.1:6379",
      "subscriptionConnectionMinimumIdleSize":0,
      "subscriptionConnectionPoolSize":1,
	  "connectionMinimumIdleSize":0,
	  "connectionPoolSize":20,
	  "database":0,
	  "dnsMonitoringInterval":5000
	},
	"threads":16,
    "nettyThreads":32,
    "codec":{
       "class":"org.redisson.codec.FstCodec"
     },
     "transportMode":"NIO"
}

i’ve used fst codec too but got the same strange data. i want correctly decoded data it’d be great if anyone help me with a right code.

2

Answers


  1. You need to use RMapCache data to obtain data and not RBucket.

    client.getMapCache("fruits::1", StringCodec.INSTANCE);
    
    Login or Signup to reply.
  2. try this:

    RMapCache mycache;

    mycache=client.getMapCache("fruits::1");

    then to retrieve the data use readAllValues()

    Collection<Fruit> map=mycache.readAllValues();

    System.out.println(map);

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search