Avatar
1
hungw7 Beginner
hungw7 Beginner
Store data in redis/memcache
Giả sử domain Product trong SQL có reference tới table Seller và giờ em đang muốn sử dụng cache để lưu 1 chi tiết Product lại, nếu flatten 1 product ra như 1 json document thì sẽ lợi khi về dung lượng lưu trữ và tốc độ get tuy nhiên em đang không biết invalidate cache như thế nào khi Seller bị update, không biết có cách nào để tổ chức cache hợp lí cho việc invalidate và get data không ạ.
  • Answer
Remain: 5
2 Answers
Avatar
monkey Beginner
monkey Beginner
  1. Thường khi sử dụng cache là em sẽ lưu vào cache, đọc từ cache và đồng bộ dữ liệu từ cache vào db hơn, nên anh nghĩ em có thể update lại service của em theo hướng này.

  1. Tuy nhiên nêu service của em đã chạy lâu rồi và không dễ để thay đổi, em có thể tạo 1 job liên tục đọc vào db xem có update gì không thì đồng bộ lên cache, đó cũng là 1 cách không tệ.

Không biết anh có đang hiểu đúng câu hỏi của em không nhỉ?

  • 0
  • Reply
Có vẻ em diễn đạt hơi sai :^), case của em ở đây là để lưu được 1 record trong cache thì cần phải join 2 table A và B trong Sql lại (tạm gọi C = A + B, giống như ảnh dưới), và cách cấu trúc cache C như thế nào để khi B được update trong Sql thì phải invalidate cache được những record C trong cache ạ.

 –  hungw7 1677464301000
Avatar
monkey Beginner
monkey Beginner
Anh sẽ gọi:

A. Là Author

B. Là Book

C. Là BookAndAuthor.

  1. Như vậy thì anh đang hình dùng là em sẽ lưu 1 map là: authorAndBookMap[{authorId, bookId}, C]

  1. Xóa A thì sẽ cần xóa hết các key có liên quan đến A từ bookAndAuthorMap, sẽ có 2 cách:

a. Lưu trong redis 1 map bookIdsByAuthorId[authorId, List[bookId]] và khi xóa A thì chỉ cần lấy list bookId từ map ra xóa là được: Cách này thì có ưu điểm là list mà ít thì ok, nhưng nhược điểm là khi list mà nhiều thì sẽ chậm và tốn bộ nhớ.

b. Khi có update thì truy vấn từ DB các bookId có liên quan đến A và gọi xóa khỏi cache, sẽ lấy từ từ ví dụ 100 bản ghi ra xóa sẽ đỡ tốn bộ nhớ. Nhược điểm là việc xóa có thể bị chậm. Nhưng anh nghĩ cách này phù hợp hơn vì nó áp dụng được cho mọi bài toán từ nhỏ đến lớn.

  • 0
  • Reply
Thế so với cách mình lưu Book và Author ở 2 db (2 context) khác nhau trong redis rồi join lại trên memory (sẽ tốn 2 lần get) sẽ như nào nhỉ anh,  –  hungw7 1677473424000
Vẫn là bài toán dữ liệu lớn hay nhỏ thôi em ạ, nhỏ thì ok, còn lớn thì không ổn, còn liên quan đến nghiệp vụ xử lý phân trang nữa em ạ. Nhìn chung bài toán của em anh dùng DB đánh index là xử lý ổn rồi, anh sẽ không dùng cache vậy là đơn giản nhất.  –  tvd12 1677482779000