我正在做Spring Redis
,我把键作为
redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>)
我想从列表<>
中搜索,
ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1).build();
Cursor<Entry<Object, Object>> keys = redistemplate.opsForHash().scan("Customer", options);
也不起作用。请救命!!
首先,扫描操作匹配keye不匹配值。当使用哈希存储值时,它应该如下所示: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;
}
});
底层实现是hash table,一般操作复杂度是O(1),要同时操作多个field时就是O(N),N是field的数量。应用场景:土法建索引。比如User对象,除了id有时还要按name来查询。 可以有如下的数据记录: (String) user:101 -> {“id”:101,”name”:”calvin”…} (String) user:102 -> {“id”:102,”name”:”ke
hdel key field 删除指定的hash field
hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field
hset key field value 设置hash field为指定值,如果key不存在,则先创建。 hsetnx 设置hash field为指定值,如果 key 不存在,则先创建。如果 field已经存在,返回0,nx是not exist的意思。
hlen key 返回指定hash的field数量
hvals key 返回hash的所有value