Mặc định nên xoá (invalidate), rồi để lượt đọc kế tiếp nạp lại từ DB.
Vì sao xoá an toàn hơn ghi đè: khi hai request cùng cập nhật một bản ghi, thứ tự ghi vào cache có thể ngược với thứ tự commit vào DB (request A commit sau nhưng set cache trước). Kết quả là cache giữ giá trị cũ vô thời hạn cho tới khi hết TTL. Nếu chỉ xoá, tình huống xấu nhất chỉ là thêm một lần đọc DB.
Thứ tự thao tác cũng quan trọng: ghi DB trước, xoá cache sau. Xoá trước rồi mới ghi DB tạo cửa sổ cho một request đọc giá trị cũ và nạp lại vào cache.
await db.query('update products set price = $1 where id = $2', [price, id])
await redis.del('shop:product:' + id) // delete, do not setKhi nào ghi đè hợp lý: dữ liệu chỉ có một nguồn ghi duy nhất (single writer), hoặc việc nạp lại quá đắt và key rất nóng — lúc đó ghi đè tránh được một nhịp miss dồn xuống DB.
Điểm cần nói thêm trong phỏng vấn: thao tác ghi DB và xoá cache không nằm chung transaction, nên del vẫn có thể thất bại (Redis timeout, process chết giữa chừng). Vì vậy TTL luôn phải có để làm lưới an toàn cuối cùng; hệ thống cần chính xác cao hơn thì phát tín hiệu invalidate từ CDC / binlog thay vì gọi thủ công trong code nghiệp vụ.