我正在用Go和MongoDB做restAPI的功课。但我仍然在想:至于我是否应该创建一个字典来存储模型级别的数据,这将帮助我在不访问MongoDB的情况下更快地检索数据。但这里的大问题是同步MongoDB和我创建的字典中的数据。
在文件models/account.go中,我有一个structAccount,在MongoDB中,我还有一个集合account,用于保存网站的所有帐户信息。我应该创建Accountlist来将所有数据存储在数据库中以提高性能吗?。
来源如下:
var AccountList map[int]*Account
type Account struct {
ID int
UserName string
Password string
Email string
Role string
}
与软件中的许多东西一样;这取决于";。
关于所涉及的系统、数据被查询、变异的频率等,没有足够的信息来给出具体的答案。但因为这是家庭作业,我们可以给出场景。
问题的根源在于:是否应该缓存数据库中的结果?
真的需要吗
从学术角度来说,过度优化是可以的。你可以玩技术,了解它们是如何工作的。在现实世界中,我们应该在实现某个东西之前了解它的需求。解决方案越复杂,做出正确的权衡就越重要。
当您要更频繁地使用结果而不是更改结果时,缓存是最好的,而且从存储中获取数据的成本很高。
"昂贵的";可以变化。以秒为单位的一次操作可能很昂贵。但以100毫秒为单位的数十次、数百次或数千次手术也可能如此。
你应该怎么做
你指出了几个缺点。最重要的是:
但这里的大问题是同步MongoDB和我创建的字典中的数据。
同步对于任何分布式系统来说都是最重要的。
如果您有一个服务器实例,那么如何缓存值并不重要。但一旦开始添加实例,事情就会变得复杂起来。
缓存的一种常见模式是使用分布式键值存储。它们允许您存储可以在应用程序之间共享的结果,并使其无效。
- 应用程序检查存储中是否存在密钥
- 如果是,请使用它
- 如果没有,则从原点提取并为下次更新缓存
- 另外,在数据需要更新的任何时候,都要使密钥无效
有很多产品可以使用。Redis很流行,memcached很管用。但由于您使用Go,请签出groupcache
:https://github.com/mailgun/groupcache.它由Google编写以简化dl.google.com
,并由Mailgun扩展以支持TTL。