当前位置: 首页 > 知识库问答 >
问题:

Redis BRPOPLPUSH的Spring数据支持

盖马鲁
2023-03-14
<bean
    id="jedisPoolConfig"
    class="redis.clients.jedis.JedisPoolConfig"
    p:maxTotal="100"
    p:maxIdle="10"
    p:maxWaitMillis="5000"
/> 

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
    p:host-name="${redis.server.host}" p:port="${redis.server.port}"
    p:password="${redis.server.password}" 
    p:use-pool="${redis.server.usepool}" 
    p:pool-config-ref="jedisPoolConfig"/>

<bean id="genericJackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>

<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>       


<!-- redis template definition -->  
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"      p:connection-factory-ref="jedisConnectionFactory">      <property name="keySerializer" ref="stringSerializer"/>
        <property name="hashKeySerializer" ref="stringSerializer"/>
        <property name="hashValueSerializer" ref="genericJackson2JsonRedisSerializer"/>
</bean>     

<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"      p:connection-factory-ref="jedisConnectionFactory" />

要执行brpoplpush,我在下面没有看到此选项

   OPTION_1  -> getRedisTemplate().boundListOps("Key").*

   OPTION_2 -> getRedisTemplate().opsForList().rightPopAndLeftPush("sourceKey", "destinationKey")  ---> No blocking ? 

相反,它可以在,

   OPTION_3 -> getRedisTemplate().getConnectionFactory().getConnection().bRPopLPush(timeout, srcKey, dstKey)



问题_0:这是唯一的选择吗?为什么上面两个API都没有呢?

请注意,boundListOps仍然通过将注册的密钥传递给opsForList来固有地使用opsForList。

好的,我什么时候应该直接使用getConnectionFactory().getConnection()

问题2:如果我使用getConnectionFactory().getConnection(),我需要在finally(){}下关闭()这个连接吗?(因为这是当前支持阻塞rpoplpush的代码)。

RedisTemplate.java
 public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {
RedisConnectionFactory factory = getConnectionFactory();
        RedisConnection conn = null;
        try {
            conn = RedisConnectionUtils.getConnection(factory);
            ...
            ...
        // TODO: any other connection processing?
        return postProcessResult(result, connToUse, existingConnection);
        } finally {
            RedisConnectionUtils.releaseConnection(conn, factory);
        }

回答3:这是我的问题,我已经这么说了。

public RedisTemplate<String, Map<String, Object>> getRedisTemplate() {
        return redisTemplate;
}

在获取DefaultBoundListOperations时,同样的RedisTemplate对象也是这样传递的,其中V是从RedisTemplate引用的。

public BoundListOperations<K, V> boundListOps(K key) {
    return new DefaultBoundListOperations<K, V>(key, this);
}

class DefaultBoundListOperations<K, V> extends DefaultBoundKeyOperations<K> implements BoundListOperations<K, V> {

    public DefaultBoundListOperations(K key, RedisOperations<K, V> operations) {
        super(key, operations); //RedisOperations<K, V> is converted to BoundListOperations<K, V> here
        this.ops = operations.opsForList();
    }
}

问题4:getconnection().brpoplpush为什么接受srckey,dstkey作为byte[]而不是string..?

共有1个答案

裴哲
2023-03-14

关于问题4:首先,重要的是要注意,Redis键和值可以是任何二进制。Spring-data模板将这一点抽象出来,让开发人员处理Java对象而不是字节数组。参见spring-data参考中的以下引用:

...该模板为Redis交互提供了高级抽象。虽然RedisConnection提供了接受和返回二进制值(字节数组)的低级方法,但模板负责序列化和连接管理,使用户不必处理这些细节。

似乎在使用redisconnection时,Spring不知道您的键或值是什么类型,并且它不需要将对象(例如string)转换为Redis理解的二进制文件,因此,您需要将原始二进制文件传递给Redis。

 类似资料:
  • 26.2. Spring的元数据支持 为了与Spring提供的其他重要概念的抽象相一致,Spring提供了一个对元数据实现的门面(facade), 以org.springframework.metadata.Attributes接口的形式来实现。 这个门面因以下几个原因而显得很有价值: 尽管Java 5提供了语言级的元数据支持,但提供这样一个抽象还是能带来价值: Java 5的元数据是静态的。它是

  • 我们正在将我们的工作和数据流从Spring XD迁移到Kubernetes上的Spring cloud数据流。 Spring cloud数据流有商业支持吗?任何链接都有帮助。

  • MongoDB 4.0将引入具有ACID保证的事务支持。 Spring Data MongoDB是否已经支持MongoDB中的事务,如果不是,那么这个很棒的功能何时可用。我真的需要它,考虑到以下问题 - MongoDB模式设计,以支持应用程序水平扩展

  • Django试图尽可能多的支持所有数据库后端的特性。然而,并不是所有数据库都一样,所以我们必须在支持哪些特性和做出哪些安全的假定上做出设计决策。 本文描述了一些Django使用数据库的有关特性。当然,它并不想成为各服务器指定的文档或者参考手册的替代品。 综合说明 持续连接特性 持续连接的特性避免了每一次重新建立与数据库的连接的请求中所增加的压力。这些连接通过 CONN_MAX_AGE 参数(控制一

  • 问题内容: 当使用各种JDBC模板方法之一时,我对如何迭代/滚动大结果集(不适合内存)感到困惑。即使没有直接公开Iterable接口,我至少也希望RowQuerybackHandler实例在查询执行后( 而 不是在堆溢出之后)执行时被调用。 我也有在看一个这个(这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在spring论坛。后者似乎暗示在游标获取数据时确实应该调用回调处

  • 弹性搜索不推荐使用方面,建议使用聚合(http://www.Elastic.co/guide/en/elasticsearch/reference/1.x/search-aggregations.html)。 Spring数据弹性搜索目前支持这个吗? 如果有,有样品吗?