高速缓存有助于您提高应用程序用户的响应时间。Net.Data 将来自对 Web 服务器的请求存储 在本地以备快速检索,直到刷新信息时为止。本章描述 Net.Data 高速缓存的概念、任务和限制。
许多软件组件都为 Web 应用程序执行高速缓存。这里是高速缓存应用程序的一些示例:
所有这些组件都各自完成它们的高速缓存过程,但是整个结果为用户改进了响应时间。为了确定 何时刷新高速缓存的项目,Web 组件(浏览器、代理服务器和 Web 服务器)通常考虑以下不同选项,包括:
Net.Data 本身为 Net.Data 宏生成的频繁访问页面和相关数据项提供自己的高速缓存功能。通过从 Net.Data 高速缓存中传送页面,可以节省为了创建页面而运行 Net.Data 宏和访问数据库的时间。
对于每个服务器,可以使用一个高速缓存管理器。建议 : 为 Net.Data 的许多实例使用一个高速缓存管理器,每个高速缓存管理器对应多个高速缓存。
图 26显示 Net.Data 使用高速缓存管理器来管理来自一个宏 的 HTML 输出的高速缓存过程。此输出可能包含来自数据库的数据。
![]() |
Net.Data 文档使用以下项目来描述 Net.Data 高速缓存。
根据系统上具有多少 HTTP 服务器以及每个 HTTP 服务器是否运行 Net.Data 的自身副本 (使用各自的 Net.Data 配置文件),您可以使 Net.Data 的所有副本与一个或多个高速缓存管理器相关联。一个高速缓存管理器可以支持许多内存中的高速缓存,每个高速缓存具有 一个高速缓存标识符。图 27显示一个高速缓存管理器,它处理多个宏并管理两个高速缓存。
![]() |
任何数目的项目(称为高速缓存的页)都可以放在一个高速缓存中。每 个高速缓存的页具有唯一的标识符,例如一个统一资源定位器 (URL)。一个页面是一个完整的 HTML 页面或它的一个分段。
当 Net.Data 接收一个高速缓存化的数据的请求(例如,来自内置函数 DTW_CACHE_PAGE)时, 将发生以下步骤:
当宏成功完成处理之后,高速缓存管理器高速缓存 HTML 输出,确保只高速缓存 成功生成的 Web 页。数据直到发送到浏览器才被高速缓存,用户看到的数据与高速缓存的 数据相同。
当 Net.Data 遇到一个错误并从宏中退出时,高速缓存管理器:
Net.Data 高速缓存具有以下限制:
Net.Data 提供了一组灵活的接口,供您在为应用程序配置和设置高速缓存时使用。
表 14描述了使用 Net.Data 高速缓存功能的各种选项以及这些选项描述的地方。
接口 | 描述 | 转至 ... |
---|---|---|
高速缓存管理器配置选项 | 您可以在高速缓存管理器配置文件的高速缓存管理器节中为高速缓存管理器指定许多选项,例如记录和跟踪。 | 定义高速缓存管理器 |
高速缓存配置选项 | 在 Net.Data 的高速缓存管理器的单个实例中,您可以定义 许多高速缓存来保存高速缓存项。每个高速缓存具有自己的特性集(例如大小和位置)和高速缓存标 识符。在高速缓存管理器配置文件中的高速缓存节中定义了这些特性。每个节是由高速缓存标识符 来标识的。 | 定义高速缓存 |
Net.Data 初始化选项 | 如果 Net.Data 和相应的高速缓存管理器在各自系统上运行 ,则必须在 Net.Data 初始化文件中指定高速缓存管理器系统和端口号。 | 高速缓存管理器配置变量 |
Net.Data 高速缓存内置函数 | 可以使用 Net.Data 内置函数来处理 Net.Data 高速缓存的内 容。在适当的宏函数中指定高速缓存标识符来选取具有最合适特性的高速缓存。 | 参见Net.Data 参考的内置函数一章 |
在规划 Net.Data 高速缓存功能的使用时,必须考虑:
要使用 Net.Data 高速缓存,必须完成以下步骤,即需要了解您希望如何使用高速缓存。
建议:在着手于使用高速缓存的较大应用程序之前,必须先规 划和设计应用程序的原型,然后才将它投入生产。
当 Net.Data 遇到内部错误,使它在完成处理之前退出宏,则高速缓存管理器 不高速缓存 Web 页。高速缓存管理器不高速缓存不完整的或包含 Net.Data 错误 的页面。这些错误类型包含宏语法错误和 SQL 错误。
有错误的页在以下条件下可被高速缓存:
在设计应用程序的高速缓存时,需要规划两种类型的标识符。
高速缓存管理器管理系统中一个或多个高速缓存。这些高速缓存中的每一个都包含动态生成的 HTML 页的内容。要配置高速缓存管理器和每个高速缓存,必须更新高速缓存管理器配置文件 cachemgr.cnf 中的关键字值。
高速缓存管理器配置文件中包含两种类型的节:高速缓存管理器节和高速缓存定义节。下列步骤 描述如何为应用程序定制这两个类型的节。
通过指定允许的关键字的值,来定义高速缓存管理器节。所有关键字都是可选的;除非您不希望接受缺省值,否则不必指定它们。
要定义高速缓存管理器:
缺省情况是将信息写至控制台。
语法:
log=path
其中,path 是高速缓存文件的路径与文件名称。
此值必须与 DTW_CACHE_PORT 配置变量 在 Net.Data 初始化文件中指定的端口号匹配。用以下方法确定缺省值:
语法:
port=port_number
缺省值是 30 秒。
语法:
connection-timeout=seconds
缺省值是 no 或 off。
语法:
logging=yes|on|no|off
其中:
缺省值是 no。如果指定为 yes,则在达到最大大小时当前日志将关闭 (参见下面的 log-size),文件具有文件类型 .old,新的日志被打开。只维护一代 日志文件(现存的 .old 文件被覆盖)。
语法:
wrap-log=yes|no
其中:
缺省值是 64000。
语法:
log-size=bytes
缺省值是只记录高速缓存管理器启动和关闭信息。
语法:
trace-flags=trace_flag_definitions
其中:
示例:启用指定所有跟踪标志的跟踪标志:
trace=flags=D_ALL
节的示例:一个有效的配置管理器节:
cache-manager { port = 7175 connection-timeout = 60 logging = off log = /local/netdata/cachemgr/logs/cachemgr.log wrap-log = yes log-size = 32KB }
通过指定允许的关键字的值,来定义“高速缓存定义”节。大部分关键字都是可选的,除非您不希 望使用缺省值,否则不必指定它。
必需的。
语法:
root=path_name
其中:
不是必需的;缺省值是 yes。如果设置为 no,则高速缓存被定义在高速缓存管理器中但是不激活。以后您可以用 cacheadm 命令来激活它。
语法:
caching=yes|no
其中:
不是必需的;缺省值是 0(没有高速缓存至磁盘)。
语法:
fssize=nnB|nnKB|nnM
其中:
不是必需的;缺省值是 1MB。
语法:
mem-size=nnB|nnKB|nnMB
其中:
必需的:否;缺省值是 5 分钟。
语法:
lifetime=time_length
其中:
不是必需的;缺省值是 yes,缺省寿命长度是 60 秒。还可将此值设置为一个时间长度,以指出 yes 值并说明一个项目可在高速缓存中保持的最大时间长度。设置为 no 时,高速缓存页不标记为期满,并且不执行寿命检查。
语法:
check-expiration=yes|nnS|nnM|nnH|no
其中:
不是必需的;缺省值是 1KB。
语法:
datum-memory-limit (cacheobj-memory-limit)=nnB|nnKB|nnMB
其中:
不是必需的;缺省值是 1KB。
语法:
datum-disk-limit (cacheobj-space-limit)=nnB|nnKB|nnMB
其中:
不是必需的;缺省值是 0(无任何统计信息)。
语法:
stat-interval = nnS|nnM|nnH
其中:
当 stat-interval 的值大于 0 时是必需的。
语法:
stat-files=filename
其中 filename 是记录统计文件的路径和名称。
不是必需的;缺省值是 yes。
语法:
reset-stat-counters=yes|no
其中:
必需的;如果不指定,就不创建 高速缓存的事务日志。
语法:
tran-log=filename
其中 filename 是每个高速缓存的事务日志的路径和文件名。
不是必需的;缺省值是 no。
语法:
tran-logging=yes|on|no|off
其中:
不是必需的;缺省值是 yes。如果指定为 yes,则在达到最大大小时当 前日志将关闭(参见下 面的 tran-log-size),具有文件类型 .old,新的日志被打开。只维护一代日志 (现存的 .old 文件被覆盖)。
语法:
wrap-tran-log=yes|no
其中:
不是必需的;缺省值是 64000。
语法:
tran-log-size=bytes
其中 bytes 是最大大小的字节数。
节的示例:高速缓存的一个有效的高速缓存定义节:
cache0 { root = /locale/netdata/cachemgr/caches/cache0 caching = on mem-size = 10MB fs-size = 1MB datum-memory-limit = 200KB datum-disk-limit = 1MB lifetime = 6000000 check-expiration = 999999 tran-logging = no tran-log-size = 10000 wrap-tran-log = yes tran-log = /ocale/netdata/cachemgr/logs/tran.log }
以下章节描述了如何启动和停止高速缓存管理器。
使用 cachemgrd 命令来启动高速缓存管理器守护程序。
语法:
>>-cachemgrd----c--config_file---------------------------------><
参数:
示例:
cachemgrd -c myconfig.cfg
使用 cacheadm 来停止高速缓存管理器。
语法:
>>-cacheadm----+---------------------+---+-----------------+----> '-hostname--hostname--' '-port--port_num--' >----terminate-------------------------------------------------><
参数:
示例:
cacheadm hostname host1 port 7178 terminate
利用使用 DTW_CACHE_PAGE 内置函数来高速缓存一个 Web 页。当 Net.Data 在 宏中发现 DTW_CACHE_PAGE 函数时,它与高速缓存管理器联系并开始在内存中保存宏的 HTML 输出。在 Net.Data 成功地处理了一个宏之后,HTML 输出就发送给浏览器,并且高速缓存管理器 如图 28中所示地在一个事物中将输出进行高速缓存。
![]() |
使用 Net.Data DTW_CACHE_PAGE() 内置函数来指定要写至高速缓存的 Net.Data 生成的页面。
一旦确定在高速缓存中已经不存在页面或页面已经过期,DTW_CACHE_PAGE() 函数将高速缓存函 数语句之后的宏的所有输出。如果页面不存在于高速缓存中或超过指定的年龄,Net.Data 将把 输出页面发送回浏览器,从宏执行中生成新的输出页面,并将页面存储在高速缓存中。
如果高速缓存管理器找到高速缓存页面并且该页面仍然是当前的,则它显示高速缓存的内容,并 且 Net.Data 退出宏。此行为保证了在从高速缓存中检索了 Web 页面之后,不再作不需要的处理。
性能提示:把 DTW_CACHE_PAGE() 放在 最先,或作为宏中的第一条语句,以将执行宏的代价降到最低。
要高速缓存一个页面:
@DTW_CACHE_PAGE("cache_id", cached_page_id, "age", status)
使用该函数来指出 Net.Data 将对跟 随此语句之后的宏中的所有 HTML 输出进行高速缓存。如果您希望高速缓存所有 HTML 输出, 则将该语句放在宏的最前面。
参数:
示例:
%HTML(cache_example) { %IF (customer == "Joe Smith") @DTW_CACHE_PAGE("mymacro.dtw", "http://www.mypage.org", "-1", status) %ENDIF ... <html> <head> <:title>This is the page title</title> </head> <body> <center> <h3>This is the Main Heading</h3> <p>It is $(time). Have a nice day! </body> </html> %}
DTW_CACHE_PAGE() 从宏中的位置初启高速缓存。您通常将函数放在宏的开头,以获取 最佳性能并确保所有 HTML 都已高速缓存。
对于高级的高速缓存应用程序,当您需要在处理期间决定在某个特定点作高速缓存时,可以把 DTW_CACHE_PAGE() 函数 放在 HTML 输出段,而不是在宏的开始。例如,您可能需要根据从查询或函数调用返回的行数来 作高速缓存决定。
示例: 因为进行高速缓存的决定取决于 HTML 输出的期望大小, 所以把函数放在 HTML 块或 XML 块中
% DEFINE { ...%} ... %FUNCTION(DTW_SQL) count_rows(){ select count(*) from customer %REPORT{ %ROW{ @DTW_ASSIGN(ALL_ROWS, V1) %} %} %} %FUNCTION(DTW_SQL) all_customers(){ select * from customer %} %HTML(OUTPUT) { <html> <head> <title>This is the customer list </head> <body> @count_rows() %IF (ALL_ROWS > "100") @DTW_CACHE_PAGE("mymacro.dtw", "http://www.mypage.org", "-1", status) %ENDIF @all_customers() </body> </html> %}
在此例中,此页根据 HTML 输出的期望大小作高速缓存或检索。只有当数据库表包含多于 100 行时,才认为 HTML 输出页是值得作高速缓存的。Net.Data 总是在执行这个宏之后,把 OUTPUT 块中的 文本 (This is the customer list) 发送给浏览器;此文本永不作高速缓存。跟在函数调 用后的行 (@count_rows()) 在满足 IF 块的条件时作高速缓存或检索。两部分共同形 成一个完整的 Net.Data 输出页。
对于以下任务,使用 CACHEADM 命令:
语法:
>>-cacheadm----+---------------------+---+-----------------+----> '-hostname--hostname--' '-port--port_num--' >-----+-activate-------------------------------------+----------> +-deactivate-----------------------------------+ +-flags--flags---------------------------------+ +-flush----------------------------------------+ +-query--+-all-------+-------------------------+ | '-url--url--' | +-purge----url--url----------------------------+ +-statistics--+-off--------------------------+-+ | '-on--+----------------------+-' | | '-interval--interval---' | '-terminate------------------------------------' >-----+--------------------+----------------------------------->< '-cacheid--cache_id--'
参数:
根据内部操作,可保持几种类型的统计值,并可选择写入高速缓存日志。可以为每个高速缓存各 自维护一个独立的日志,也可以将所有统计值写入同一日志。本章讨论以下高速缓存日志主题:
要记录统计值,必须配置高速缓存管理器配置文件。
要配置日志:
在高速缓存管理器配置文件中的高速缓存节中指定 stat-files 和 stat-interval 关键字。
您可以修改统计值设置,而不必停止、重新配置和重新启动高速缓存管理器。
要修改统计值收集设置:
指定 cacheadm statistics 命令。但是请注意,在重新启动高速缓存管理器时, 用 cacheadm statistics 命令作的更改不保存。
统计日志是一个普通 ASCII 文件,可以通过电子表或数据库程序来处理或导入它。可写入 三种类型记录:
mm/dd/yy hh:mm:ss id Initialization: interval n seconds
其中:
mm/dd/yy hh:mm:ss id Termination
其中:
mm/dd/yy hh:mm:ss id statistics
其中:
字段号 | 内容 | 描述 | 计数器重新初始化为零 |
---|---|---|---|
1 | 读取 | 基于高速缓存执行的读出操作的数目 | 是 |
2 | 写入 | 基于高速缓存执行的写操作的数目 | 是 |
3 | 关闭 | 在高速缓存中的对象上执行的关闭操作的数目 | 是 |
4 | 打开读取 | 在高速缓存中的对象上执行的打开读取操作的数目 | 是 |
5 | 打开写入 | 在高速缓存中的对象上执行的打开写入操作的数目 | 是 |
6 | 打开写入查询 | 在高速缓存中的对象上执行的打开写入查询操作的数目 | 是 |
7 | 读取命中 | 在高速缓存的对象上的读取命中的数目 | 是 |
8 | 写入命中 | 在高速缓存的对象上的写入命中的数目 | 是 |
9 | 写入查询命中 | 在高速缓存的对象上的写入查询命中的数目 | 是 |
10 | 初始化 | 与该高速缓存确定的新会话的数目 | 是 |
11 | 终止 | 与该高速缓存终止的会话的数目 | 是 |
12 | 清除 | 从该高速缓存中删除的对象的数目 | 否 |
13 | 使用的内存 | 此高速缓存的内存部分中的对象所使用的内存数 | 否 |
14 | 使用的磁盘 | 此高速缓存的磁盘部分中的对象所使用的磁盘空间数 | 否 |
15 | 可用内存 | 供此高速缓存的内存部分中的对象所使用的有效内存数 | 否 |
16 | 可用磁盘 | 供此高速缓存的磁盘部分中的对象所使用的有效磁盘空间数 | 否 |
17 | 内存对象数目 | 此高速缓存的内存部分中的对象数目 | 否 |
18 | 文件对象数目 | 此高速缓存的磁盘部分中的对象数目 | 否 |
19 | 会话数目 | 基于高速缓存的当前活动的会话数目 | 否 |