草庐IT

c# - 希望优化 Redis 内存使用以缓存许多 JSON API 结果

coder 2023-07-18 原文

我是 Redis 的新手,我只是尝试缓存一些数据,看看内存使用/性能与 Memcached 等其他选项相比如何。我正在通过 IRedisClient 使用 ServiceStack.Redis 客户端库

我一直在测试 Redis,25k 个键/值对象占用大约 250MB 的内存,还有一个 100MB 的 dump.rdb 文件。我需要比这更多的缓存,并且希望尽可能减少内存消耗。我最好的猜测是每个缓存项的文本(JSON blob)大小约为 4k,但如果我的基本数学是正确的,从内存占用的角度来看,每个项在 Redis 中至少消耗大约 10k。转储大小和内存大小之间的巨大差异让我有点担心。

我现在也在 64 位 VM 上运行,据我所知,与 32 位相比,这会浪费很多额外空间,所以我也会研究一下。看起来 redis 需要 2 倍的内存用于每个指针(每个缓存的键/值?)。这可能是 2.5 倍磁盘:内存比率的来源吗?

我知道我可以自己编写代码来处理进出 Redis 的数据的压缩/解压,但我很好奇是否有某种方法可以配置客户端库来执行类似于 StreamExtensions 的操作.

使用模式很重,写入不频繁,和/或批量缓存刷新写入。

无论如何,寻找有关如何为给定内存量获取更多缓存项的任何建议。

最佳答案

您需要考虑多点。在下文中,我假设您的数据存储在字符串中,每个字符串都包含一个 JSON 对象。

第一点是存储 4 KB 的 JSON 对象。与有用数据的大小相比,Redis 由于动态数据结构和指针而产生的开销绝对可以忽略不计。如果您有很多非常小的对象(每个键大约 80 字节),这个开销会很高,但是对于 4 KB 的对象,这应该不是问题。

因此使用 32 位版本(减小指针的大小)将无济于事。

第二点是内存占用和转储文件大小之间的差异很容易解释为转储文件中的字符串是使用 LZF 算法压缩的(JSON 确实压缩得很好)。内存占用通常比非压缩数据的转储文件大小大得多。

现在您看到的数据实际大小与内存占用量之间的差异可能是由于分配器内部 碎片造成的。通常,人们只考虑外部碎片(即大多数人通常所说的内存碎片),但在某些情况下,内部碎片也可能是一个主要的开销。查看定义 here .

在您的情况下,4 KB 对象实际上是最坏的情况之一。 Redis 使用 jemalloc 分配器,特点是 well-defined allocation classes .你可以看到4 KB是一个分配类,下一个是8 KB。这意味着如果您的多个对象的重量超过 4 KB(包括 8 字节的 Redis 字符串开销),将分配 8 KB 而不是 4 KB,并且将浪费一半的内存。

您可以通过仅存储略小于 4 KB 的对象来轻松检查这一点,并计算内存占用量与有用数据的预期大小之间的比率。对略大于 4 KB 的对象重复相同的操作并比较结果。

减少开销的可能解决方案:

  • 客户端压缩。使用任何轻量级压缩算法(LZF、LZO、quicklz、snappy)。如果您可以将大多数对象的大小保持在 4 KB 以下,它会很好地工作。

  • 更改内存分配器。 Redis makefile 还支持 tcmalloc(谷歌分配器)作为内存分配器。由于分配类不同,它可以减少这些 4 KB 对象的内存开销。

请注意其他内存存储,你也会得到同样的开销。例如,对于 memcached,slab 分配器的工作是优化内存消耗,并最大限度地减少内部和外部碎片。

关于c# - 希望优化 Redis 内存使用以缓存许多 JSON API 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13222062/

有关c# - 希望优化 Redis 内存使用以缓存许多 JSON API 结果的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  9. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  10. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

随机推荐