Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringRedis哈希操作扫描_Java_Spring_Redis_Spring Data Redis - Fatal编程技术网

Java SpringRedis哈希操作扫描

Java SpringRedis哈希操作扫描,java,spring,redis,spring-data-redis,Java,Spring,Redis,Spring Data Redis,我正在做Spring Redis,我把钥匙放在 redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>) redistemplate.opsForHash().put(“Customer”,Customer.class,List) 我想从列表中搜索 scanpoptions=scanpoptions.scanpoptions().match(pattern).count(1).build

我正在做Spring Redis,我把钥匙放在

redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>)
redistemplate.opsForHash().put(“Customer”,Customer.class,List)
我想从
列表中搜索

scanpoptions=scanpoptions.scanpoptions().match(pattern).count(1).build();
光标键=redistemplate.opsForHash().scan(“客户”,选项);

也不起作用。请帮忙

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

saveToDbCacheRedisTemplate.execute(新建RedisCallback()){
@凌驾
公共列表doInRedis(重新连接)引发DataAccessException{
ScanOptions=ScanOptions.ScanOptions().match(“模式”).count(1.build();;
游标条目=connection.hScan(“customerKey1.getBytes(),options”);
列表结果=新建ArrayList();
if(条目!=null)
while(entries.hasNext()){
Entry=entries.next();
字节[]actualValue=entry.getValue();
add(新字符串(actualValue));
}
返回结果;
}
});

我今天遇到了这个问题,我发现我的redis服务器版本是
redis\u版本:2.6.16
,并且redis.io表示此命令自2.8.0起可用。请参阅:


希望能对你有所帮助

使用SpringRedisTemplate时,请尝试在下面的redis哈希中迭代字段和值

/**
*redis模板提供的hScan用于在redis HashMap中迭代字段和值,而不是在键之间
*@param-key
*@返回
*/
公共地图hscanAll(最终字符串键){
返回hscanPattern(键“*”);
}
/**
*返回包含与给定{@Code fieldPattern}匹配的字段的映射,以及来自给定redis{@Code key}的HashMap的值
*@param-key
*@param字段模式
*@返回
*/
公共映射hscanPattern(最终字符串键、最终字符串字段模式){
返回(地图)
redisTemplate.execute(
(重新调用)
连接->{
Map Map=newhashmap();
尝试(光标)=
连接.hScan(
key.getBytes(),
新建ScanOptions.ScanOptionsBuilder().match(fieldPattern).count(200.build()){
while(cursor.hasNext()){
Map.Entry=cursor.next();
地图放置(
新字符串(entry.getKey(),“Utf-8”),
新字符串(entry.getValue(),“Utf-8”);
}
}捕获(例外e){
log.error(e.getMessage(),e);
抛出新的运行时异常(e);
}
返回图;
});
}

您可以使用ScanOptions获取数据吗。NONEScanOptions.NONE只能获取与模式不匹配的所有内容。您的模式是什么Nebras,我无法扫描值?我存储了如下密钥:redistemplate.opsForHash().put(“Customer”,Customer.class,List);当我尝试时,hscan Customer 0 match Custom我看到正在提取值。我的要求是在Redis中存储数十亿条记录,并根据用户的意愿提取记录,用户可以进行搜索、对每列进行排序等,在Redis中是否可行?我使用java加载到Redis,所以我不能一次加载一百万条记录,我必须将一百万条记录拆分成100000个键,每个键有100条记录并存储。如果我这样存储,是否可以搜索/排序?我将哈希更改为,keyHash=getString(数据库中的数据);redistemplate.opsForHash().put(“Customer”、keyHash、getString(来自数据库的数据));我确实尝试过游标键=redistemplate.getConnectionFactory().getConnection().hScan(“Customer.getBytes(),options”);它仍然无法提取模式。我想你可以这样做。。不过,下面的链接可以帮助您使用redis hashs最好地存储您的值。Nebras,搜索只发生在键上,而不是值,所以如果我必须实现搜索,我必须将值存储为键。我认为这不是一个正确的做法。即使在HMSET或其他地方,我仍然应该使用值作为键来获取。
ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1).build();

Cursor<Entry<Object, Object>> keys = redistemplate.opsForHash().scan("Customer", options);
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;
            }

        });