gpt4 book ai didi

python - 使用 Python 和 Redis 进行优雅的缓存

转载 作者:IT王子 更新时间:2023-10-29 05:59:44 24 4
gpt4 key购买 nike

我想以优雅的方式缓存来自外部服务的数据:旧数据虽然已过期,但仍在服务,直到工作人员成功获取新数据。数据不是时间关键的,但缺少数据(外部服务关闭)会阻止服务运行,因此使用持久缓存。

目前

  • 我将提取时间戳存储在单独的 Redis key 中

  • 我无限期地缓存数据,直到工作人员获取新数据(我没有设置过期时间)

问题

  • 这是使用 Redis 进行优雅缓存的正确方法吗?

  • 我可以从 Redis 本地获取 key 更新时间戳,这样我就不需要自己存储这些信息

这是代码:

def set_data(self, data):
self.redis.set("bitcoinaverage", pickle.dumps(data))
self.redis.set("bitcoinaverage_updated", calendar.timegm(datetime.datetime.utcnow().utctimetuple()))

def get_data(self):
return pickle.loads(self.redis.get("bitcoinaverage"))

def is_up_to_date(self):

last_updated = datetime.utcfromtimestamp(self.redis.get("bitcoinaverage_updated"))

if not last_updated:
return False

return datetime.datetime.utcnow() < last_updated + self.refresh_delay

def tick(self):
""" Run a periodical worker task to see if we need to update.
"""
if not self.is_up_to_date():
self.update()

最佳答案

您现有的可能有用,但取决于您希望数据集有多大。如果我理解正确,您当前的实现将要求您运行一个工作人员使用 tick() 对每个键执行 ping 操作。在您当前的实现中,就网络来回而言,这将非常非常昂贵,因为您必须通过网络查询 Redis,然后为每个键发回结果(如果需要,可能需要两次查询)更新)。如果仅针对您提到的两个键,那很好。如果需要更多,pipelines are your friend .

如果你想更优雅和健壮,你可以使用notifications当您的 key 过期时。这里的范例是,对于每个值,您将设置两个键:kk_updatedk 将保存键的实际值,而 k_updated 只是一个带有 TTL 设置的哑键,当您希望 k 成为更新。当 k_updated 过期时,您会收到通知,您可以有一个监听器,然后立即将其处理为对新作业的请求以更新 k 并设置一个新的 k_更新。这将使用 pubsub模型,你可以有多个订阅者并使用一个队列来管理新的工作,如果你想对它非常健壮的话。该系统的优势:

  1. key 在过期后会立即更新,无需不断查询它们是否需要更新。

  2. 您可以让多个独立的工作人员订阅并监听更新任务,并在新的更新工作进入时管理它们,这样即使一个更新工作人员出现故障,您也不会丢失更新,直到您重新启动盒子.

如果您没有极端的速度或稳健性需求,后一种系统对您的情况来说可能有点过分,但如果您有或计划这样做,则需要考虑。

关于python - 使用 Python 和 Redis 进行优雅的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20561808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com