【问题标题】:How to fetch cached value using redisson client如何使用 redisson 客户端获取缓存值
【发布时间】:2020-08-04 14:36:45
【问题描述】:

我想使用 redisson 客户端获取缓存的 (@Cachable) 值,但如果我在 redisson 客户端中使用任何编解码器 (getBucket("fruit::1",StringCodec.INSTANCE)) 它会返回奇怪的数据,并且它会抛出错误,除非我使用编解码器。

我使用下面的代码进行缓存

    @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();
}

当我使用编解码器获取缓存数据时

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

它返回以下奇怪的数据

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

Redis 配置

@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"
}

我也使用过 fst 编解码器,但得到了同样奇怪的数据。我想要正确解码的数据,如果有人帮助我提供正确的代码,那就太好了。

【问题讨论】:

    标签: java spring-boot caching redis redisson


    【解决方案1】:

    你需要使用 RMapCache 数据来获取数据,而不是 RBucket。

    client.getMapCache("fruits::1", StringCodec.INSTANCE);
    

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2020-09-22
      • 2020-11-26
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多