Spring Redis Hash操作SCAN

时间:2016-02-24 08:16:13

标签: java spring redis spring-data-redis

我正在做enterBookingDetails.jsp,我把密钥作为

Spring Redis

我想从redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>)

进行搜索
List<>

也不行。请帮忙!!

3 个答案:

答案 0 :(得分:3)

首先,扫描操作匹配keye与值不匹配。 使用Hash存储值时,它应如下所示: redisTemplate.opsForHash().put("key", keyInsideHash, value); 所以Redis记录的实际密钥是key(你用它来获取哈希)。 keyInsideHash是您需要存储的实际价值的关键。所以首先获取哈希然后从中获取值。 例如:redisTemplate.opsForHash().put("customerKey1", "FirstName", "MyFirstName");redisTemplate.opsForHash().put("customerKey1", "LastName", "MyLastName");。在此示例中,我们使用密钥"customerKey1"存储两个条目["FirstName","MyFirstName"]["LastName", "MyLastName"]的相同哈希值。 在您的情况下,您有一个列表而不是"MyFirstName"。 如果您需要扫描哈希,请执行以下操作(扫描哈希中的键而不是值):

saveToDbCacheRedisTemplate.execute(new RedisCallback<List<String>>() {

            @Override
            public List<String> doInRedis(RedisConnection connection) throws DataAccessException {
                ScanOptions options = ScanOptions.scanOptions().match("pattern").count(1).build();;
                Cursor<Entry<byte[], byte[]>> entries = connection.hScan("customerKey1".getBytes(), options);
                List<String> result = new ArrayList<String>();
                if(entries!=null)
                    while(entries.hasNext()){
                        Entry<byte[], byte[]> entry = entries.next();
                        byte[] actualValue = entry.getValue();
                        result.add(new String(actualValue));
                    }

                return result;
            }

        });

答案 1 :(得分:0)

我今天遇到了这个问题,我发现我的 redis 服务器版本是 redis_version:2.6.16 redis.io 表示此命令可用于 2.8.0 。请参阅:https://redis.io/commands/scan

希望能帮到你!

答案 2 :(得分:0)

使用spring redistemplate时,请尝试以下操作以迭代redis哈希中的字段和值

  /**
   * hScan provided by redis template is for iterating fields and values within a redis HashMap, not among keys
   * @param key
   * @return
   */
  public Map<String, String> hscanAll(final String key) {
    return hscanPattern(key, "*");
  }

  /**
   * Returns the map with fields that match the given {@Code fieldPattern} and values from the HashMap of the given redis {@Code key}
   * @param key
   * @param fieldPattern
   * @return
   */
  public Map<String, String> hscanPattern(final String key, final String fieldPattern) {
    return (Map<String, String>)
        redisTemplate.execute(
            (RedisCallback<Map<String, String>>)
                connection -> {
                  Map<String, String> map = new HashMap<>();
                  try (Cursor<Map.Entry<byte[], byte[]>> cursor =
                      connection.hScan(
                          key.getBytes(),
                          new ScanOptions.ScanOptionsBuilder().match(fieldPattern).count(200).build())) {

                    while (cursor.hasNext()) {
                      Map.Entry<byte[], byte[]> entry = cursor.next();
                      map.put(
                          new String(entry.getKey(), "Utf-8"),
                          new String(entry.getValue(), "Utf-8"));
                    }
                  } catch (Exception e) {
                    log.error(e.getMessage(), e);
                    throw new RuntimeException(e);
                  }
                  return map;
                });
  }