我可以从Redis
使用检索值Jedis
:
public static void main(String[] args) {
Jedis jedis = new Jedis(HOST, PORT);
jedis.connect();
Set<String> set = jedis.smembers(KEY);
for (String s : set) {
System.out.println(s);
}
jedis.disconnect();
jedis.close();
}
但是当我尝试使用Spring时RedisTemplate
,我没有得到任何数据。我的数据存储Redis
为Set
。
// inject the actual template
@Autowired
private RedisTemplate<String, Object> template;
// inject the template as SetOperations
@Resource(name="redisTemplate")
private SetOperations<String,String> setOps;
public String logHome() {
Set<String> set = setOps.members(KEY);
for(String str:set){
System.out.println(str); //EMPTY
}
Set<byte[]> keys = template.getConnectionFactory().getConnection().keys("*".getBytes());
Iterator<byte[]> it = keys.iterator();
while(it.hasNext()){
byte[] data = (byte[])it.next();
System.out.println(new String(data, 0, data.length)); //KEYS are printed.
}
Set<Object> mySet = template.boundSetOps(KEY).members();
System.out.println(mySet); //EMPTY
return "";
}
有人可以向我指出我在想什么吗?
编辑:我的XML配置为RedisTemplate。
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnectionFactory"/>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="myhostname" p:port="6379" />
您必须配置串行器。
Redis模板将序列化程序用于键,值和哈希键/值。序列化器用于将Java输入转换为存储在Redis中的表示形式。如果您未进行任何配置,则序列化程序默认为JdkSerializationRedisSerializer
。因此,如果您key
在Java代码中要求输入密钥,则序列化程序会将其转换为
"\xac\xed\x00\x05t\x00\x03key"
Spring Data Redis使用这些字节作为查询Redis的关键字。
您可以使用Spring Data Redis添加数据并使用进行查询redis-cli
:
template.boundSetOps("myKey").add(new Date());
然后在 redis-cli
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x05myKey"
127.0.0.1:6379> SMEMBERS "\xac\xed\x00\x05t\x00\x05myKey"
1) "\xac\xed\x00\x05sr\x00\x0ejava.util.Datehj\x81\x01KYt\x19\x03\x00\x00xpw\b\x00\x00\x01N\xcf#\x9cHx"
如您所见,String和Date被序列化为代表Java序列化对象的一些疯狂字节。
您的代码建议您要存储基于字符串的键和值。只需设置StringRedisSerializer
在你的RedisTemplate
Java配置
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
XML配置
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnectionFactory">
<property name="keySerializer" ref="stringSerializer"/>
<property name="valueSerializer" ref="stringSerializer"/>
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="myhostname" p:port="6379"/>
运行代码后的输出如下所示:
value
key
[value]
Spring Data Redis有一些有趣的序列化器,可以在各种系统之间交换消息。您可以从内置的序列化器中选择
或创建自己的。
我使用Spring Data Redis 1.5.1.RELEASE和jedis 2.6.2来验证问题的结果。HTH,马克
进一步阅读:
问题内容: 将DataFrame设置为redis之后,再将其取回,redis返回一个字符串,但我想不出一种将该str转换为DataFrame的方法。 我该如何适当地做这两个? 问题答案: 组: 得到:
我是AWS-SDK的新手,我正在EC2实例上运行一个node.js应用程序。 我正在尝试在node.js应用程序中使用ElastiCache-Redis。但是,我找不到ElastiCache的API来进行基本的Redis调用。下面的url没有提供任何Redis命令。 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElastiCache
我正在尝试使用Spring data Redis使用Jedis将消息发布到一个频道。下面是一个非常简单的Java配置: 当我运行以下测试时: 我得到以下StackTrace:
问题内容: 我想使用camel-redis设置键/值对。我尝试: 但没有喜悦。我得到错误: 尽管有很多有关如何订阅的示例,但我找不到有关如何设置键/值对的单个示例。我该怎么做? 问题答案: 和 (请注意,它们区分大小写)是消息头而不是URI参数
我在Spring和Redis上都很新。我想知道有没有办法按价值得到钥匙? 例如,我希望获得具有给定文件哈希和内容的图像类型文件的get the KEY。我是这样做的: 然而,我被告知这是相当昂贵的,因为我要获得所有以“image”开头的键,并手动检查所有这些键。 现在我在想,也许如果我能按价值得到钥匙会好得多。以便更容易得到它的所有属性。在Redis可能吗?
问题内容: 使用 在Pandas 0.25之前,此方法适用。 现在,已弃用警告。 骨髓如何运作?而且,我如何使pyarrow对象进出Redis。 问题答案: 这是一个使用pyarrow序列化熊猫数据帧以存储在Redis中的完整示例 然后在python中 我刚刚向熊猫提交了PR 28494,以便在文档中包含这个pyarrow示例。