在这些缓存方案中,代码在哪里执行?

时间:2019-07-14 00:03:49

标签: caching redis

我正在阅读有关诸如暂存,直写,回写等缓存策略的信息。在直写和回写的特定情况下,这暗示着缓存本身负责分别写入数据库和事件队列(有关完整上下文,这是文章-https://github.com/donnemartin/system-design-primer#when-to-update-the-cache

例如,直写显示为

应用代码:

set_user(12345, {"foo":"bar"})

缓存代码:

def set_user(user_id, values):
    user = db.query("UPDATE Users WHERE id = {0}", user_id, values)
    cache.set(user_id, user)

现在,让我们假设我们正在使用Redis。

在上面的具体示例中,是否在Redis客户端的计算机或Redis服务器上调用了假设的set_user函数?

现在,似乎有 可以在Redis服务器上调用自定义逻辑的方法,例如通过编写Lua脚本,但我对此表示怀疑,实际上是为了实现此缓存策略,部分是因为我从未听说过有人这么做。

我看过其他文章,显示仅在Redis客户端的计算机上实现了此策略,但是我不确定此时该相信哪些资源。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

它是应用程序的一部分。实际上,将示例称为“数据存储代码”而不是“缓存代码”会更合适。 set_user方法属于基础UserStore类,基于数据存储类型,写策略等具有不同的实现。对于“直写”,它将是:

class WriteThroughUserStore(UserStore):

    def __init__(self, cache_user_store, db_user_store):
        self.cache_user_store = cache_user_store
        self.db_user_store = db_user_store

    def get_user(self, user_id):
        return self.cache_user_store.get_user(user_id)

    def set_user(self, user):
        self.db_user_store.set_user(user)
        self.cache_user_store.set_user(user)

“直写”的关键在于,只有在将数据同步写入高速缓存和数据库之后,才能确认写入操作完成。顺序无关紧要:您可以先更新缓存,或先更新数据库,甚至并行执行。