"Optimizing Queries" 视频(Udacity 网络开发课程),缓存数据库查询
"Optimizing Queries" video (Udacity web dev course), caching db queries
这是我感到困惑的视频:https://www.youtube.com/watch?v=9UHKsiDznwg
在大约 6:12 你可以看到他用来缓存数据库查询的代码。我不明白的是他为什么使用字典来缓存查询。他设置它的方式不会让字典只在他设置的 'top' 键上存储一个值。他为什么不把它存储在一个变量中呢?我也包含了有问题的主要代码。
CACHE = {}
def top_arts():
key = 'top'
if key in CACHE:
arts = CACHE[key]
else:
logging.error("DB QUERY")
arts = db.GqlQuery("SELECT * "
"FROM Art"
"WHERE ANCESTOR IS :1"
"ORDER BY created DESC"
"LIMIT 10",
art_key)
arts = list(arts)
CACHE[key] = arts
return arts
该示例只有一个值,true,但这只是一个示例,一个应用程序中通常有多个可缓存的值。该模式支持任意数量的缓存值。
这只是一个习惯问题 - 将整个缓存放在一起,可以很容易地对其进行操作 - 例如查看缓存中的内容等。如果散布着一堆独立变量,则很难做到这一点遍及代码。
当然,这是一个主观问题。有些人可能会反对它,例如因为它有风险:如果不小心在不同的地方使用相同的密钥,缓存值会被破坏 - 很可能不是一个需要追查的小错误。
这是我感到困惑的视频:https://www.youtube.com/watch?v=9UHKsiDznwg
在大约 6:12 你可以看到他用来缓存数据库查询的代码。我不明白的是他为什么使用字典来缓存查询。他设置它的方式不会让字典只在他设置的 'top' 键上存储一个值。他为什么不把它存储在一个变量中呢?我也包含了有问题的主要代码。
CACHE = {}
def top_arts():
key = 'top'
if key in CACHE:
arts = CACHE[key]
else:
logging.error("DB QUERY")
arts = db.GqlQuery("SELECT * "
"FROM Art"
"WHERE ANCESTOR IS :1"
"ORDER BY created DESC"
"LIMIT 10",
art_key)
arts = list(arts)
CACHE[key] = arts
return arts
该示例只有一个值,true,但这只是一个示例,一个应用程序中通常有多个可缓存的值。该模式支持任意数量的缓存值。
这只是一个习惯问题 - 将整个缓存放在一起,可以很容易地对其进行操作 - 例如查看缓存中的内容等。如果散布着一堆独立变量,则很难做到这一点遍及代码。
当然,这是一个主观问题。有些人可能会反对它,例如因为它有风险:如果不小心在不同的地方使用相同的密钥,缓存值会被破坏 - 很可能不是一个需要追查的小错误。