使用 RedisTemplate 从 Redis 获取设置值

2023-12-19

我能够从中检索值Redis using 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 as a 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 "";
    }

有人可以指出我缺少什么吗?

编辑:我的 RedisTemplate 的 xml 配置。

 <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" />

In short

您必须配置序列化器。

解释

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"

如您所见,字符串和日期被序列化为一些代表 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 有一些有趣的序列化器,允许在不同系统之间交换消息。您可以从内置序列化器中进行选择

  • JacksonJsonRedis序列化器
  • Jackson2JsonRedis序列化器
  • JdkSerializationRedisSerializer(默认)
  • Oxm序列化器
  • 通用转字符串序列化器

或创建您自己的。

我使用 Spring Data Redis 1.5.1.RELEASE 和 jedis 2.6.2 来验证您问题的结果。 HTH,马克

进一步阅读:

  • Spring Data Redis:序列化器 http://docs.spring.io/spring-data/redis/docs/current/reference/html/#redis:serializer
  • 包含您的示例的要点 https://gist.github.com/mp911de/65b2639dc344fb1cbb2f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RedisTemplate 从 Redis 获取设置值 的相关文章

随机推荐