sách gpt4 ăn đã đi

Redis Series 18: Chiến lược xóa dữ liệu đã hết hạn

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-08-11 22:31:45 30 4
mua khóa gpt4 giày nike

Redis Series 1: Hiểu biết sâu sắc về bản chất của hiệu suất cao Redis Redis Series 2: Tính bền vững của dữ liệu cải thiện tính khả dụng Redis Series 3: Kiến trúc chủ-nô có tính sẵn sàng cao Redis Series 4: Tính sẵn sàng cao Sentinel (chế độ Sentinel) Redis Series 5 : Phân tích chuyên sâu về Cụm cụm Mô hình theo đuổi hiệu suất cao nhất: mô hình đa luồng của Redis 6.0 theo đuổi hiệu suất cao nhất: cuộc cách mạng do bộ nhớ đệm máy khách mang lại Redis Series 8: Bitmap hiện thực hóa hàng tỷ phép tính dữ liệu Redis Series 9: Geo Loại hỗ trợ tính toán vị trí bản đồ cấp tỷ Redis Series 10: HyperLogLog triển khai thống kê cơ sở dữ liệu khổng lồ Redis Series 11: Chiến lược loại bỏ bộ nhớ Redis Series 12: Cơ chế giao dịch Redis Redis Series 13: Triển khai khóa phân tán Redis Series 14: Sử dụng Danh sách để triển khai hàng đợi tin nhắn Redis Series 15: Sử dụng Stream để triển khai hàng đợi tin nhắn Redis Series 16: Cùng tìm hiểu về bộ lọc Bloom (Nguyên tắc) Redis Series 17: Cùng tìm hiểu về bộ lọc Bloom (Thực hành).

1 Giới thiệu

Từ các chương trước, chúng ta đã biết rằng Redis là cơ sở dữ liệu loại kv. Tất cả dữ liệu của chúng ta được lưu trữ trong bộ nhớ, nhưng bộ nhớ có giới hạn kích thước và không thể tăng nó lên không giới hạn. Nếu bạn muốn dọn sạch dữ liệu không cần thiết, có một cách là xóa trực tiếp, cách khác chúng ta đã thảo luận chi tiết ở chương trước; cách còn lại là đặt thời gian hết hạn, hệ thống Redis sẽ xóa nó. chính nó. Điều cần lưu ý ở đây là cache không bị xóa ngay sau khi hết hạn. Vậy Redis xóa dữ liệu hết hạn như thế nào? Chủ yếu thông qua hai cách.

  • Xóa lười biếng
  • Sử dụng các tác vụ đã lên lịch để thường xuyên chọn một phần dữ liệu cần xóa

2 Lệnh hết hạn bộ đệm Redis

Chúng tôi sử dụng lệnh sau để đặt thời gian hết hạn cho bộ đệm của khóa được chỉ định. Nếu không đặt thời gian hết hạn, khóa sẽ luôn tồn tại cho đến khi chúng tôi xóa nó một cách rõ ràng bằng lệnh Del.

                        
                          # Lệnh hết thời gian lưu trữ, tham khảo các giây khóa EXPIRE sau [NX | XX GT | 

                        
                      

Bắt đầu từ Redis 7.0, EXPIRE đã thêm các tùy chọn NX, XX, GT và LT, đại diện cho các tùy chọn sau:

  • NX: Chỉ đặt thời gian hết hạn nếu Key chưa hết hạn
  • XX: Chỉ đặt thời gian hết hạn khi Key đã hết hạn
  • GT: Chỉ đặt thời gian hết hạn nếu thời gian hết hạn mới lớn hơn thời gian hết hạn hiện tại
  • LT: Chỉ đặt thời gian hết hạn nếu thời gian hết hạn mới nhỏ hơn thời gian hết hạn hiện tại

Trong số đó, các tùy chọn GT, LT và NX loại trừ lẫn nhau. Sau đây là trường hợp thử nghiệm chính thức:

                        
                          redis> ĐẶT mykey "Xin chào" "OK" redis> HẾT HẠN mykey 10 (số nguyên) 1 redis> TTL mykey (số nguyên) 10 redis> ĐẶT mykey "Xin chào thế giới" "OK" redis> TTL mykey (số nguyên) -1 redis> HẾT HẠN mykey 10 XX (số nguyên) 0 redis> TTL mykey (số nguyên) -1 redis> HẾT HẠN mykey 10 NX (số nguyên) 1 redis> TTL mykey (số nguyên) 10


                        
                      

3 Hai cách xóa dữ liệu hết hạn

Như chúng tôi đã nói trước đây, Redis chủ yếu xóa dữ liệu đã hết hạn theo hai cách sau:

  • Xóa lười biếng
  • Sử dụng các tác vụ đã lên lịch để thường xuyên chọn một phần dữ liệu cần xóa

3.1 Xóa lười biếng

Xóa lười tương đối đơn giản. Khi máy khách yêu cầu truy vấn khóa của chúng tôi, trước tiên nó sẽ kiểm tra khóa. Nếu nó chưa hết hạn, dữ liệu đã lưu trong bộ nhớ đệm sẽ được trả về. Nếu hết hạn, bộ nhớ đệm sẽ bị xóa và dữ liệu sẽ được lấy từ cơ sở dữ liệu. lại. Bằng cách này, chúng tôi chủ động xóa dữ liệu đã hết hạn cho khách hàng truy cập yêu cầu. Nếu khách hàng không bao giờ yêu cầu, bộ đệm đã hết hạn có thể không được giải phóng trong một thời gian dài.

Phương thức hết hạn IfNeeded trong mã nguồn Redis src/db.c triển khai logic xóa lười ở trên. Chúng ta hãy xem:

                        
                          int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) { // Không thể xóa key, hãy trả về 0 if (!keyIsExpired(db,key)) return 0; /* Nếu chúng ta đang chạy trong bối cảnh của một slave, thay vì * xóa khóa đã hết hạn khỏi cơ sở dữ liệu, chúng ta trả về ASAP: * thời gian hết hạn của khóa slave được kiểm soát bởi master, master sẽ * gửi cho chúng ta các hoạt động DEL tổng hợp cho các khóa đã hết hạn. * * Chúng ta vẫn cố gắng trả về thông tin đúng cho trình gọi, * nghĩa là, 0 nếu chúng ta nghĩ rằng khóa vẫn hợp lệ, 1 nếu * chúng ta nghĩ rằng khóa đã hết hạn tại thời điểm này. */ if (server.masterhost != NULL) { if (server.current_client == server.master) return 0; if (!force_delete_expired) return 1; } /* Nếu máy khách bị tạm dừng, chúng tôi giữ nguyên tập dữ liệu hiện tại, * nhưng trả về cho máy khách những gì chúng tôi tin là trạng thái đúng. Thông thường, * khi kết thúc thời gian tạm dừng, chúng tôi sẽ hết hạn khóa HOẶC chúng tôi sẽ * chuyển đổi dự phòng và máy chủ chính mới sẽ gửi cho chúng tôi thông báo hết hạn. */ if (checkClientPauseTimeoutAndReturnIfPaused()) return 1; /* Xóa khóa */ deleteExpiredKeyAndPropagate(db,key); return 1; }

                        
                      

3.2 Xóa thường xuyên

Như đã đề cập trước đó, việc xóa bộ đệm đã hết hạn chỉ bằng quyền truy cập của máy khách là chưa đủ, vì một số khóa đã hết hạn nhưng máy khách chưa yêu cầu chúng, do đó bộ đệm đã hết hạn có thể không được giải phóng trong một thời gian dài hoặc thậm chí không bao giờ. Do đó, ngoài việc xóa lười, Redis còn có thể xóa dữ liệu đã hết hạn thông qua các tác vụ đã lên lịch. Tần suất bắt đầu tác vụ theo lịch trình được định cấu hình bởi hz trong tệp cấu hình redis.conf.

                        
                          # nghĩa là chạy hz 10 10 lần trong 1 giây

                        
                      

Theo mặc định, Redis chạy 10 lần cứ sau 1 giây, tức là cứ 100 ms một lần. Mỗi lần, một số khóa có thời gian hết hạn được chọn ngẫu nhiên (lưu ý ở đây là chúng tôi không kiểm tra tất cả các khóa có thời gian hết hạn mà chọn ngẫu nhiên một số) để kiểm tra xem Đã hết hạn chưa, nếu phát hiện hết hạn thì xóa trực tiếp. Quy trình cụ thể của nhiệm vụ theo lịch trình này như sau:

  1. Lên lịch cho phương thức serverCron để thực hiện dọn dẹp. Tần suất thực thi dựa trên giá trị được cấu hình bởi hz trong redis.conf.
  2. Khi thực hiện dọn dẹp, thay vì quét tất cả các khóa, nó sẽ quét tất cả các khóa có thời gian hết hạn được đặt (redisDb.expires)
  3. Nếu bạn tìm nạp tất cả các khóa đã hết hạn mỗi lần, sẽ rất chậm nếu có nhiều khóa đã hết hạn, do đó không thể tìm nạp tất cả các khóa cùng một lúc.
  4. Quét các khóa theo kích thước của nhóm băm cho đến khi quét được 20 khóa (có thể định cấu hình). Nếu nhóm đầu tiên có 15 khóa và không đáp ứng được 20 khóa, hãy tiếp tục quét nhóm thứ hai có 20 khóa. Vì nó được quét theo kích thước của nhóm băm nên tất cả các nhóm thứ hai sẽ được quét Tổng cộng là 35. phím đã được quét
  5. Tìm key đã hết hạn trong số các key đã quét và xóa nó
  6. Sau khi xóa hơn 25% số khóa đã hết hạn, hãy tiếp tục thực hiện bước 4 và 5.

hình ảnh

Những điểm khác cần lưu ý:

  • Tại sao không quét tất cả các khóa để xóa các phần tử bộ đệm đã hết hạn: Bản thân Redis là một bộ đệm. Nếu một số lượng lớn khóa được kiểm tra mỗi lần, mức sử dụng CPU và bộ nhớ sẽ cực kỳ cao.
  • Đồng bộ hóa xóa trong chế độ sharding: bất kể xóa theo lịch trình hay xóa lười. Master sẽ tạo các bản ghi lệnh xóa cho các nút AOF và Slave.

4 Tóm tắt

Cho dù đó là xóa lười hay xóa thường xuyên, có thể có vô số lần xóa: không thể xóa hoàn toàn. Ví dụ: hơn 25% khóa hết hạn sẽ bị xóa mỗi lần và các khóa này sẽ không bao giờ được khách hàng truy cập nữa. Nếu tình trạng này tiếp diễn trong thời gian dài có thể dẫn đến cạn kiệt bộ nhớ. Để tránh tình trạng xấu này, Redis sẽ có cơ chế loại bỏ bộ nhớ hoàn chỉnh để bảo vệ nó. Trong phần tiếp theo, chúng tôi sẽ tập trung giới thiệu cơ chế loại bỏ bộ nhớ.

Cuối cùng, bài viết về Redis Series 18: Expired Data Deletion Strategy kết thúc tại đây. Nếu bạn muốn biết thêm về Redis Series 18: Expired Data Deletion Strategy, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. blog trong tương lai! .

30 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress