Redis 的内存使用量比数据多 10 倍

2024-01-01

我正在尝试在 redis 中存储单词列表。表演很棒。

我的方法是制作一个名为“words”的集合,并通过“sadd”添加每个新单词。

当添加一个 15.9 MB 且包含大约 100 万个单词的文件时,redis 服务器进程会消耗 160 MB 的 RAM。为什么我使用了 10 倍的内存,有没有更好的方法来解决这个问题?


这是任何高效数据存储所期望的:单词必须在内存中以由指针链接的单元的动态数据结构进行索引。结构元数据、指针和内存分配器内部碎片的大小是数据比相应的平面文件占用更多内存的原因。

Redis 集被实现为哈希表。这包括:

  • 几何增长的指针数组(2 的幂)
  • 当增量重新哈希处于活动状态时,可能需要第二个数组
  • 代表哈希表中条目的单链表单元(3 个指针,每个条目 24 字节)
  • Redis 对象包装器(每个值一个)(每个条目 16 字节)
  • 实际数据本身(每个数据都以 8 个字节作为大小和容量前缀)

以上所有大小均针对 64 位实现给出。考虑到内存分配器开销,对于使用 jemalloc 分配器 (>= 2.4) 的最新版本的 Redis,Redis 的每个设置项(在数据之上)至少占用 64 个字节

Redis提供内存优化 http://redis.io/topics/memory-optimization对于某些数据类型,但它们不涵盖字符串集。如果您确实需要优化集合的内存消耗,那么您可以使用一些技巧。我不会仅对 160 MB RAM 执行此操作,但如果您有更大的数据,您可以执行以下操作。

如果你不需要集合的并集、交集、差集功能,那么你可以将你的单词存储在哈希对象中。好处是如果哈希对象足够小,Redis 可以使用 zipmap 自动优化哈希对象。在 Redis >= 2.6 中,zipmap 机制已被 ziplist 取代,但其思想是相同的:使用适合 CPU 缓存的序列化数据结构,以获得性能和紧凑的内存占用。

为了保证散列对象足够小,可以根据某种散列机制来分布数据。假设需要存储1M条数据,添加一个单词可以通过以下方式实现:

  • 对其取模 10000 进行哈希处理(在客户端完成)
  • HMSET 单词:[哈希值] [单词] 1

而不是存储:

words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }

您可以存储:

words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
words:H2 => map{ hello:1, howdy:1, salut:1, ... }
...

要检索或检查单词是否存在,它是相同的(对其进行散列并使用 HGET 或 HEXISTS)。

通过这种策略,只要哈希的模为 根据 zipmap 配置(或 Redis >= 2.6 的 ziplist)选择:

# Hashes are encoded in a special way (much more memory efficient) when they
# have at max a given number of elements, and the biggest element does not
# exceed a given threshold. You can configure this limits with the following
# configuration directives.
hash-max-zipmap-entries 512
hash-max-zipmap-value 64

请注意:这些参数的名称在 Redis >= 2.6 中已更改。

这里,1M 项的模 10000 意味着每个哈希对象有 100 个项,这将保证所有项都存储为 zipmaps/ziplists。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 的内存使用量比数据多 10 倍 的相关文章

  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • 隐藏类以及 {} 对象与自定义构造函数之间的等效性 (v8)

    鉴于这篇文章 http richardartoul github io jekyll update 2015 04 26 hidden classes html http richardartoul github io jekyll upd
  • 为什么Redis SET性能优于GET?

    根据Redis基准 http redis io topics benchmarkss Redis 可以执行 100 000 SET 操作 秒和 80 000 GET 操作 秒 Redis 是一种内存数据库 这似乎令人惊讶 因为通常人们会认为
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • 如何按键中的值对 Redis 哈希进行排序

    Redis 有没有一种好方法来获取按值排序的哈希中的键 我查看了文档 但没有找到直接的方法 另外有人可以解释一下redis中的排序是如何实现的 以及什么吗 本文档 http redis io commands SORT using hash
  • Redis如何存储关联数组?设置、散列还是列表?

    我对 Redis 的所有可用存储选项有点困惑 我想做一些简单的事情 并且不想过度设计它 我正在与phpredis and Redis v2 8 6 我有一个需要存储的简单关联数组 我还需要能够通过其键检索项目并循环遍历所有项目 a arra
  • 为什么 Python 中的无分支函数和内置函数速度较慢?

    我发现了 2 个无分支函数 它们可以在 python 中查找两个数字的最大值 并将它们与 if 语句和内置 max 函数进行比较 我认为无分支或内置函数将是最快的 但最快的是 if 语句函数 有人知道这是为什么吗 以下是功能 If 语句 2
  • 确定虚拟内存的页表大小

    考虑一个具有 38 位虚拟字节地址 1KB 页和 512 MB 物理内存的虚拟内存系统 假设有效位 保护位 脏位和使用位总共占 4 位 并且所有虚拟页都在使用中 则本机上每个进程的页表总大小是多少 假设磁盘地址未存储在页表中 好吧 如果问题
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 结构中的内存布局差异

    我在 C 中有以下结构 struct A int a double b float c 该结构与添加了函数的结构之间的内存布局是否存在差异 struct B int a double b float c void foo B foo do

随机推荐

  • TypeScript:如何为已安装的 npm 包定义自定义类型?

    我喜欢用rx node http npmjs com package rx node在 TypeScript 中 import RxNode from rx node 我安装了rx node http npmjs com package r
  • Puppeteer 无法可视化完整的 SVG 图表

    我在 Try Puppeteer 中使用此代码 const browser await puppeteer launch const page await browser newPage await page goto https www
  • 提取 Stan 文件中转换后的数据块中的数据

    我想提取z在 stanfit 对象转换后的数据块中f 是否可以 library rstan m lt stan model model code data real x transformed data real z z chi squar
  • 在使用 psql 在本地下载/保存之前,在 AWS 实例上将表 gzip 转换为 csv

    我是 PostgreSQL 和 psql CLI 的新手 我的带宽极其有限 这导致从 AWS 实例下载每个表 每个表 1 5 GB 需要几个小时 使用 psql 登录数据库后 我使用的当前命令 copy SELECT FROM table
  • TicTacToe AI 做出错误的决定

    一点背景知识 作为在 C 中学习多节点树的一种方法 我决定生成所有可能的 TicTacToe 棋盘并将它们存储在树中 以便从节点开始的分支都是可以从该节点开始的所有棋盘 以及节点是一步步跟随的棋盘 之后 我认为编写一个人工智能来使用该树作为
  • Indy 写缓冲/高效 TCP 通信

    我知道 我问了很多问题 但作为一名新的 delphi 开发人员 我一直在解决所有这些问题 这个使用 indy 10 处理 TCP 通信 为了提高通信效率 我将客户端操作请求编码为单个字节 在大多数情况下 当然后面跟着其他数据字节 但在本例中
  • DynamoDB Stream 按顺序处理

    假设我有以下包含条目的 DynamoDB 表 A B C 列 a1 b1 c1 条目 1 a1 b2 c2 条目 2 A是键 分区键 B是排序键 唯一 C是属性 我想确保 DynamoDB 流可以保证 B 的按序处理 如果按此顺序进行更改
  • std::move_if_no except 仍然移动抛出仅移动类型的基本原理?

    move if noexcept http en cppreference com w cpp utility move if noexcept will 返回一个右值 促进移动 如果移动构造函数是noexcept 或者如果没有复制构造函数
  • Android Unity c#:写入保存游戏数据时发生 UnauthorizedAccessException

    我正在 Android 中调试 Unity 游戏 一切都在 Unity 编辑器中运行 在 Android 上保存当前游戏数据时 我收到 UnauthorizedAccessException 我正在写入持久数据路径 所以我不明白为什么访问被
  • Android 中在 jni 中运行的原生 C 代码与在 shell 中运行的区别

    我有一个原生 C Android 应用程序 首先 我将本机 C 代码构建到共享库中 jni 将使用该库 该库使用一些内核可加载模块 ko 一些已经加载 一些必须通过 insmod 命令加载 我还构建了一个使用该库的可执行文件 并且它可以通过
  • 延迟对服务器、JavaScript 的批量 GET 请求

    背景 我正在向服务器发出一批 HTTP GET 请求 我需要限制它们以避免杀死可怜的服务器 出于演示目的 这将是 GET 方法 This function simulates a real HTTP GET request that alw
  • 简单的C程序不打印输出[重复]

    这个问题在这里已经有答案了 我有一个简单的c程序 include
  • Hibernate 儿童计数标准

    我有父母 孩子关系 newsItem 1 评论 如何使用一个 Criteria 查询选择新闻项目列表以及每个新闻项目的评论计数 我想做这样的事情 select news item count comment id from news ite
  • 在 user.csv 上循环,然后在 jmeter 中循环 data.csv

    我需要做这样的事情 foreach user in a users csv foreach data in data csv send http request 我看过了这个帖子 https stackoverflow com questi
  • 将历史时间转换为 GMT

    我需要将格式为 2011061411322100 的一些字符串时间转换为 GMT 我的第一次尝试如下 但问题是 时间来自另一台电脑 而且是历史时间 所以我没有实时获取时间 所以我不能简单地从我的代码运行的盒子上的当地时间获取 GMT 问题是
  • 如何隐藏/取消隐藏代码镜像

    我想完全隐藏 取消隐藏代码镜像实例 是否有任何预定义的方法可以做到这一点 或者我是否需要以某种方式选择 div 并将其隐藏 根据文档 CodeMirror 的主编辑器对象有一个方法可以返回主包装 DOM 元素 cm getWrapperEl
  • php DateTime createFromFormat 功能

    您好 我似乎无法让日期时间方法按预期工作 我可能做错了什么 Passes OK dateTime DateTime createFromFormat d m Y 12 12 2012 var dump dateTime should fai
  • NUnit 中的执行顺序是什么?

    我一直在对测试驱动开发进行一些研究 发现它非常酷 我遇到的一件事是 当您编写测试时 设置和测试方法 Setup 和 Test 有一个执行顺序 测试时是否可以使用其他方法 如果可以 它们的执行顺序是什么 例如处置或其他什么 我看到了测试夹具的
  • 是否可以指示浏览器首先绘制页面的哪些元素?

    我想知道是否有任何方法可以控制浏览器绘制 例如我想首先加载页面顶部的元素 以便用户可以立即看到内容 页面底部的元素可以最后加载 因为用户在向下滚动之前不会看到它们 我正在寻求优化我的网站 该网站目前的加载时间为 6 秒 我希望将其降至 1
  • Redis 的内存使用量比数据多 10 倍

    我正在尝试在 redis 中存储单词列表 表演很棒 我的方法是制作一个名为 words 的集合 并通过 sadd 添加每个新单词 当添加一个 15 9 MB 且包含大约 100 万个单词的文件时 redis 服务器进程会消耗 160 MB