Redis có duy trì dữ liệu không?


122

Tôi hiểu rằng Redis cung cấp tất cả dữ liệu từ bộ nhớ, nhưng nó vẫn tồn tại trong quá trình khởi động lại máy chủ để khi máy chủ khởi động lại, nó sẽ đọc vào bộ nhớ tất cả dữ liệu từ đĩa. Hay nó luôn là một cửa hàng trống chỉ để lưu trữ dữ liệu trong khi các ứng dụng đang chạy liên tục?


1
Tôi không chắc liệu tôi có hiểu câu hỏi của bạn một cách chính xác hay không. Bạn có thể lưu ảnh chụp nhanh vào đĩa và đọc từ tệp đó, nếu bạn không làm như vậy thì cơ sở dữ liệu redis của bạn sẽ trống khi khởi động lại.
Sefa

Câu trả lời:


82

Tôi khuyên bạn nên đọc về điều này trên http://redis.io/topics/persistence . Về cơ bản, bạn sẽ mất đi sự bền bỉ được đảm bảo khi bạn tăng hiệu suất bằng cách chỉ sử dụng lưu trữ trong bộ nhớ. Hãy tưởng tượng một tình huống trong đó bạn CHÈN vào bộ nhớ, nhưng trước khi nó được duy trì để đĩa mất điện. Sẽ mất dữ liệu.

Redis hỗ trợ cái gọi là "ảnh chụp nhanh". Điều này có nghĩa là nó sẽ thực hiện một bản sao hoàn chỉnh của những gì trong bộ nhớ tại một số thời điểm (ví dụ: mỗi giờ đầy đủ). Khi bạn bị mất điện giữa hai lần chụp nhanh, bạn sẽ mất dữ liệu từ thời điểm giữa lần chụp nhanh cuối cùng đến khi bị treo (không nhất thiết phải là mất điện ..). Redis giao dịch giữa an toàn dữ liệu với hiệu suất, giống như hầu hết các NoSQL-DB đều làm.

Hầu hết các cơ sở dữ liệu NoSQL tuân theo khái niệm nhân rộng giữa nhiều nút để giảm thiểu rủi ro này. Redis được coi là một bộ nhớ cache nhanh hơn thay vì một cơ sở dữ liệu đảm bảo tính nhất quán của dữ liệu. Do đó, các trường hợp sử dụng của nó thường khác với các trường hợp sử dụng của cơ sở dữ liệu thực: Ví dụ: bạn có thể lưu trữ các phiên, bộ đếm hiệu suất hoặc bất cứ thứ gì trong đó với hiệu suất chưa từng có và không bị mất mát thực sự trong trường hợp gặp sự cố. Nhưng xử lý đơn đặt hàng / lịch sử mua hàng, v.v. được coi là một công việc đối với cơ sở dữ liệu truyền thống.


1
Sẽ rất tuyệt nếu bạn có thể thêm hành vi bền bỉ mặc định. Giống như câu trả lời của @Leonid Beschastny.
yeya

40

Máy chủ Redis thỉnh thoảng lưu tất cả dữ liệu của nó vào ổ cứng, do đó cung cấp một số mức độ bền bỉ.

Nó lưu dữ liệu trong một trong các trường hợp sau:

  • tự động theo thời gian
  • khi bạn gọi lệnh theo cách thủ côngBGSAVE
  • khi redis ngừng hoạt động

Nhưng dữ liệu trong redis không thực sự ổn định, bởi vì:

  • sự cố của quy trình redis có nghĩa là mất tất cả các thay đổi kể từ lần lưu cuối cùng
  • BGSAVE hoạt động chỉ có thể được thực hiện nếu bạn có đủ RAM trống (số lượng RAM phụ bằng kích thước của redis DB)

NB: BGSAVE Yêu cầu RAM là một vấn đề thực sự, vì redis tiếp tục hoạt động cho đến khi không còn RAM để chạy nữa, nhưng nó ngừng lưu dữ liệu vào HDD sớm hơn nhiều (ở khoảng 50% RAM).

Để biết thêm thông tin, hãy xem Redis Persistence .


1
Vì câu trả lời này đã được viết nên nên tôi đã giới thiệu một mô hình duy trì thay thế được gọi là AOF cung cấp độ bền cao hơn đáng kể, nhưng có một số nhược điểm khác như sử dụng đĩa cao hơn và khởi động máy chủ chậm hơn.
Leonid Beschastny

15

Đó là một vấn đề về cấu hình. Bạn không thể có, một phần hoặc toàn bộ dữ liệu của mình tồn tại trên Redis. Quyết định tốt nhất sẽ do nhu cầu kỹ thuật và kinh doanh của dự án.

Theo tài liệu Redis về kiên trì bạn có thể thiết lập dụ của bạn để lưu dữ liệu vào đĩa theo từng thời điểm hoặc trên mỗi truy vấn, trong một nutshell. Họ cung cấp hai chiến lược / phương pháp AOF và RDB (đọc tài liệu để xem chi tiết về sau đó), bạn có thể sử dụng từng chiến lược / phương pháp một mình hoặc cùng nhau.

Nếu bạn muốn có một "SQL như sự bền bỉ", họ đã nói:

Dấu hiệu chung là bạn nên sử dụng cả hai phương pháp kiên trì nếu bạn muốn mức độ an toàn dữ liệu tương đương với những gì PostgreSQL có thể cung cấp cho bạn.


7

Câu trả lời thường là , tuy nhiên câu trả lời đầy đủ hơn thực sự phụ thuộc vào loại dữ liệu bạn đang cố gắng lưu trữ. Nói chung, câu trả lời ngắn gọn đầy đủ hơn là:

  • Redis không phải là lựa chọn phù hợp nhất để lưu trữ liên tục vì nó chủ yếu tập trung vào hiệu suất
  • Redis thực sự phù hợp hơn để lưu trữ trong bộ nhớ đáng tin cậy / lưu vào bộ nhớ cache của dữ liệu trạng thái hiện tại , đặc biệt để cho phép khả năng mở rộng bằng cách cung cấp nguồn trung tâm cho dữ liệu được sử dụng trên nhiều máy khách / máy chủ

Đã nói điều này, theo mặc định, Redis sẽ lưu trữ các ảnh chụp nhanh dữ liệu trong một khoảng thời gian định kỳ (dường như đây là 1 phút một lần, nhưng tôi chưa xác minh điều này - điều này được mô tả trong bài viết dưới đây, đây là phần giới thiệu cơ bản tốt):

http://qnimate.com/redis-permosystem-storage/


TL; DR

Từ các tài liệu chính thức :

  • Tính kiên trì RDB [mặc định] thực hiện các ảnh chụp nhanh tại thời điểm của tập dữ liệu của bạn trong các khoảng thời gian được chỉ định.
  • Tính duy trì AOF [cần được định cấu hình rõ ràng] ghi lại mọi hoạt động ghi mà máy chủ nhận được, thao tác này sẽ được phát lại khi khởi động máy chủ, tạo lại tập dữ liệu ban đầu.

Redis phải được định cấu hình rõ ràng để duy trì AOF, nếu điều này là bắt buộc và điều này sẽ dẫn đến hình phạt về hiệu suất cũng như nhật ký ngày càng tăng. Nó có thể đủ cho sự tồn tại tương đối đáng tin cậy của một lượng hạn chế của luồng dữ liệu.


5

Bạn có thể chọn hoàn toàn không liên tục. Hiệu suất tốt hơn nhưng tất cả dữ liệu sẽ mất khi Redis tắt.

Redis có hai cơ chế duy trì: RDB và AOF.RDB sử dụng bộ lập lịch chụp nhanh toàn cục và AOF ghi cập nhật vào tệp nhật ký chỉ apappend tương tự như MySql.

Bạn có thể sử dụng một trong số chúng hoặc cả hai. Khi Redis khởi động lại, nó sẽ xây dựng dữ liệu từ việc đọc tệp RDB hoặc tệp AOF.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.