我们应该缓存原始对象还是排序后的对象?

Should we cache raw objects or sorted objects?

我们需要按字母顺序排列的城市列表给客户。

我们应该在列表从数据库返回时缓存它(未排序)还是在列表排序后缓存它(因为它会返回给客户端)?

您应该始终在可能的情况下对服务器端进行排序。 (参见 Here

然后 return 排序列表,这样艰苦的工作就完成了。然后您需要决定是否应该缓存信息。缓存允许比每次调用 server/database 更快地访问数据。

缓存的问题是您 不是 每次调用都获得 new/fresh 数据。因此,您需要确定此列表是否经常更新。

如果它是他们定期填写的表单上的下拉列表,则缓存。 如果是他们用过一次就再也不用的注册表单,就不用缓存了。

如前所述,最好在数据库中进行排序。除此之外,假设它没有按数据库排序,你应该先排序然后缓存它还是缓存它未排序然后每次从缓存中检索它时排序?

您应该在将其放入缓存之前对其进行排序。将缓存视为不仅存储数据,而且存储 work。向客户端提供城市列表的工作包括从数据库中检索它并对其进行排序。

无论进程涉及从数据库或某些外部 API 检索数据,还是需要应用程序内部的某些长 运行 进程,都是如此。该过程可能会产生一些包含该工作结果的对象,而不仅仅是数据。由您决定是否应该缓存某些内容以及缓存多长时间。但总的来说,值得考虑是否可以缓存整个过程的输出,而不是只缓存数据检索。

您还可以缓存进程的一部分。例如,假设您有一个电话 returns 您公司排名前 100 的产品的实时可用性。也许结果无法缓存,或者只能缓存很短的时间,因为它应该是 "real-time" 数据。但也许计算前 100 名产品的过程需要更长的时间,并且可以缓存该步骤。现在您的实时通话只需检查预先计算的产品列表的可用性。

两个例外: 如果列表真的很短,那么差异可能微不足道。 此外,如果您支持多语言应用程序,那么排序顺序可能取决于用户的语言。字母的顺序因字母表而异。在那种情况下,您可能需要根据给定的请求文化对列表进行排序。