【问题标题】:Converting a Map<String, String> to a Value type with Jedis使用 Jedis 将 Map<String, String> 转换为值类型
【发布时间】:2019-09-13 14:38:50
【问题描述】:

所以,我有一个值类型:

class Session {
    long createdAt;
    List<String> postIds;
}

使用 jedis 客户端(3.0.0-m1 很重要),我目前正在执行hset 来创建条目,hgetAll 来检索所有键值:

private redis.clients.jedis.Jedis jedis;

void createSession(String idAsKey, Map<String, String> hashFieldValues) {
    jedis.hset(idAsKey, hashFieldValues);
}


Map<String, String> fetchSession(String idAsKey) {
    return jedis.hgetAll(idAsKey);
}

我目前面临的挑战是将Map&lt;String, String&gt; 转换为Session 对象的难易程度。有没有现有的方法可以做到这一点?

等效命令的服务器响应

1) "createdAt"
2) "1556099708307"
3) "postIds"
4) "[a, b, c]"

PS:开始学习 Redis,希望这种映射可能已经解决了。是的,至少不要寻找客户更改作为答案。

【问题讨论】:

    标签: java redis objectmapper jedis value-type


    【解决方案1】:

    你可以convert the map to POJO

    Session session = new ObjectMapper().convertValue(map, Session.class);
    

    所以您不需要特殊处理,只需要使用映射器库作为 Jackson-Databind

    【讨论】:

      【解决方案2】:

      您不是单独使用这些字段,而是同时使用。因此,我建议您使用简单明了的 Redis Strings 而不是使用 Redis 哈希。因此,您将使用 set 保存条目并使用 get 检索它们。

      使用上面的建议,你的代码可能变成如下:

      private redis.clients.jedis.Jedis jedis;
      private com.google.gson.Gson gson; // see Note
      
      void createSession(String idAsKey, Session object) {
          String serializedValue = gson.toJson(object);
          jedis.set(idAsKey, serializedValue);
      }
      
      Session fetchSession(String idAsKey) {
          String serializedValue = jedis.get(idAsKey);
          Session deserializedObject = gson.fromJson(serializedValue, Session.class);
          return deserializedObject;
      }
      

      注意:我使用Gson 来进行序列化/反序列化。不用说,您可以使用任何库。

      【讨论】:

        【解决方案3】:

        您可以像下面这样在 Redis 中保存和获取数据:

        public Map<String, Object> saveDataInRedis(String id, Object obj) {
                Map<String, Object> result = new HashMap<>();
                String jsonObj = "";
                try {
                    jsonObj = objectMapper.writeValueAsString(obj);
                    System.out.println(jsonObj);
                } catch (JsonProcessingException jpe) {
                    logger.warn("In saveDataInRedis Exception :: "+jpe);
                }
                try {
                    valOps.set(id, jsonObj);
                    result.put(DataConstants.IS_SUCCESS, true);
                    result.put(DataConstants.MESSAGE, "Data saved succesfully in redis");
                }catch(RedisConnectionFailureException e){
                    result =null;
                    logger.warn("In saveDataInRedis Exception e :: "+e);
                }
                System.out.println(valOps.getOperations().getClass());
                System.out.println(jedisConnectionFactory.getPoolConfig().getMaxTotal());
                return result;
            }
        

        现在从redis获取数据:

        public Map<String, Object> getDataFromRedis(String id) {
                Map<String, Object> result = new HashMap<>();
                String jsonObj = valOps.get(id);
                System.out.println("jsonObj :: " + jsonObj);
                Session obj = null;
                try {
                    obj = (Session) objectMapper.readValue(jsonObj, Session.class);
                } catch (Exception e) {
                    result.put("data", null);
                    logger.warn("Data from redis is deleted");
                    logger.warn("In getDataFromRedis Exception e :: "+e);
                }
        
                if (obj != null) {
                    result.put(DataConstants.IS_SUCCESS, true);
                    result.put("data", obj);
                }
                System.out.println("result :: " + result);
                return result;
        
            }
        

        【讨论】:

          【解决方案4】:

          Jedis 不提供将对象映射到哈希结构的方法。

          如果你使用的是spring,那么你可以看看HashMappers。 HashMapper 将 POJO 转换为哈希,反之亦然。在您的情况下,HashMapper 会将 Session 转换为哈希,反之亦然。

          【讨论】:

            猜你喜欢
            • 2018-03-22
            • 2020-01-27
            • 2016-07-29
            • 2013-05-24
            • 2014-01-29
            • 1970-01-01
            • 1970-01-01
            • 2019-12-06
            • 2016-07-21
            相关资源
            最近更新 更多