我正在使用带有spring-data-redis:jar:2.0.9的spring boot(无关),它使用lettuce连接到我的Redis。我使用的是一个包含大约100个键的哈希结构。在这些键下,我放了一些对象,它们的类型也是无关的:
private static final String HASH_KEY_NAME = "myspecialhashes:somekey";
@Autowired
private RedisTemplate<String, MyDto> myDtoRedisTemplate;
myDtoRedisTemplate.opsForHash().put(HASH_KEY_NAME, dto.getId(), dto);
List allDtosRaw = myDtoRedisTemplate.opsForHash().values(HASH_KEY_NAME);
myDtoRedisTemplate.boundHashOps(HASH_KEY_NAME).keys()
看起来很好,返回的一组键以以下开头:
(java.util.LinkedHashSet<E>) [fakeservicetest:dummy3:write, fakesingle:dummy:sub1:write, ....
由于有很多键,我希望能够使用HSCAN从一个令牌开始过滤对象列表,而不是获取所有键并在我的Java应用程序中过滤它们。所以,这就是我如何执行HSCAN来获取所有以“fake”开头的哈希条目的方法。
List filteredDtosRaw = new LinkedList<>();
ScanOptions scanOptions = ScanOptions.scanOptions().match("fake*").count(10000).build();
Cursor cursor = myDtoRedisTemplate.boundHashOps(HASH_KEY_NAME).scan(scanOptions);
cursor.forEachRemaining(filteredDtosRaw ::add);
不幸的是,这将返回零结果。我试着用各种方法来解决这个问题,并取得一些结果。最后,我转向redis命令行,看看redis对这一切的想法是什么
redis-cli HSCAN "myspecialhashes:somekey" 0 MATCH "fake*" COUNT 1000
redis-cli HGETALL "myspecialhashes:somekey"
结果是这样的:
1) "0"
2) 1) "\xac\xed\x00\x05t\x00\x1cfakeservicetest:dummy3:write"
2) "{\"@class\":\"
.....
因此,这些键似乎包含一个前缀,这些前缀是一些Unicode字符。这很可能是由于字符串序列化的原因(我已经用调试器在将字符串放入REDIS之前检查了这些字符串,它们一开始就不包含任何不可见的字符)。所以我现在有了一个可行的解决方法:我可以搜索“*fake*”,它在REDIS CLI和Spring Data REDIS中都可以使用。因为我只想要那些以“fake”开头的,所以我可以在Java应用程序中使用String.StartsWith过滤这些内容。但是由于我不喜欢变通方法,我想知道我是否错误地使用了spring data redis,或者在序列化放入redis中的字符串和在扫描中使用的字符串时有一些不一致?
好的,我现在知道了。我已经为字符串串行化器配置了redis串行化器,但看起来哈希键需要单独设置哈希键的串行化器。这些“奇怪的Unicode字符”是JdkSerializer的结果
@Bean
public RedisTemplate<String, MyDto> redisTemplateMyDto() {
final RedisTemplate<String, MyDto> template = new RedisTemplate<String, MyDto>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
更改为
@Bean
public RedisTemplate<String, MyDto> redisTemplateMyDto() {
final RedisTemplate<String, MyDto> template = new RedisTemplate<String, MyDto>();
template.setConnectionFactory(redisConnectionFactory);
template.setHashKeySerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?
我正在尝试在代码中使用NSPredicate搜索名称。搜索工作正常,但不会返回适当的结果。当我搜索一个名称(例如“Colin”)时,它会返回表中的所有其他名称或另一个名称(例如“Mike”),但如果我输入一个不存在的随机字符串,它会返回:“找不到结果”。当我在搜索栏中键入一个名字(例如Lisa)时,我希望它能找到这个名字(Lisa)并返回它,但它没有这样做 这是我的代码: 自己name返回表中的所
以下是我的疑问.... 我没有结果。 另外,我正在使用这个插件来生成请求正文。 我的查询如下所示.. null 感谢您到目前为止的阅读,如果有人能帮助我找出如何使这一工作,我将非常感谢。
我对模型映射器进行了以下配置,以将用户类的实例转换为扩展getuserdto的实例。 在注释掉setReceivedExpense之前,我收到了这个错误: 在花费了一些时间并没有找到根本原因之后,我试图删除DTO中所有可疑的循环依赖项(我在GetExpenseDto中引用了GetExpenseDto,expenseDtoConverter的返回结果),我仍然收到相同的错误,我注释掉了map()。s
问题内容: 有没有人看到像这样的方法签名后放置的数组? 版画 过去,“ C”兼容性是一种奇怪的表示法,但我也无法想象有人用C编写这种代码。 有谁知道为什么甚至允许这样做? 如果有问题,我正在使用Java 7 update 10。 这与Java 6中的功能相同。http://ideone.com/91rZV1 顺便说一句,这不会编译,我也不希望它编译 问题答案: 有谁知道为什么甚至允许这样做? 在这
为什么in\u array()有时表现得如此奇怪,并返回如此意外的结果? 我们来看几个例子: 嗯?这里发生了什么!? (几年前,我开始怀疑这种奇怪的行为。不过我认为它可能对某些人有用,所以我进入了这个问题。)