- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近在我的网站上实现了内存缓存,该网站一直承受着沉重的 mysql 负载(mysql 已尽可能优化)。它解决了我所有的负载问题,并且网站运行良好。
我现在面临的问题是陈旧的缓存值。我在大多数页面上都有 1 小时的自动过期时间,当数据库中的值发生变化时,我也会删除 key ,但我很难跟踪并有效地清除所有 key 。
在某些页面上,这是微不足道的。我可以将键设置为 item_id(例如 item_4653),当它的数据更新时,或者项目被删除时,键被清除。
但在大多数页面上,我采用脚本文件名 + 查询字符串,对其进行 md5,并将其用作内存缓存中的键。这对于复杂的 url(非常常见)特别有用。
例如,我加载了以下页面。
index.php?search_keywords=好&search_section=1&sort=release&page=2
它将包含一个项目列表,这些项目将从内存缓存中获取。然后另一个用户提交了一个标题中有“good”的项目,它恰好在值的范围内,它会出现在第 2 页上,除非它不会出现在那里,直到缓存被刷新。让这更复杂的是,新添加的项目也会出现在 index.php?sort=newest 以及 index.php?category=some_category?page=1 等等。每一个都有一个唯一的键(脚本名称的 md5 + 查询字符串)。
因此,如果新添加的项目是从实时数据库中获取的,那么它们可能会出现在数十个页面上,但在陈旧缓存更新之前,它不会在任何页面上可见。唯一的选择是等待项目自动过期。
这个问题在我的论坛(自定义编码)上变得更加明显,其中的值必须按需更新,对于所有可能的缓存页面组合。假设我有 4 个页面线程,我注意到第 2 页上有 3 个垃圾帖子。删除它们后,第 2 页被重建,但它也必须重建第 3 和第 4 页,否则新重建的第 2 页上会有重复的帖子,和旧的第 3 页。这只是 1 个示例......有许多这样的场景。
有什么想法吗?
最佳答案
由于您在 memcached 中缓存整个页面,因此您的页面无法相互共享数据库中的缓存数据。假设我有 page1.php 和 page2.php,page1 和 page2 作为 memcached 中的键。两个页面都显示项目。我添加了一个新项目。现在我必须使 page1 和 page2 过期。
相反,我可以在 memcached 中有一个 items 键,page1.php 和 page2.php 都用来显示项目。当我添加一个新项目时,我使 items 键过期(或者更好,更新它的值),并且 page1.php 和 page2.php 都是最新的。
如果您仍然想缓存整个页面,您可以将信息添加到您的键中,这些信息将在缓存的数据发生变化时发生变化(如果数据变化太频繁,这将没有意义)。例如:
"page1:[timestamp of newest item]"
通过这种方式,您可以查找最新项目的时间戳,一个廉价的查询,并用它构建您的缓存键。一旦添加了更新的项目,缓存键就会改变,自动失效。这种方法意味着您仍然必须每次都访问数据库以查看最新项目的时间戳。
关于php - 管理 key (在 memcache 中)以防止缓存值过时的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879657/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!