我正在阅读有关诸如暂存,直写,回写等缓存策略的信息。在直写和回写的特定情况下,这暗示着缓存本身负责分别写入数据库和事件队列(有关完整上下文,这是文章-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客户端的计算机上实现了此策略,但是我不确定此时该相信哪些资源。
感谢您的帮助!
答案 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)
“直写”的关键在于,只有在将数据同步写入高速缓存和数据库之后,才能确认写入操作完成。顺序无关紧要:您可以先更新缓存,或先更新数据库,甚至并行执行。