【发布时间】:2017-10-30 19:43:00
【问题描述】:
我们需要按字母顺序向客户提供城市列表。
我们应该缓存从数据库返回的列表(未排序)还是在排序列表后缓存它(因为它将返回给客户端)?
【问题讨论】:
-
在数据库中排序 -> 返回 -> 存储缓存。 (除非经常更新等并且用户经常使用它)
-
@John,将其作为答案发布,并提供更多解释
我们需要按字母顺序向客户提供城市列表。
我们应该缓存从数据库返回的列表(未排序)还是在排序列表后缓存它(因为它将返回给客户端)?
【问题讨论】:
如前所述,最好在数据库中进行排序。除此之外,假设它没有按数据库排序,是应该先排序然后缓存,还是不排序缓存,每次从缓存中检索时再排序?
您应该在将其放入缓存之前对其进行排序。将缓存视为不仅存储数据,而且存储工作。向客户提供城市列表的工作包括从数据库中检索它并对其进行排序。
无论进程是否涉及从数据库或某些外部 API 检索数据,或者即使它需要应用程序内部的某个长时间运行的进程,这都是正确的。该过程可能会产生一些包含该工作结果的对象,而不仅仅是数据。由您决定是否应缓存某些内容以及缓存多长时间。但总的来说,您是否可以缓存整个过程的输出而不是仅缓存数据检索是值得考虑的。
您还可以缓存部分进程。例如,假设您有一个调用,它返回您公司前 100 种产品的实时可用性。也许结果无法缓存,或者只能缓存很短的时间,因为它应该是“实时”数据。但也许计算前 100 名产品的过程需要更长的时间,并且可以缓存该步骤。现在,您的实时通话只需检查预先计算的产品列表上的可用性。
两个例外: 如果列表真的很短,那么差异可能是微不足道的。 此外,如果您支持多语言应用程序,那么排序顺序可能取决于用户的语言。字母的顺序因字母而异。在这种情况下,您可能需要根据给定的请求文化对列表进行排序。
【讨论】:
您应该始终尽可能对服务器端进行排序。 (见Here)
然后返回排序后的列表,这样辛苦的工作就完成了。然后,您需要决定是否应该缓存信息。缓存允许比每次调用服务器/数据库更快地访问数据。
缓存的问题是您没有每次调用都获取新的/新鲜的数据。因此,您需要确定此列表是否经常更新。
如果它是表单上的下拉列表,他们会定期填写然后缓存。 如果它是他们再也不会使用的注册表单,请不要打扰缓存。
【讨论】: