我在redis中放入一个键值,其中键是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]
我很困惑,请告诉我为什么KEYS
和SCAN
的密钥不同
答案 0 :(得分:1)
嗯......如果有人需要,请写下答案。
首先。只有在redis中有自定义字节数组时才会重现问题。如果你保存byte[]
来自string
- 一切都会好的
在我们调用scan
方法之后,Jedis在其自身内部接收字节数组桶,从我们的字节数组创建新的字符串实例,并且存在问题。负字节传输到 65533 值,并且在传回字节数组后,我们的原始数组会发生变化。
所以,其中一个解决方案 - 扩展Jedis
,JedisConnection
和JedisConnectionFactory
类,Jedis
中的方法'scan'类似于'而不转移byte[]
} string