如何在Redis中为自定义地图存储数据?

时间:2016-04-18 16:49:03

标签: java redis

我现在将数据存储在地图中并提取字段值而不是Map我想在Redis中存储数据。我是Redis的新手,使用下面的代码存储在Redis中:

 public class CachingRedis {
private static HashMap<String, UserFields> Cache;
private static JedisPool pool = null;
private static final String redisHost = "localhost";
private static final Integer redisPort = 6379;
static Jedis jedis = null;
static User u;

public CachingRedis() {
    pool = new JedisPool(redisHost, redisPort);
    this.Cache = new HashMap<String, UserFields>();

}

public static void main(String[] args) throws ExecutionException {

    CachingRedis gt = new CachingRedis();
    gt.addSets();

}

private void addSets() {
    InputStream in = ClassLoader.class.getResourceAsStream("/users.csv"); 
    u = new User(in);
    String[] consideredUserFields = { "Area","FirstName","LastName","Contact","Level"};
    List<String[]> users = p.getUsers();
    jedis = pool.getResource();
    int count1 = 0;
    String token = null;
    String fieldName = null;
    String fieldVal = null;

    for (int i = 0; i < users.size(); i++) {
        UserFields uFields = new UserFields();
        String tmpId = Integer.toString(p.getUserId(i));
        String[] tmpFields = Users.get(i);
        for (int j = 0; j < tmpFields.length; j++) {

            fieldName = consideredUsersFields[j];
            fieldVal = tmpFields[j];

            if (Cache != null && Cache.containsKey(tmpId)) {
                uFields = Cache.get(tmpId);
                uFields.setFieldKeyValues(fieldName, fieldVal);
                Cache.put(tmpId, uFields);
                 **jedis.hsetnx( tmpId,fieldName,fieldVal );**
            } else {
                uFields.setFieldKeyValues(fieldName, fieldVal);

                Cache.put(tmpId, pFields);
                **jedis.hsetnx( tmpId,fieldName,fieldVal );**
            }

        }
    }

    }  }

我收到以下错误

Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of       value
at redis.clients.jedis.Protocol.processError(Protocol.java:117)
at redis.clients.jedis.Protocol.process(Protocol.java:142)
at redis.clients.jedis.Protocol.read(Protocol.java:196)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:288)
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:213)
at redis.clients.jedis.Jedis.lpush(Jedis.java:814)
at net.cintell.CachingRedis.addSets(CachingRedis.java:85)
at net.cintell.CachingRedis.main(CachingRedis.java:48)

谁能告诉我哪里做错了?我想将csv文件存储到redis中并获取相应的字段?

1 个答案:

答案 0 :(得分:0)

         public class CachingRedis {
     private static HashMap<String, UserFields> Cache;
     private static JedisPool pool = null;
     private static final String redisHost = "localhost";
     private static final Integer redisPort = 6379;
     static Jedis jedis = null;
     static User u;

    public CachingRedis() {
    pool = new JedisPool(redisHost, redisPort);
    this.Cache = new HashMap<String, UserFields>();

   }

   public static void main(String[] args) throws ExecutionException {

    CachingRedis gt = new CachingRedis();
    gt.addSets();

   }

    private void addSets() {
    InputStream in = ClassLoader.class.getResourceAsStream("/users.csv"); 
    u = new User(in);
      String[] consideredUserFields = {     "Area","FirstName","LastName","Contact","Level"};
    List<String[]> users = p.getUsers();
    jedis = pool.getResource();
    int count1 = 0;
    String token = null;
    String fieldName = null;
    String fieldVal = null;

    for (int i = 0; i < users.size(); i++) {
    UserFields uFields = new UserFields();
    String tmpId = Integer.toString(p.getUserId(i));
    String[] tmpFields = Users.get(i);
    for (int j = 0; j < tmpFields.length; j++) {

        fieldName = consideredUsersFields[j];
        fieldVal = tmpFields[j];

        if (Cache != null && Cache.containsKey(tmpId)) {
            uFields = Cache.get(tmpId);
            uFields.setFieldKeyValues(fieldName, fieldVal);
            Cache.put(tmpId, uFields);

        } else {
            uFields.setFieldKeyValues(fieldName, fieldVal);

            Cache.put(tmpId, pFields);

        }

    }
    }
      Map<String, String> Properties = new HashMap<String, String>();
    for (Map.Entry<String, PersonaFields> entry : Cache.entrySet()) {

            Properties.put("Id", entry.getKey());
        Properties.put("Area", entry.getValue()
            //rest of the fields
       jedis.hmset("Users"+ entry.getKey(), Properties);
}
    }  }

我已将整个缓存映射加载到redis中,方法是将每个键值加载到其他映射中,以便我可以根据相同的键值进行检索 来自redis