gpt4 book ai didi

c++ - Redis Set中一个成员占用多少字节

转载 作者:IT王子 更新时间:2023-10-29 06:00:36 26 4
gpt4 key购买 nike

我将 Redis 用作内存中的哈希集。我在一个Set中插入1M个8字节的key(二进制)后,发现Redis的USED_MEMORY有100M左右,也就是说单个成员占用100个字节?为什么?

或者我如何配置 Redis 以节省它的内存使用量。

最佳答案

首先,对于此类问题,您应该始终详细说明您的设置,因为内存布局取决于操作系统、内存分配器、平台和 Redis 版本。

在装有 Redis 2.4 的 64 位 Linux 机器上,一个 1M 项的 8 字节键占用 87 MB。

与键的大小相比,这似乎很多,但任何支持高效访问其项的动态数据结构都涉及开销。您的项目越小,开销就越大。

使用 Redis,大型集合是使用单独的链接哈希表实现的。每个条目由以下结构表示:

typedef struct dictEntry {
void *key;
void *val;
struct dictEntry *next;
} dictEntry;

因为内存分配器(jemalloc)不支持24字节类,所以使用了32字节。在这个结构体中,val被设置为NULL(这是一个集合),key指向一个对象,定义如下:

typedef struct redisObject {
unsigned type:4;
unsigned storage:2; /* REDIS_VM_MEMORY or REDIS_VM_SWAPPING */
unsigned encoding:4;
unsigned lru:22; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;

这个结构只需要 16 个字节。它指向 key 数据本身,由这个变长结构表示:

struct sdshdr {
int len;
int free;
char buf[];
};

key 占 8 个字节,外加一个 nul 字符,因此每个 key 的大小为 17 个字节。下一个分配类是 32 字节的 jemalloc,所以这个结构将占用 32 字节。

总而言之,每个项目将花费:32+16+32 = 80 字节。他们有1M。为哈希表本身添加一些空间(包含至少 1M 指向 dictEntry 结构的指针),您得到的结果非常接近我们可以在此平台上测量的 87 MB。

优化大型集合的内存占用并不是一件小事。当集合很小(默认少于 512 项)并且键实际上是整数时,Redis 会执行优化。查看更多信息here .

一种可能的优化是增加 set-max-intset-entries 参数,并将集合分成不同的部分。例如,可以对项目键进行散列以将项目分布在各种集合上。不只是 myset,您还有 myset:0、myset:1、myset:2 ... myset:n。要检查给定的项目是否是集合,将在键上计算哈希值以找到正确的 myset:X 条目,然后检查此特定条目。目的是将所有这些集合的大小保持在 set-max-intset-entries 参数以下,以便从内存优化中受益。当然,它使所有在集合上完成的操作变得更加复杂,所以它实际上是复杂性和内存占用之间的权衡。

关于c++ - Redis Set中一个成员占用多少字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com