Преобразование картына тип значения с джедаем - PullRequest
3 голосов
/ 24 апреля 2019

Итак, у меня есть тип значения:

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<String, String> в объект Session.Существует ли способ сделать это?

Ответ сервера на эквивалентную команду

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

PS :Начиная изучать Redis, надеясь, что этот вид картирования, возможно, уже решен.Да, по крайней мере, не нужно искать клиента как ответ.

Ответы [ 4 ]

3 голосов
/ 29 апреля 2019

Вы используете поля не отдельно, а одновременно. Поэтому я бы предложил вам использовать простые и простые строки Redis вместо использования Redis Hashes. Таким образом, вы будете использовать 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 с целью сериализации / десериализации. Излишне говорить, что вы можете использовать любую библиотеку.

2 голосов
/ 29 апреля 2019

Вы можете преобразовать карту в POJO

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

Так что вам не нужно ожидать специальной обработки, используя библиотеку картографов как Jackson-Databind

2 голосов
/ 29 апреля 2019

Джедаи не предлагают способ сопоставления объектов с хеш-структурами.

Если вы используете пружину, вы можете посмотреть на HashMappers . HashMapper преобразует POJO в хеш и наоборот. В вашем случае HashMapper преобразует сессию в хеш, и наоборот.

0 голосов
/ 29 апреля 2019

Вы можете сохранять и извлекать данные в Redis и из 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;

    }
...