Delphi有缓存框架吗?

Delphi有缓存框架吗?,delphi,memory-management,caching,Delphi,Memory Management,Caching,问题:Delphi有哪些缓存框架可用,它们的开发程度如何?如果没有,那么有没有一种被广泛接受的方式来实现同样的目标?适用于Delphi的Win32目标版本 问题详细信息:我所询问的框架类型主要存在于Web开发框架中,允许用户: 检查缓存中以前存储的数据/对象 检索数据/对象 存储新的数据/对象 (可选)标记数据/对象并为其添加标签 根据某些条件(标签、标记、时间限制等)使数据/对象过期 我理解,没有RTTI的Delphi对象缺少反射服务意味着它们可能不会以完全相同的方式存在,但是否有类似的方

问题:Delphi有哪些缓存框架可用,它们的开发程度如何?如果没有,那么有没有一种被广泛接受的方式来实现同样的目标?适用于Delphi的Win32目标版本

问题详细信息:我所询问的框架类型主要存在于Web开发框架中,允许用户:

  • 检查缓存中以前存储的数据/对象
  • 检索数据/对象
  • 存储新的数据/对象
  • (可选)标记数据/对象并为其添加标签
  • 根据某些条件(标签、标记、时间限制等)使数据/对象过期
我理解,没有RTTI的Delphi对象缺少反射服务意味着它们可能不会以完全相同的方式存在,但是否有类似的方式以更Delphi的方式实现至少部分相同的最终结果


替代方法:作为本机Delphi库的替代方法:例如,是否有一组好的memcached绑定或类似的绑定?

缓存机制需要手动操作

是一种有用且简单的机制,用于存储缓存对象,并检测它们的过时程度。

这些框架提供了一些缓存对象的方法

根据您的具体要求,这些要求可能过高。如果您试图实现自己的解决方案,我建议您首先查看中的各种容器。

我在Linux上使用过(Windows和MacOS上有不同的版本,以及几乎所有其他操作系统),这非常简单

我使用indy的TIDTelnet直接处理了它,通过阅读协议,我只使用了设置获取删除,和退出

我使用了这种命令(我设置并获取“name”,14是要存储的字节数):

memcached允许每个缓存键最多存储1MB,我使用了复合键,如“Person | 17 | name”、“Person | 17 | picture”、“Employee | 7 | Salary | Basic”(这些都是与我实际做的事情无关的虚构名称)。。。我在缓存中存储了一些二进制文件作为base64,它允许使用多达768k的二进制数据


memcached还可以通过对密钥进行散列,并根据散列选择多个服务器中的一个来分布在多个服务器上。

如果您想构建自己的服务器,您可能需要使用Freepascal来实现,因为它支持64位工作。我建议使用k元树,而不是二进制八字树。

好的。我可能最终会觉得自己很愚蠢,但是TStringList有什么问题呢?我一直在使用一个带有TStringList的结构合理的数据动态数组来查找基于字符串ID的元素。最近,我将TStringList更新为THashedStringList。它可能会快一点,但还没有什么了不起的。到目前为止,StringList/数组排列在我的应用程序中提供了很好的性能


到目前为止,我只缓存了100到150条记录,但我希望它可以正常工作到几千条。在我所从事的行业中,这是一项相当大的业务。

可以在谷歌代码中找到Memcached的Delphi客户端:


这些框架可能对已经使用上述其中一个框架的应用程序有用,但正如您正确指出的,否则可能有点过头了。-kbmw,midware,列表是无止境的。+1,我认为这是一个很好的建议。memcached是一个稳定且优化的解决方案,不仅适用于Linux,也适用于Windows和Mac OS X。如果在协议级别上做这件事太难的话,有一些客户端库(比如libmemcached)可以被Delphi程序用作dll。我只使用set和get、delete和quit。我有自己的职责去做那件事。我不喜欢添加DLL。我同意mghie-迄今为止最好的建议,看看协议,使用现有的包装器作为DLL或自己创建一个快速的Delphi包装器不会有太多的工作。它不可扩展。您的(32位)机器中有2 GB的ram。这创造了几百万张唱片。在具有一百万条记录的排序字符串列表中,插入意味着平均500000个指针(2MByte)的块移动。散列字符串的长度是O(s)。tstringlist的实际限制大约为40000-200000,具体取决于具体的需求、增长模式和代码。感谢您的评论。正如我所说,我正在一个工资单程序中缓存大约150个员工记录。如果我能达到40000名员工,我可能不得不考虑备选方案,但是一个字符串表为我认为我可能会看到的记录数量提供了一个很好的缓存机制。
osama@osama:~$ telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set name 0 0 14
Osama Alassiry
STORED
get name
VALUE name 0 14
Osama Alassiry
END
quit