我正在做enterBookingDetails.jsp
,我把密钥作为
Spring Redis
我想从redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>)
,
List<>
也不行。请帮忙!!
答案 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;
});
}