memory - 获取内存中的redis key-value大小

标签 memory redis redis-cli

我试图在 Redis 中获取键值对的大小,或者只是一个键,或者只是一个值。

使用 debug object key 命令返回键值的序列化大小(如果要写入磁盘)而不是它在内存中使用的实际字节数。

这可以通过检查源代码来确认(基于此 Redis: Show database size/size for keys )

https://github.com/antirez/redis/blob/4082c38a60eedd524c78ef48c1b241105f4ddc50/src/debug.c#L337-L343

https://github.com/antirez/redis/blob/4082c38a60eedd524c78ef48c1b241105f4ddc50/src/rdb.c#L663-L671

查看源代码:

/* Save a string object as [len][data] on disk. If the object is a string
 * representation of an integer value we try to save it in a special form */
ssize_t rdbSaveRawString(rio *rdb, unsigned char *s, size_t len) {
  int enclen;
  ssize_t n, nwritten = 0;

  /* Try integer encoding */
  if (len <= 11) {
    unsigned char buf[5];
    if ((enclen = rdbTryIntegerEncoding((char*)s,len,buf)) > 0) {
      if (rdbWriteRaw(rdb,buf,enclen) == -1) return -1;
      return enclen;
    }
  }

  /* Try LZF compression - under 20 bytes it's unable to compress even
   * aaaaaaaaaaaaaaaaaa so skip it */
  if (server.rdb_compression && len > 20) {
    n = rdbSaveLzfStringObject(rdb,s,len);
    if (n == -1) return -1;
    if (n > 0) return n;
    /* Return value of 0 means data can't be compressed, save the old way */
  }

  /* Store verbatim */
  if ((n = rdbSaveLen(rdb,len)) == -1) return -1;
  nwritten += n;
  if (len > 0) {
    if (rdbWriteRaw(rdb,s,len) == -1) return -1;
    nwritten += len;
  }
  return nwritten;
}

并通过redis-cli确认:

127.0.0.1:6379> set a aaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379> debug object a
Value at:0x7f985822f168 refcount:1 encoding:embstr serializedlength:20 lru:11611136 lru_seconds_idle:2
127.0.0.1:6379> set a aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379> debug object a
Value at:0x7f985827c428 refcount:1 encoding:embstr serializedlength:12 lru:11611147 lru_seconds_idle:1

所有不同的 CLI 工具都报告对象的序列化大小,而不是有趣且重要的内存大小。

最佳答案

从 Redis v4 开始,MEMORY USAGE命令在猜测键的足迹及其值方面做得更好。

关于memory - 获取内存中的redis key-value大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388547/

相关文章:

memory - 内存映射配置存储在哪里?

redis - 如何知道 Redis 中的键是否过期?

heroku - 我可以使用带有连接 URL 的 redis-cli 吗?

redis - 如何设置Redis在过滤key时不区分大小写?

docker - 从宿主机读取redis容器的数据

linux - centOS 和 Virtualbox 中的内存增加

java - 使用 Java Sieve of Eratosthenes 算法大数时出现奇怪的数值错误?

go - 在 Go 中分配了大量内存。怎么修?

node.js redis异步调用

python - 使用 pub sub 持久消息和键值存储替代 Redis?