【问题标题】:Spring Jedis. SCAN and KEYS keys mismatch春天的绝地武士。 SCAN 和 KEYS 键不匹配
【发布时间】:2015-12-18 01:27:18
【问题描述】:

我在redis中放了一个key-value,其中key是UUID转换成字节数组,用于空间优化。

"3DEBB752-654A-4206-89BA-D3517237312E" -> [-119, -70, -45, 81, 114, 55, 49, 46, 61, -21, -73, 82, 101, 74, 66, 6].

我正在使用 Spring Jedis 从 Redis 服务器获取数据,当我尝试通过 KEYS 函数获取密钥时

jedisConnection.keys("*".getBytes());

我明白了

[-119, -70, -45, 81, 114, 55, 49, 46, 61, -21, -73, 82, 101, 74, 66, 6]

但是,当我尝试通过 SCAN 功能获取密钥时

jedisConnection.scan(ScanOptions.NONE);

键以某种方式更改为这个

[-17, -65, -67, -17, -65, -67, -17, -65, -67, 81, 114, 55, 49, 46, 61, -17, -65, -67, 82, 101, 74, 66, 6]

我很困惑,请告诉我为什么 KEYSSCAN 的键不同

【问题讨论】:

  • 您是否使用 SCAN 遍历了所有键? SCAN 一次只返回几个键。
  • 是的...由于测试原因,我使用空数据库是 Redis 服务器,只有几个键..所以我没有与另一个键混淆,如果你在谈论那个..
  • 您是否尝试跳过 "*".getBytes()"*"
  • 你能分享一些代码吗?我无法从字节中恢复 UUID 或了解发生了什么。这种行为可能与序列化程序/字节转换相关,但我对此并不完全确定。
  • 没有。方法keys 只接收byte[],而不是String。而且我不确定问题是否存在,因为它返回一切正常..

标签: java redis jedis


【解决方案1】:

嗯...写下答案以防有人需要。

首先。仅当您在 redis 中获得 custom 字节数组时,才会重现问题。如果您保存源自stringbyte[] - 一切都会好起来的。
在我们调用scan方法之后,Jedis内部自己接收字节数组bucket,从我们的字节数组创建新的字符串实例,出现了问题。负字节转换为 65533 值,在转换回字节数组后,我们的原始数组发生了变化。

因此,解决方案之一 - 扩展 JedisJedisConnectionJedisConnectionFactory 类,其中 Jedis 模拟方法“扫描”而不将 byte[] 转移到 string

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2014-01-24
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多