У меня есть скрипт (golang), который перебирает все ключи в моем экземпляре redis, который вычисляет сумму MEMORY USAGE
для каждого ключа, но конечный результат намного ниже, чем я ожидал, исходя из INFO
command.
{"count":6535412, "msg":"Final statistics", "totalGiB":1.43}
Вот вывод команды INFO
.
# Memory
used_memory:3084991464
used_memory_human:2.87G
used_memory_rss:3190091776
used_memory_rss_human:2.97G
used_memory_peak:11348202280
used_memory_peak_human:10.57G
used_memory_peak_perc:27.18%
used_memory_overhead:468319456
used_memory_startup:4987200
used_memory_dataset:2616672008
used_memory_dataset_perc:84.96%
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:10852761600
maxmemory_human:10.11G
maxmemory_policy:volatile-lru
mem_fragmentation_ratio:1.03
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
. . .
# Keyspace
db0:keys=6540519,expires=2030054,avg_ttl=707634519
Как видите, скрипт вычислил сумму 1,43 ГБ для 6,5 миллионов ключей однако команда INFO
сообщает used_memory_dataset
при 2,4 ГБ. Я не уверен, что мне здесь не хватает.
См. Соответствующий код ниже:
func getMemoryUsage(key string) int64 {
var err error
bytesUsed := int64(0)
memCmd := redisClient.MemoryUsage(key, 0)
bytesUsed, err = memCmd.Result()
if err != nil {
log.Error("error msg")
return 0
}
return bytesUsed
}
func iterateThroughKeys() {
keyIterator := redisClient.Scan(0, "keyPrefix/*", batchSize).Iterator()
totalBytes := 0
count := 0
for keyIterator.Next() {
totalBytes += getMemoryUsage(keyIterator.Val())
count++
}
totalGiB := float64(totalBytes) / float64(1e9)
log.Info("Final statistics", "count", count, "totalGiB", totalGiB)
}