90 GB данных в Redis — это дорого. Мы оптимизировали потребление памяти:
# Анализ потребления памяти по типам данных
redis-cli -a strong_password_here --bigkeys
# Biggest string: user:8834521:profile (4.2 KB)
# Biggest hash: campaign:1247:targeting (12.3 KB)
# Biggest set: segment:premium_users (890 KB, 145000 members)
# Biggest zset: leaderboard:daily (2.1 MB, 500000 members)
redis-cli -a strong_password_here MEMORY DOCTOR
# Sam, I have a few reports for you...
# Peak memory: 92.4 GB, current: 89.7 GB
# Keys with TTL: 67%, Keys without TTL: 33%
# Recommendation: review keys without TTL
Оптимизации, которые мы применили:
# 1. maxmemory-policy: allkeys-lfu вместо volatile-lru
# LFU (Least Frequently Used) лучше для кэша — сохраняет популярные ключи
maxmemory-policy allkeys-lfu
lfu-log-factor 10
lfu-decay-time 1
# 2. Сжатие строк — хранение JSON в MessagePack
import msgpack
import json
# JSON: 847 байт
profile_json = json.dumps(user_profile)
# MessagePack: 534 байта (экономия 37%)
profile_mp = msgpack.packb(user_profile)
rc.set(f"user:{uid}:profile", profile_mp, ex=3600)
# 3. Hash ziplist — для маленьких хэшей Redis использует компактный формат
hash-max-ziplist-entries 128
hash-max-ziplist-value 64
# 4. TTL на все ключи — нет бессмертных данных в кэше
rc.set(f"user:{uid}:freq", freq_data, ex=86400) # 24 часа
rc.set(f"campaign:{cid}:targeting", data, ex=3600) # 1 час
Persistence tuning — минимизируем влияние на латентность:
# RDB: только раз в час (или отключаем на мастерах)
save 3600 1
stop-writes-on-bgsave-error no
rdb-del-sync-files no
# AOF: everysec — компромисс между durability и performance
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite yes # не fsync при BGSAVE
aof-rewrite-incremental-fsync yes
# Lazy free: удаление больших ключей в фоне
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes
# I/O threads (Redis 7+) — параллельное чтение/запись
io-threads 4
io-threads-do-reads yes
Результат оптимизации: потребление памяти снизилось с 90 GB до 62 GB (31% экономия), латентность при BGSAVE исчезла (вместо 200-500 мс спайков).
Оставить комментарий