lap-trinh redis til learn-from-mistake ruby-on-rails ruby - It costs 2 mins to read

#HọcTừSaiLầm - Mình vừa mắc phải một sai lầm mà mãi đến mấy tháng sau mới phát hiện ra. Vì vậy sai lầm này đã phải trả giá bằng tiền bạc (cứ scale server redis mà vẫn bị hết memory), Web App thì bị downtime vài lần, hơi muộn nhưng đã ngộ ra được.

Cụ thể là mình có dùng redis làm session_store của Rails:


Rails.application.config.session_store :redis_store, servers: ["#{ENV['REDIS_URL']}/1/sessions"], expires_in: 60.minutes

Nhưng khi đó lại mình quên mất vụ expires_in nên cuối cùng Rails set default là unlimited. Session Keys cứ thế lưu trữ dài hạn trên Redis, và cứ âm thầm ngốn hết Ram của Instance Redis, mình đã thử nâng lần lượt 1GB lên 2GB, rồi 4GB và 8GB nhưng sau một thời gian vẫn cứ ngốn sạch trơn Ram, trong khi kiểm tra số lượng Redis keys mà App dùng thì chỉ khoảng 100k. Cuối cùng, vô tình kiểm tra ở database 1 (Redis đánh số database, mặc định là 0) thì choáng, số lượng lên tới hơn 50 triệu keys đang dùng làm sessions.

Giải quyết nhanh bằng cách flushdb để xóa toàn bộ data từ một database cụ thể. (May là mình đã tách riêng sessions ra một database khác nên flushdb không thương tiếc, users đang đăng nhập sẽ bị đá ra khỏi hệ thống.)

redis-cli
SELECT dbnum
flushdb

Lệnh flushall để xóa toàn bộ databases của Redis


Học được từ sai lầm này:

An empty instance uses ~ 1MB of memory.

1 Million small Keys -> String Value pairs use ~ 100MB of memory.

1 Million Keys -> Hash value, representing an object with 5 fields, use ~ 200 MB of memory.