找到每个 Redis 数据库的内存消耗

5

问题

我的Python Redis客户端出现以下异常:

redis.exceptions.ResponseError:MISCONF Redis配置为保存RDB快照,但当前无法持久化到磁盘。可能修改数据集的命令已禁用。请检查Redis日志以获取有关错误的详细信息。

我已经检查了Redis服务器,似乎它已经内存不足:

free

             total       used       free     shared    buffers     cached
Mem:          3952       3656        295          0          1          9
-/+ buffers/cache:       3645        306
Swap:            0          0          0

top

top - 15:35:03 up 14:09,  1 user,  load average: 0.06, 0.17, 0.16
Tasks: 114 total,   2 running, 112 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.2 st
KiB Mem:   4046852 total,  3746772 used,   300080 free,     1668 buffers
KiB Swap:        0 total,        0 used,        0 free.    11364 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1102 root      20   0 3678836 3.485g    736 S   1.3 90.3  10:12.53 redis-server
 1332 ubuntu    20   0   41196   3096    972 S   0.0  0.1   0:00.12 zsh
  676 root      20   0   10216   2292      0 S   0.0  0.1   0:00.03 dhclient
  850 syslog    20   0  255836   2288    124 S   0.0  0.1   0:00.39 rsyslogd

我在单个Redis实例中使用几十个Redis数据库。每个数据库由赋予redis-cli的数字ID表示,例如:

$ redis-cli -n 80
127.0.0.1:6379[80]>

我该如何知道每个数据库消耗了多少内存,以及每个数据库中最大的键是什么?
2个回答

1
我如何知道每个数据库消耗了多少内存,以及每个数据库中最大的键是什么?
您无法获取每个数据库使用的内存。通过INFO命令,您只能获取Redis实例的总使用内存。Redis记录每次动态分配一些内存时新分配的内存大小。但是,它不会为每个数据库进行此类记录。此外,它没有任何有关最大键的记录。
通常,您应该使用maxmemorymaxmemory-policy(即在达到maxmemory时的驱逐策略)配置Redis实例。

0
你可以编写一些类似于这样的 sh 脚本(显示每个数据库中元素的计数):
#!/bin/bash
max_db=501

i=0

while  [ $i -lt $max_db ]
do
echo "db_nubner: $i"
redis-cli -n $i dbsize
i=$((i+1))
done

示例输出:

db_nubner: 0
(integer) 71
db_nubner: 1
(integer) 0
db_nubner: 2
(integer) 1
db_nubner: 3
(integer) 1
db_nubner: 4
(integer) 0
db_nubner: 5
(integer) 1
db_nubner: 6
(integer) 28
db_nubner: 7
(integer) 1

我知道我们可以使用一个具有大键的数据库,但在某些情况下,这个脚本仍然可以帮助到我们。


1
redis-cli info keyspace 显示这些信息。 - Gautam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接