Spring boot 反应式Redis不会持续发布对流量的更改

Spring boot 反应式Redis不会持续发布对流量的更改,spring-boot,kotlin,redis,reactive-programming,spring-webflux,Spring Boot,Kotlin,Redis,Reactive Programming,Spring Webflux,我试图在我的redis订单列表上获得实时更新,但没有成功。 它似乎获取了所有项目,并仅在最后一个项目上结束。 我想让客户不断更新我的订单列表中的新订单。 我错过了什么 这是我的代码: @RestController class LiveOrderController { @Autowired lateinit var redisOperations: ReactiveRedisOperations<String, LiveOrder> @GetMappin

我试图在我的redis订单列表上获得实时更新,但没有成功。 它似乎获取了所有项目,并仅在最后一个项目上结束。 我想让客户不断更新我的订单列表中的新订单。 我错过了什么

这是我的代码:

@RestController
class LiveOrderController {

    @Autowired
    lateinit var redisOperations: ReactiveRedisOperations<String, LiveOrder>

    @GetMapping(produces = [MediaType.TEXT_EVENT_STREAM_VALUE], value = "/orders")
    fun getLiveOrders(): Flux<LiveOrder> {
        val zops = redisOperations?.opsForZSet()
        return zops?.rangeByScore("orders", Range.unbounded())
    }
}
@RestController
类LiveOrderController{
@自动连线
lateinit var redisOperations:反应器操作
@GetMapping(products=[MediaType.TEXT\u EVENT\u STREAM\u VALUE],VALUE=“/orders”)
fun getLiveOrders():Flux{
val zops=redisOperations?.opsForZSet()
返回zops?.rangeByScore(“订单”,Range.unbounded())
}
}

Redis中没有此类功能。首先,对排序集的反应式检索只是获取快照,但您的调用是以反应式方式进行的。所以你需要订阅

如果您像这样选择
键空间通知
(K-启用键空间通知,z-包含zset命令):

并在您的服务中订阅它们,如下所示:

reactivedisessagelistenercontainer reactivedisessages;
// ...
接收(新模式主题(“__keyspace@0__:订单)
.map(m->{
系统输出打印项次(m);
返回m;
})
您将看到如下消息:
PatternMessage{channel=__keyspace@0__:订单、式样=__keyspace@0__:orders,message=zadd}
。它将通知您已添加了某些内容。你可以用某种方式对此做出反应-重新获得完整的集合,或者只获得部分(头部/尾部)。您甚至可能还记得上一个集合,获取新集合并发送差异

但我真正建议的是以某种方式重新构建流,直接使用Redis发布/订阅功能。例如:publisher service将调用
eval
,而不是直接调用
zadd
,这将发出两个命令:
zadd orders 1x
publish orders“1:x”
(您需要的任何自定义消息,可能是JSON)

然后在代码中,您将订阅自定义主题,如下所示:

返回reactiveRedisMessages.receive(新模式主题(“订单”))
.map(LiveOrder::fromNotification);

zops是什么数据类型?zops是一种反应性的zSetOperations,它的方法不会做您认为它能做的事情。您需要使用发布/订阅或键空间通知来侦听更改。值得一读的是反应式API的作用和动机。
config set notify-keyspace-events Kz