【问题标题】:Web Application Database or Maps for performanceWeb 应用程序数据库或地图以提高性能
【发布时间】:2019-03-05 19:12:30
【问题描述】:
我想知道对用户数据使用 ConcurrentHashMaps 是否有用。我将用户数据保存在 mysql 数据库中,并在用户登录(或有人编辑用户)时检索它们。每次用户进入另一个页面时,这些用户数据都会被刷新。我应该使用地图并在那里保存我的应用程序中的更改,同时在后台有一个数据库,还是应该直接从数据库下载它。我想让应用程序尽可能高效。
【问题讨论】:
标签:
java
mysql
database
multithreading
performance
【解决方案1】:
你所描述的是一个缓存。假设调用数据库的成本很高,因为要加载很多信息,或者用于提取数据的查询很复杂并且需要很多时间。缓存数据结构在这里发挥作用。它基本上是一种内存存储,查询数据库确实更快,因为它确实已经加载到内存中。
填充缓存的过程与查询数据库数据的时间相同(通常更多但顺序相同)。因此,只有在及时带来好处时才使用缓存。不过,数据的速度与新鲜度之间存在折衷。根据您的用例,您必须在这两者之间找到正确的折衷方案,然后您会发现它是否真的方便。
正如您所描述的,即需要保存和显示的用户更新,使用缓存似乎有点过分 IMO,除非您有很多注册用户,而且其中有很多同时使用系统。如果您决定使用它,请记住一些可能会出现的并发问题。并发哈希映射可以使您免于许多危险,但会降低性能。
【解决方案2】:
如果性能是优先级,我认为您应该将登录的用户保留在内存中。
这样,读取请求会很快,因为您不需要查询数据库。但是,如果任何已登录的用户会以某种方式被编辑,您将需要更新地图。
【解决方案3】:
人类无法区分 1 毫秒延迟和 50 毫秒延迟。因此,在“足够好”之外进行优化是多余的。
MySQL 已经做了一些缓存;您添加另一个缓存实际上可能会减慢响应时间。