redis block直到存在密钥

问题描述:

我是Redis的新手,想知道是否有方法能够通过密钥存储值直到存在密钥为止。最小代码:redis block直到存在密钥

async def handler(): 
    data = await self._fetch(key) 

async def _fetch(key): 
    return self.redis_connection.get(key) 

如你所知,如果这样的key犯规存在,它returnNone。但是由于在我的项目中,set键值对redis发生在另一个应用程序中,我想redis_connection方法阻止直到存在的密钥。 这样的期望甚至有效吗?

+1

它是否必须立即?你可以在你的_fetch()方法上睡(1),直到密钥可用? – andrefsp

在您的客户端上执行某些类型的池化redis GET时,无法执行您正在尝试执行的操作。在这种情况下,你的客户就必须这样做:

async def _fetch(key): 
    val = self.redis_connection.get(key) 
    while val is None: 
     # Sleep and retry here 
     asyncio.sleep(1) 
     val = self.redis_connection.get(key) 
    return val 

不过,我想请你completelly重新考虑你正在使用此问题的模式。 在我看来,你需要它来做一些像Pub/Sub https://redis.io/topics/pubsub

使执行SET应用成为出版商,而且该应用是否会在GET并等待键可成为用户。

我做了这个有点研究,它看起来像你可以用asyncio_redis做到这一点:

希望这有助于。

+0

您提供的代码正是我所做的。感谢您的信息,但。 – Juggernaut

最接近此行为的是启用keyspace notifications并订阅相关渠道(可能按模式)。

但是请注意,通知依赖于不保证传递消息(最多一次语义)的PubSub。

除了@Itamar Haber提到的密钥空间通知方法之外,另一种解决方案是LIST上的阻塞操作。

  1. handler方法调用BRPOP上的空LISTBRPOP notify-list timeout,和块,直到notify-list不为空。
  2. 当它像往常一样完成键值对的设置时,其他应用程序将值推入LISTSET key value; LPUSH notify-list value
  3. handler使用您想要的值从阻止操作中醒来,notify-list被Redis自动销毁。

该解决方案的优点是您不需要太多修改您的handler方法(使用keyspace通知解决方案,您需要注册回调函数)。虽然缺点是您必须依赖其他应用程序的通知(使用密钥空间通知解决方案,但Redis会自动执行通知)。