我希望以优雅的方式缓存来自外部服务的数据:旧数据虽然已过期,但仍在被服务,直到工作人员成功获取新数据。数据不是时间关键型的,但是缺少数据(外部服务关闭)会阻止服务运行,因此使用持久缓存。
目前
>
我将获取时间戳存储在一个单独的Redis密钥中
我无限期地缓存数据,直到工作人员获取新数据(我不设置过期时间)
问题
>
这是使用Redis进行优雅缓存的正确方法吗?
我可以从Redis本机获取密钥更新的时间戳吗,这样我就不需要自己存储这些信息了
以下是代码:
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()
你所做的肯定会奏效。
没有办法本机获得插入/更新密钥的时间戳,所以您必须按照当前的方式存储它,或者作为替代方案,您可以更改您为bitcoin平均密钥存储的内容以包含时间戳(例如使用一些JSON同时保存时间戳和腌制数据,并存储JSON),这使得get_data()和is_up_to_date()更加复杂。
如果没有为该密钥存储任何内容,那么get_data()中会发生什么情况?get_data()是最新的吗?你测试过这种情况吗?
你所拥有的东西可以工作,但这取决于你期望你的数据集有多大。如果我理解正确,您当前的实现将要求您运行一个工作程序,用tick()ping每个键。在您当前的实现中,这将非常非常昂贵,因为您必须通过网络查询Redis,并将每个键的结果发送回(如果需要更新,可能需要两个查询)。如果只是为了你提到的两把钥匙,那没关系。如果是为了更多,管道是你的朋友。
如果您想变得更优雅、更健壮,可以在密钥过期时使用通知。这里的范例是,为每个值设置两个键:k
,和k_-updated
k
将保存键的实际值,k_updated
将只是一个哑键,设置了TTL,以便在需要更新k
时使用。当k_updated
过期时,您将收到一个通知,您可以让一个侦听器立即将其作为更新k
的新作业请求处理,并设置一个新的k_updated
。这将使用pubsub模型,如果您想非常健壮的话,您可以有多个订阅者,并使用一个队列来管理新作业。该系统的好处:
>
密钥过期后将立即更新,无需不断查询它们以查看是否需要更新。
您可以让多个独立的工作人员订阅并监听更新任务,并在新的更新作业进入时对其进行管理,这样,如果一个更新工作人员出现故障,您就不会丢失更新,直到您重新启动更新框。
如果你没有极端速度或强健的需要,后一种系统可能会被过度使用,但是如果你做了或者计划了,这是值得考虑的。
问题内容: 我想在Redis中实现绝对缓存和滑动缓存。没有人有任何资源链接,这将是有帮助的 问题答案: Redis已经为此提供了许多命令: 到期:设置密钥超时。 期望值:与以前相同,但是需要一个绝对的Unix时间戳(自1970年1月1日以来的秒数)。 TTL:返回具有超时功能的键的剩余生存时间 您必须了解有关Redis过期的重要一件事:仅当使用SET或GETSET移除或覆盖键时,才会清除超时值。所
当我调试我的Camel应用程序时,我意识到路由的正常关闭会忽略由触发的未完成任务。 如果我有如下的路由定义: 我在中设置了一个调试断点(即挂起wireTap的异步处理),然后调用将产生以下日志消息:
优雅关闭,包括两部分,一个是 RPC 框架作为客户端,一个是 RPC 框架作为服务端。 作为服务端 作为服务端的时候,RPC 框架在关闭时,不应该直接暴力关闭。在 RPC 框架中 com.alipay.sofa.rpc.context.RpcRuntimeContext 在静态初始化块中,添加了一个 ShutdownHook // 增加jvm关闭事件 if (RpcConf
本文向大家介绍Haskell优雅的镜片,包括了Haskell优雅的镜片的使用技巧和注意事项,需要的朋友参考一下 示例 除了makeLenses用于生成Lenses的标准功能外,Control.Lens.TH还提供该makeClassy功能。makeClassy具有相同的类型,并以与基本上相同的方式工作makeLenses,但有一个关键区别。除了生成标准的镜头和遍历之外,如果该类型没有参数,它还将创
问题内容: 我是Laravel的新手。我已经对该主题进行了研究,但似乎找不到找到可以解决问题的答案。 我知道Laravel的默认缓存驱动程序设置为 file ,可以更改。它还有一些手工缓存命令,例如: 1) 即使Laravel具有一些自动处理某些缓存的内置命令和功能(无法确切了解哪些部分),我仍然必须在查询结果上手动使用Cache Facade,对吗? 它不会自动执行操作,仅在我想更改某些内容时才
问题内容: 例: 结果是: 如您所见,与列表相比,对数组进行屏蔽的操作更为优雅。如果您尝试使用列表中的数组屏蔽方案,则会收到错误消息: 问题是要为s找到一个优雅的蒙版。 更新: 通过引入的答案,但是提出的要点使解决方案完全符合我的兴趣。 问题答案: 你在找 文档中的示例 相当于: