Điểm của nhiều cơ sở dữ liệu Redis là gì?


159

Vì vậy, tôi đã đến một nơi mà tôi muốn phân đoạn dữ liệu tôi lưu trữ trong các cơ sở dữ liệu riêng biệt vì đôi khi tôi cần sử dụng lệnh phím trên một loại dữ liệu cụ thể và muốn tách dữ liệu đó để nhanh hơn .

Nếu tôi phân đoạn thành nhiều cơ sở dữ liệu, mọi thứ vẫn chỉ là một luồng và tôi vẫn chỉ được sử dụng một lõi. Nếu tôi chỉ khởi chạy một phiên bản khác của Redis trên cùng một hộp, tôi sẽ sử dụng một lõi bổ sung. Trên hết, tôi không thể đặt tên cho cơ sở dữ liệu Redis hoặc cung cấp cho họ bất kỳ loại định danh logic nào hơn. Vì vậy, với tất cả những gì đã nói, tại sao / khi nào tôi muốn sử dụng nhiều cơ sở dữ liệu Redis thay vì chỉ tạo ra một phiên bản Redis bổ sung cho mỗi cơ sở dữ liệu bổ sung mà tôi muốn? Và liên quan, tại sao Redis không cố gắng sử dụng một lõi bổ sung cho mỗi cơ sở dữ liệu bổ sung mà tôi thêm? Lợi thế của việc đơn luồng trên cơ sở dữ liệu là gì?


trong ứng dụng Node.js của bạn, hãy làm điều này ---> module.exports = {"1": "tên của bạn cho redis db one", "2": "tên của bạn cho redis db hai", "3": "của bạn tên cho redis db ba "}, v.v., hoặc chuyển đổi các khóa và giá trị, bất cứ điều gì bạn cần
Alexander Mills

1
Trong Redis 2.8.0 trở lên, bạn nên sử dụng SCAN thay vì KEYS, vì nó lặp lại một số lượng nhỏ các phần tử tại một thời điểm (do đó không chặn máy chủ trong thời gian dài).
TryHarder

Câu trả lời:


85

Về nguyên tắc, các cơ sở dữ liệu Redis trên cùng một thể hiện không khác gì các lược đồ trong các trường hợp cơ sở dữ liệu RDBMS.

Vì vậy, với tất cả những gì đã nói, tại sao / khi nào tôi muốn sử dụng nhiều cơ sở dữ liệu Redis thay vì chỉ tạo ra một phiên bản Redis bổ sung cho mỗi cơ sở dữ liệu bổ sung mà tôi muốn?

Có một lợi thế rõ ràng của việc sử dụng cơ sở dữ liệu redis trong cùng một ví dụ redis và đó là quản lý. Nếu bạn tạo ra một phiên bản riêng cho mỗi ứng dụng và giả sử bạn có 3 ứng dụng, đó là 3 trường hợp riêng biệt, mỗi trường hợp có thể sẽ cần một nô lệ cho HA trong sản xuất, vì vậy đó là 6 trường hợp. Từ quan điểm quản lý, điều này trở nên lộn xộn rất nhanh vì bạn cần giám sát tất cả chúng, thực hiện nâng cấp / vá lỗi, v.v. Nếu bạn không có kế hoạch quá tải redis với I / O cao, một trường hợp đơn lẻ với nô lệ sẽ đơn giản hơn và dễ quản lý hơn với điều kiện nó đáp ứng SLA của bạn.


25
Nhiều trường hợp Redis luôn luôn là cách để đi. Giai đoạn = Stage. Chạy các truy vấn song song cho các dữ liệu khác nhau. Nếu đường ống CICD của bạn không tạo các cụm bộ đệm cho bạn, hãy sửa nó, thay vì ..... Bạn nhận được điểm
Cmag

3
Điều này không giải quyết các điểm OP: (1) tại sao Redis không cố gắng sử dụng một lõi bổ sung cho mỗi cơ sở dữ liệu bổ sung? (2) Lợi thế của việc phân luồng đơn trên cơ sở dữ liệu là gì?
ives

93

Bạn không muốn sử dụng nhiều cơ sở dữ liệu trong một trường hợp redis duy nhất. Nó không được dùng nữa và, như bạn đã lưu ý, nhiều trường hợp cho phép bạn tận dụng nhiều lõi. Nếu bạn sử dụng lựa chọn cơ sở dữ liệu, bạn sẽ phải cấu trúc lại khi nâng cấp. Theo dõi và quản lý nhiều trường hợp không khó cũng không đau.

Thật vậy, bạn sẽ có được số liệu tốt hơn nhiều trên mỗi db bằng cách phân tách dựa trên ví dụ. Mỗi trường hợp sẽ có số liệu thống kê phản ánh phân đoạn dữ liệu đó, có thể cho phép điều chỉnh tốt hơn và giám sát chính xác và nhạy bén hơn. Sử dụng một phiên bản gần đây và tách dữ liệu của bạn theo ví dụ.

Như Jonaton đã nói, đừng sử dụng lệnh phím. Bạn sẽ tìm thấy hiệu suất tốt hơn nhiều nếu bạn chỉ cần tạo một chỉ mục chính. Bất cứ khi nào thêm một khóa, thêm tên khóa vào một bộ. Lệnh key không hữu ích lắm khi bạn mở rộng quy mô vì sẽ mất thời gian đáng kể để quay lại.

Hãy để mẫu truy cập xác định cách cấu trúc dữ liệu của bạn thay vì lưu trữ theo cách bạn nghĩ là hoạt động và sau đó tìm cách truy cập và băm dữ liệu sau đó. Bạn sẽ thấy hiệu suất tốt hơn nhiều và thấy mã tiêu thụ dữ liệu thường sạch sẽ và đơn giản hơn nhiều.

Về luồng đơn, hãy xem xét rằng redis được thiết kế cho tốc độ và nguyên tử. Chắc chắn các hành động sửa đổi dữ liệu trong một db không cần phải đợi trên một db khác, nhưng nếu hành động đó đang lưu vào tệp kết xuất hoặc xử lý các giao dịch trên nô lệ thì sao? Tại thời điểm đó, bạn bắt đầu đi sâu vào lập trình đồng thời.

Bằng cách sử dụng nhiều trường hợp, bạn biến độ phức tạp đa luồng thành một hệ thống kiểu truyền thông điệp đơn giản hơn.


57
Sử dụng nhiều cơ sở dữ liệu bị phản đối? Bạn có thể cung cấp một tài liệu tham khảo cho tuyên bố đó xin vui lòng. Tôi biết rằng nhiều cơ sở dữ liệu không được hỗ trợ trong Redis Cluster nhưng không có bất kỳ lệnh đa khóa phức tạp nào và chúng không bị phản đối.
Ostergaard

27
Một số bằng chứng (mạnh) từ 'chủ sở hữu' Redis (theo Google Code) rằng "... cơ sở dữ liệu sẽ không bị phản đối ngay cả khi trước đây tôi đã tuyên bố rằng chúng sẽ như vậy."
Kenny Evitt

3
Bạn sẽ không thể sử dụng nhiều hơn một redis db trên redis-cluster. Bên cạnh đó, nhiều cơ sở dữ liệu sẽ vẫn còn một điều.
coredump

26
-1 cho tuyên bố không dùng nữa. Nhiều cơ sở dữ liệu có thể không được khuyến khích và không được hỗ trợ trong cụm redis, nhưng chúng không được phản đối.
AgDude

1
@ the-real-bill Làm thế nào bạn có thể "tạo một chỉ mục chính"?
Kees de Kooter

57

Ngay cả Salvatore Sanfilippo (người tạo ra Redis) cho rằng việc sử dụng nhiều DB trong Redis là một ý tưởng tồi. Xem bình luận của anh ấy ở đây:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Tôi hiểu làm thế nào điều này có thể hữu ích, nhưng thật không may, tôi coi Redis nhiều lỗi cơ sở dữ liệu quyết định tồi tệ nhất của tôi trong thiết kế Redis ... mà không có bất kỳ loại lợi ích thực sự nào, nó làm cho nội bộ phức tạp hơn rất nhiều. Thực tế là cơ sở dữ liệu không mở rộng tốt vì nhiều lý do, như hết hạn hoạt động của khóa và VM. Nếu lựa chọn DB có thể được thực hiện bằng một chuỗi, tôi có thể thấy tính năng này đang được sử dụng làm lớp từ điển O (1) có thể mở rộng, thay vào đó thì không.

Với số DB, với mặc định là một vài DB, chúng tôi truyền đạt tốt hơn tính năng này là gì và tôi có thể sử dụng như thế nào. Tôi hy vọng rằng đến một lúc nào đó chúng ta có thể bỏ đi nhiều hỗ trợ DB, nhưng tôi nghĩ có lẽ đã quá muộn vì có một số người dựa vào tính năng này cho công việc của họ.


4
Đợi đã, vậy sử dụng lựa chọn DB có thực sự kém hiệu quả hơn so với chỉ sử dụng tiền tố? Đó có phải là những gì câu này ở đây có nghĩa là (ai đó có thể vui lòng làm rõ)? "Nếu lựa chọn DB có thể được thực hiện bằng một chuỗi, tôi có thể thấy tính năng này đang được sử dụng làm lớp từ điển O (1) có thể mở rộng, thay vào đó thì không."
dvtan

8
  1. Tôi thực sự không biết bất kỳ lợi ích nào của việc có nhiều cơ sở dữ liệu trong một trường hợp. Tôi đoán nó hữu ích nếu nhiều dịch vụ sử dụng cùng một máy chủ cơ sở dữ liệu, vì vậy bạn có thể tránh được các xung đột chính.

  2. Tôi không khuyên bạn nên xây dựng xung quanh bằng cách sử dụng KEYSlệnh, vì đó là O (n) và điều đó không có quy mô tốt. Bạn đang sử dụng nó để làm gì mà bạn có thể thực hiện theo cách khác? Có lẽ redis không phải là kết hợp tốt nhất cho bạn nếu chức năng như KEYSlà quan trọng.

  3. Tôi nghĩ rằng họ đề cập đến lợi ích của một máy chủ luồng đơn trong Câu hỏi thường gặp của họ, nhưng điều chính yếu là sự đơn giản - bạn không phải bận tâm đến vấn đề đồng thời theo bất kỳ cách thực tế nào. Mọi hành động đều bị chặn, vì vậy không có hai thứ có thể thay đổi cơ sở dữ liệu cùng một lúc. Lý tưởng nhất là bạn sẽ có một (hoặc nhiều) phiên bản cho mỗi lõi của mỗi máy chủ và sử dụng thuật toán băm nhất quán (hoặc proxy) để phân chia các khóa giữa chúng. Tất nhiên, bạn sẽ mất một số chức năng - đường ống sẽ chỉ hoạt động cho mọi thứ trên cùng một máy chủ, sắp xếp trở nên khó khăn hơn, v.v.


Đáp lại 2: Tôi chỉ sử dụng lệnh phím khi tôi cần tất cả các phím. Tôi sử dụng nó giống như cách người ta sẽ sử dụng hgetall. Cả hai đều là O (n). Khóa là xấu nếu bạn cần tìm kiếm thông qua một bộ khóa lớn cho một số regex, nhưng nó hoàn toàn ổn nếu bạn cần thực hiện một số thao tác trên tất cả các khóa trong một số db. Đáp lại 3: Tôi hiểu lợi ích của việc phân luồng đơn trên một cơ sở dữ liệu. Tôi không hiểu nó trên nhiều cơ sở dữ liệu vì một hành động trên một cơ sở dữ liệu không bao giờ chặn hành động trên cơ sở dữ liệu khác AFAIK.
Eli

3

Tôi đang sử dụng redis để triển khai danh sách đen các địa chỉ email và tôi có các giá trị TTL khác nhau cho các cấp độ khác nhau của danh sách đen, do đó, có các DB khác nhau trên cùng một ví dụ giúp tôi rất nhiều.


1
Bây giờ chúng tôi đang phải đối mặt với cùng một vấn đề - chúng tôi muốn xác định chính sách LRU khác nhau cho các phần khác nhau của dữ liệu của chúng tôi. bạn có thể chia sẻ cách bạn thực hiện điều này?
dùng2717436

@ user2717436 Tôi không chắc những gì tôi làm có liên quan đến bạn hay không, nhưng tôi sử dụng các cơ sở dữ liệu khác nhau như các bộ khác nhau, luôn đặt TTL của các phím khi tôi chèn chúng. giống như có danh sách đen A trên redis.get (1) và bất cứ khi nào tôi đặt khóa ở đó, tôi đặt hết hạn là 5000. và có danh sách đen B trên redis.get (2) và bất cứ khi nào tôi đặt khóa ở đó, tôi đặt hết hạn đến 10000
kommradHomer

2

Cơ sở dữ liệu Redis có thể được sử dụng trong các trường hợp hiếm hoi triển khai phiên bản mới của ứng dụng, trong đó phiên bản mới yêu cầu làm việc với các thực thể khác nhau.


1

Sử dụng nhiều cơ sở dữ liệu trong một trường hợp có thể hữu ích trong trường hợp sau:

Các bản sao khác nhau của cùng một cơ sở dữ liệu có thể được sử dụng để sản xuất, phát triển hoặc thử nghiệm sử dụng dữ liệu thời gian thực. Mọi người có thể sử dụng bản sao để sao chép một cá thể redis để đạt được mục đích tương tự. Tuy nhiên, cách tiếp cận trước đây dễ dàng hơn cho các chương trình đang chạy hiện tại chỉ cần chọn đúng cơ sở dữ liệu để chuyển sang chế độ dự định.


1

Tôi biết câu hỏi này đã cũ, nhưng có một lý do khác khiến nhiều cơ sở dữ liệu có thể hữu ích.

Nếu bạn sử dụng "đám mây Redis" từ nhà cung cấp đám mây yêu thích của mình, bạn có thể có kích thước bộ nhớ tối thiểu và sẽ trả cho những gì bạn phân bổ. Tuy nhiên, nếu tập dữ liệu của bạn nhỏ hơn thế, thì bạn sẽ lãng phí một chút phân bổ và vì vậy sẽ lãng phí một chút tiền.

Sử dụng cơ sở dữ liệu, bạn có thể sử dụng cùng một ví dụ Redis đám mây để cung cấp dịch vụ cho (giả sử) dev, UAT và sản xuất, hoặc nhiều phiên bản của ứng dụng của bạn, hoặc bất cứ điều gì khác - do đó sử dụng nhiều bộ nhớ được phân bổ hơn và do đó sẽ tốn kém hơn một chút - có hiệu lực.

Một trường hợp sử dụng mà tôi đang xem có một số trường hợp ứng dụng sử dụng 200-300K mỗi ứng dụng, nhưng phân bổ tối thiểu cho nhà cung cấp đám mây của tôi là 1M. Chúng tôi có thể hợp nhất 10 trường hợp trên một Redis duy nhất mà không thực sự tạo ra bất kỳ giới hạn nào, và do đó tiết kiệm khoảng 90% chi phí lưu trữ Redis. Tôi đánh giá cao có những hạn chế và vấn đề với phương pháp này, nhưng nghĩ rằng nó đáng được đề cập.

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.