问题标签 [database-caching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - .Net 有哪些数据库缓存选项?
我在网上看到有很多关于缓存 ASP.Net 的问题,但没有很多关于智能客户端应用程序及其数据库的缓存选项的讨论。
.Net 框架上的智能客户端应用程序有哪些可用的数据缓存选项,你们中的任何人如何使用它们?
编辑
下面提到了企业框架,想法?
mysql - 本地数据库缓存的最佳实践?
我正在开发一个依赖于 MySQL 数据库来获取部分内容的应用程序。在某些情况下,应用程序将在互联网连接 (UMTS) 受限的环境中运行,尤其是存在高延迟。
应用程序的用户能够登录,并且应用程序用户界面的大部分内容是从 MySQL 数据库中检索的。为了防止用户登录后出现延迟,我想在客户端缓存尽可能多的数据库内容。只有在进行了相关更改时才应从数据库中检索新内容。有没有解决这个问题的通用方法?有没有描述这个问题的可靠解决方案的文献?
小更新:我现在正在研究 CouchDB 作为我特定用例的解决方案。主要原因是:
它允许用户和服务器在断开连接时访问和更新相同的共享数据,然后在以后双向复制这些更改。
(来自:http ://couchdb.apache.org/docs/overview.html )
到目前为止,它看起来真的很有希望。
optimization - 如何强制mysql在特定时间段内缓存查询?
有没有办法强制mysql缓存一个特定的查询,比如5分钟,所以即使底层数据库发生变化,执行该查询也总是返回相同的结果?
我正在运行一个约会网站,我有一个显示“最新匹配”的页面,它对数据库的影响太大了。
提前致谢。
php - 带有codeigniter问题的数据库缓存
我刚刚使用 codeigniter 和 mysql 建立了一个站点。它工作得很好,但我想打开数据库缓存。我想我会在全局范围内执行此操作,而不是手动缓存每个 select 语句。在我的数据库配置文件中,我设置 'cache_on' = TRUE 然后为'cachedir' = "http://www.mydomain.com/application/cache/dbcache"
我将整个缓存目录设置为可写,所以我认为一切都设置正确。加载了几页后,我回头查看缓存目录,它仍然是空的。我假设这意味着没有缓存任何内容。我错过了什么吗?我没有收到任何错误,我所有的选择语句都显示了结果。我做错了什么/如何判断缓存是否有效?
谢谢!
c++ - C++ 应用程序中的 SQL 查询最小化/缓存
我正在用C++/Qt编写一个项目,它能够连接到QtSQL ( http://doc.qt.nokia.com/latest/qtsql.html )支持的任何类型的SQL数据库。这包括本地服务器和外部服务器。
但是,当有问题的数据库是外部的时,查询的速度开始成为一个问题(UI 慢,...)。原因:存储在数据库中的每个对象都是延迟加载的,因此每次需要属性时都会发出查询。屏幕上平均显示大约 20 个对象,每个对象显示大约 5 个属性。这意味着,对于我展示的每个屏幕,都会执行大约 100 个查询。查询在数据库服务器本身上执行得非常快,但是在网络上运行的实际查询的开销是相当大的(以秒为单位测量整个屏幕)。
我一直在考虑解决问题的几种方法,最重要的方法似乎是(根据我):
- 减少查询
- 使查询更快
应对 (1)
- 我可以找到某种方法来延迟属性的实际获取(启动事务),然后当程序员编写endTransaction()时,数据库会尝试一次性获取所有内容(使用 SQL UNION 或循环......) . 这可能需要对惰性对象的工作方式进行相当多的修改,但如果人们评论说这是一个不错的解决方案,我认为它可以优雅地解决。如果这个解决方案足够加速一切,那么甚至可能不需要精心设计的缓存方案,从而省去很多麻烦
- 我可以尝试通过在一个查询中获取所有请求的所有对象的全部属性数据来预加载属性数据,从而有效地使它们成为non-lazy。当然,在这种情况下,我将不得不担心过时的数据。我如何在不至少向外部数据库发送一个查询的情况下检测陈旧数据?(注意:发送查询以检查每个属性检查的陈旧数据会在实际发现数据陈旧时提供最佳情况 0x 性能提升和最坏种姓 2x 性能下降)
应对 (2)
例如,可以通过保持数据库的本地同步副本运行来加快查询速度。但是,我在客户端机器上并没有太多的可能性来运行例如与服务器上的数据库类型完全相同的数据库类型。因此,本地副本例如是 SQLite 数据库。这也意味着我不能使用特定于 db-vendor 的解决方案。我在这里有什么选择?在这种情况下,什么对人们有效?
担心
我主要担心的是:
- 陈旧数据:可以想象有很多查询会更改数据库,从而禁止对具有陈旧数据的用户而言似乎可能的操作。
- 可维护性:我可以在这个新层中松散地耦合到什么程度?如果它不必了解我的内部惰性对象系统以及每个对象和可能的查询的所有信息,那显然会更好
最后一个问题
什么是最小化查询成本的好方法?好的意思是某种组合:可维护,易于实现,不太特定于应用程序。如果归结为选择任何2,那就这样吧。我想听听人们谈论他们的经历以及他们为解决这个问题所做的事情。
如您所见,我已经想到了一些问题和处理方法,但是我不知道什么才是明智的方法。由于它可能涉及大量工作和对程序中许多层的密集更改(希望尽可能少),因此我考虑在对此事做出最终决定之前询问这里的所有专家。也有可能我只是忽略了一个非常简单的解决方案,在这种情况下,一个指向它的指针将不胜感激!
假设所有相关的服务器端调整都已完成(例如:MySQL 缓存、最佳索引,...)
*注意:我检查了有类似问题的用户的问题,但这些问题并不完全满足我的问题:关于我的用例的复制方案的建议?和本地数据库缓存的最佳实践?例如)
如果需要任何其他信息来提供答案,请告诉我,我会及时更新我的问题。对任何拼写/语法错误表示歉意,英语不是我的母语。
关于“懒惰”的注意事项
我的代码的一个小例子(当然是简化的):
asp.net - 负载均衡中的 EnterpriseLibrary 缓存
我可以在负载平衡服务器中使用 Microsoft 企业库缓存吗?我的情况是我有一个位于 2 个负载平衡服务器中的 Web 服务,并且我使用具有如下配置的数据库缓存“backingStores”
当我从 server1 使用键“ _testorderstatus3 ”设置缓存并尝试从 server2 获取它时,它返回 Null 值!
同样,当我从 server1 使用相同的键设置值并从 server2 再次设置时,我检查了数据库,我发现它设置了 2 次,如下所示
有什么想法吗?我需要设置并进入两台服务器。
谢谢
java - 将数据库内容缓存在内存中以提高性能
我有一个在 Glassfish 上运行的消息驱动 bean。它每秒接收数百条消息。收到消息后,需要读取JDBC数据库中的值并进行处理。
但是,数据库中的值每天只会更新一次或更少。因此,MDB 将读取的内容大部分时间都是一致的。那么,有没有什么好办法可以将内容缓存到内存中以提高性能呢?
更新:是否可以在 Glassfish 中为 MDB 配置内存数据库 JDBC 连接池?
codeigniter-2 - Codeigniter 网页缓存和数据库缓存?
我还是 Codeigniter 框架的新手。今天我阅读了有关数据库缓存http://codeigniter.com/user_guide/database/caching.html和网页缓存http://codeigniter.com/user_guide/general/caching.html的内容。
一旦页面视图已经在缓存中,如果数据库缓存有意义,我会有点困惑。所以如果页面在缓存中,它无论如何都不会进入数据库。
我在以下场景中看到的唯一一点:如果我从 db 加载 30 个结果,然后使用 php 对结果进行洗牌并从数组 10 结果中提取。下次当页面缓存被删除时,我仍然会有 30 个来自 db 的结果在缓存中,但是这次将这 30 个结果洗牌后会有不同的结果。
我是否遗漏了一些东西,当使用数据库缓存时是否还有其他情况会在使用页面缓存时带来任何好处?
asp.net-mvc-3 - 在内存或数据库中缓存昂贵的 SQL 查询?
让我从描述场景开始。我有一个带有 SQL Server 2008 的 MVC 3 应用程序。在其中一个页面中,我们显示了从数据库返回的产品列表,并且每个登录用户都是唯一的。用于返回产品列表的 SQL 查询(实际上是 VIEW)非常昂贵。
- 它基于非常复杂的业务需求,现阶段无法更改。
- 数据库架构无法更改或重新设计,因为它被其他应用程序使用。
- 有 50k 个产品和 5k 个用户(每个用户可以访问 1 到 50k 个产品)。
为了显示登录用户的产品页面,我们使用:
上面的查询最多返回 50 行(最大页面大小)。WHERE 子句将行数限制为最多 50k(用户有权访问的产品)。加载页面大约需要 5 到 7 秒,而这正是上面的 SQL 查询在 SQL 中运行所需的时间。 问题:
用户进入产品页面,很可能使用分页,重新排序结果,进入详细信息页面等,然后返回列表。并且每次显示结果需要5-7s。
这是不可接受的,但同时业务团队已经接受第一次加载产品页面可能需要 5-7 秒。因此,我们想到了CACHING。
我们现在有两个选项可供选择,至少对我而言,最“明显”的一个是使用 .Net 缓存(在内存中/在 proc 中)。(请注意,由于我们的提供商/托管合作伙伴的技术限制,目前不允许分布式缓存)。
但我对此不太满意。我们最终可能会在内存中有很多产品(当有 50 或 100 个用户同时登录时),这可能会导致服务器上的其他问题,例如 .Net 在我们的代码插入新项目时不断删除缓存项目以释放空间。
第二个选项:
这里的主要问题是生成用户 x 产品 x 访问视图非常昂贵,因此我们认为我们可以创建一个平面表(或者换句话说,数据库中所有产品 x 用户的缓存)。该表将完全是视图的结果。但是,如果添加新产品、更改用户权限等,结果可能随时更改。因此我们需要不断刷新表(这可能需要几秒钟),这开始变得有点复杂。
同样,尽管我们可以实现某种缓存提供程序,并且根据用户的请求,我们将运行原始 SQL 查询并从视图中选择产品(5-7 秒,只接受一次)并将结果保存在平面中SQL 中名为 ProductUserAccessCache 的表。下一个请求,我们将通过快速查询从这个缓存表中获取值(因为我们可以很容易地识别为该特定用户缓存的结果),而无需在 SQL 中进行计算。每当添加产品或更改权限时,我们都会截断缓存表,并在新请求时为请求的用户重新填充该表。这对我来说似乎并不太复杂,但我们在这里所做的基本上是创建一个新的缓存“提供程序”。
- 有没有人有这种问题的经验?
- 使用 .Net 缓存(在 proc 中)会更好吗?
- 有什么建议么?
mysql - SELECT + INSERT + 查询缓存 = MySQL 锁定
MySQL 服务器似乎不断锁定并停止响应某些类型的查询,最终(在几分钟没有响应后)放弃错误“ MySQL 服务器已消失”,然后再次挂起下一组查询,再次然后再次。服务器设置为从属服务器,从主服务器复制到dbA
,主要是 INSERT 语句,每秒大约 5-10 行。一个基于 PHP 的应用程序正在服务器上运行,它每 5-10 秒读取一次新复制的数据,对其进行处理并将结果存储在一个单独的数据库中(INSERT ON DUPLICATE KEY UPDATE)dbB
. 所有表都使用 MyISAM 引擎。Web 应用程序为用户显示后处理的数据。在基本术语中,所涉及的处理步骤是将每秒分辨率的时间序列数据压缩为每分钟、每小时和每天的分辨率。
当 MySQL 锁定时,我执行 SHOW PROCESSLIST 命令并看到以下查询:
“时间”列将保持同步,直到达到某种查询等待超时,然后我们得到错误“ MySQL 服务器已消失”。在 5-10 秒内,将再次处理新数据,同样的锁定将发生。查询 #1 是复制过程。查询#2 是后处理数据的更新。查询 #3 正在流式传输(无缓冲)新复制的数据以进行处理。最终产生错误“ MySQL server has gone away ”的是查询#3,大概是因为它是第一个超时的。
它看起来像某种死锁,但我不明白为什么。在一个数据库中同时进行 SELECT 和 INSERT 似乎会导致死锁,并在另一个数据库中通过 INSERT ON DUPLICATE KEY UPDATE 更新查询缓存。如果我关闭复制或查询缓存,则不会发生锁定。平台:Debian 7、MySQL 5.5.31、PHP 5.4.4 - 所有标准包。值得注意的是,几乎相同的应用程序目前在Debian 6、MySQL 5.1.66、PHP 5.3.3上运行良好,唯一的区别在于后处理数据是使用单独的 INSERT 和 UPDATE 查询而不是 INSERT ON 存储的重复密钥更新。
MySQL 配置(在 Debian 6 和 7 机器上):
任何关于为什么会发生这种锁定的提示将不胜感激!