Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Giới thiệu về cấu trúc dữ liệu Redis:Bộ

Redis (Máy chủ Từ điển Từ xa) là một kho lưu trữ khóa-giá trị trong bộ nhớ vô cùng phổ biến, nó cũng cung cấp độ bền tùy chọn, phân vùng, sao chép và một loạt các tính năng khác. Đây hiện là cơ sở dữ liệu khóa-giá trị phổ biến nhất và được biết đến với tính đơn giản, bộ nhớ thấp và có đường cong học tập thấp. Redis còn được gọi là máy chủ cấu trúc dữ liệu và có hỗ trợ các hoạt động nguyên tử trên cấu trúc dữ liệu như băm, danh sách, tập hợp, tập hợp được sắp xếp, bitmap và siêu nhật ký. Trong bài đăng này, chúng ta sẽ xem xét loại dữ liệu tập hợp do Redis cung cấp cùng với cách sử dụng và các trường hợp sử dụng thực tế.

Bộ Redis

Bộ Redis là tập hợp các chuỗi không có thứ tự (một chuỗi là giá trị Redis cơ bản có thể chứa hầu hết mọi thứ) cung cấp thời gian liên tục bổ sung, xóa và kiểm tra tư cách thành viên. Redis cũng hỗ trợ các phép toán hợp, giao và trừ nhanh hợp lý giữa các tập hợp. Như mong đợi, nó không cho phép các giá trị lặp lại.

Dưới đây là một số ví dụ về các bộ Redis đang hoạt động từ redis-cli . Dưới đây là tóm tắt về các đại diện chính trong ví dụ bên dưới:

  • người dùng:tất cả đại diện cho một tập hợp tất cả người dùng đã đăng ký trên một trang web.
  • người dùng:actv đại diện cho những người dùng đang hoạt động.
  • người dùng:inactv đại diện cho những người dùng không hoạt động (những người dùng đã không truy cập trang web trong một thời gian).
# sadd key member [member ...] : add members to a set
127.0.0.1:6379> sadd users:all 11 12 13 14 15 Rocket Pocket Socket
(integer) 8
127.0.0.1:6379> type users:all
set
# smembers key: get all members of a set
127.0.0.1:6379> smembers users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "Rocket"
7) "12"
8) "15"
# sismember key member: is the given value a member of the set?
127.0.0.1:6379> sismember users:all 00
(integer) 0
127.0.0.1:6379> sismember users:all 11
(integer) 1
127.0.0.1:6379> sismember users:all Socket
(integer) 1
127.0.0.1:6379> sadd users:inactv 11 12 13
(integer) 3
# sinter key [key ...]: Intersection of multiple sets
# Similar: sinterstore stores the result of intersection of sets to a new set
127.0.0.1:6379> sinter users:all users:inactv
1) "11"
2) "12"
3) "13"
# scard key: cardinality of the set i.e. number of members present in the set
127.0.0.1:6379> scard users:all
(integer) 8
# sdiff key [key ...] : Subtract multiple sets
# Similar: sdiffstore: subtract and store result in a new destination set
127.0.0.1:6379> sdiff users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "12"
7) "Rocket"
8) "15"
127.0.0.1:6379> sdiff users:all users:inactv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
# sdiffstore destination key [key ...]
127.0.0.1:6379> sdiffstore users:actv users:all users:inactv
(integer) 5
127.0.0.1:6379> smembers users:actv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
127.0.0.1:6379> sdiff users:all users:actv users:inactv
(empty list or set)
# smove source destination member: move a member from source set to destination.
127.0.0.1:6379> smove users:inactv users:actv 11
(integer) 1
127.0.0.1:6379> smembers users:actv
1) "Pocket"
2) "11"
3) "Socket"
4) "14"
5) "Rocket"
6) "15"

Các lệnh thiết lập quan trọng khác bao gồm:

  • SUNION - thiết lập công đoàn
  • SPOP - xóa ngẫu nhiên một phần tử
  • SREM - xóa một hoặc nhiều phần tử

Bạn có thể tìm thấy danh sách đầy đủ các lệnh Redis có liên quan tại đây.

Redis Internals

Redis lưu trữ nội bộ các bộ làm từ điển. Các từ điển trong Redis được triển khai dưới dạng bảng băm sử dụng hàm băm MurmurHash2 và phát triển thông qua thay đổi kích thước gia tăng. Các va chạm băm được xử lý bằng cách xâu chuỗi. Các tập hợp có một mã hóa đặc biệt cho các tập hợp nhỏ khi tất cả các thành viên của một tập hợp đều ở cơ số 10 trong phạm vi # của số nguyên có dấu 64 bit được gọi là IntSets. Đây thực chất là một mảng các số nguyên đã được sắp xếp. Các tìm kiếm trong mảng được thực hiện thông qua tìm kiếm nhị phân. Rõ ràng, việc triển khai này có hiệu quả đối với các tập hợp rất nhỏ. Kích thước tối đa mà mã hóa này được sử dụng chịu sự điều chỉnh của set-max-intset-entry tham số cấu hình. Giá trị mặc định là 512. Bạn có thể tìm thấy mô tả tốt về cấu trúc dữ liệu nội bộ được Redis sử dụng tại đây.

Ứng dụng Redis

Dưới đây là danh sách nhỏ về một số ứng dụng Redis Set khả thi:

  • Là một tập hợp, nó có thể được sử dụng để theo dõi các mục duy nhất:
    • Tất cả các địa chỉ IP duy nhất truy cập trang web của bạn.
    • Tất cả các phiên bản công việc duy nhất hiện đang ở trạng thái nhất định, v.v.
  • Một lần nữa, dưới dạng một tập hợp, nó có thể được sử dụng để biểu thị là "thuộc về" hoặc mối quan hệ tương tự:
    • Tất cả các SKU thuộc một danh mục cụ thể.
    • Tất cả các đối tượng có một thẻ cụ thể, v.v.
  • Bộ chỉ có thể được sử dụng để kết hợp các mối quan hệ, tức là liên hợp / giao / trừ các tập hợp:
    • Tất cả các SKU thuộc danh mục áo thun, nhưng không thuộc danh mục phụ của áo thun polo.

Hãy chọn một ví dụ thực tế và khám phá thêm các trường hợp sử dụng liên quan.

Hồ sơ trực quan cho Cửa hàng sách điện tử của bạn

Giả sử bạn là chủ sở hữu của một cửa hàng sách trực tuyến rất lớn với hàng triệu đầu sách. Cơ sở dữ liệu chính của bạn là MongoDB và nó hoạt động khá tốt cho hầu hết các trường hợp sử dụng của bạn với việc sử dụng chính xác lập chỉ mục, sharding, v.v. Đây là một phần lược đồ tài liệu DB cho books bộ sưu tập:

...
sku: SKU,
pid: Product ID,
title: String,
auth: String,
pub: String,
isbn: ISBN,
edition: Int,
price: Float,
rating: Float,
cats: [String, String ...],
tags: [String, String ...],
...

Bạn cũng ghi lại các giao dịch trong một tập hợp có tên txns có thể trông giống như sau:

txnid: TxnID,
cid: CustomerID,
amnt: Float,
curr: Currency,
sku: [sku1, sku2, ...],
time: TimeStamp,
...

Và, một bộ sưu tập các chế độ xem được gọi là views:

time: TimeStamp, # daily aggregated
cid: CustomerID,
sku: [sku1, sku2, ...],
...

Rõ ràng, đây là một ví dụ được đơn giản hóa cao để đưa ra các giả định rộng rãi. Mục đích của chúng tôi là hiển thị một ví dụ về Redis trong một kịch bản thế giới thực (gần).

Được rồi, bây giờ bạn, với tư cách là người quản lý cửa hàng, muốn có một công cụ Visual Profiler để phân tích các mối quan hệ và hành vi của khách hàng trên các danh mục khác nhau. Ví dụ:

  • Danh mục phổ biến nhất là gì?
  • Mọi người đang xem hoặc mua Khoa học viễn tưởng cũng xem Phi hư cấu phải không?

Bạn muốn có thể thực hiện việc này trong thời gian thực, tức là giao diện người dùng của trình cấu hình sẽ đánh dấu vào các hộp, nút cho phép bạn thay đổi các tham số và xem kết quả (gần như) ngay lập tức.

Thực hiện các thao tác như vậy trên MongoDB sẽ yêu cầu thực hiện các truy vấn tương đối liên quan để kết hợp các danh mục, thẻ và dữ liệu khác mà bạn có thể quan tâm. Với một bộ làm việc không phù hợp với bộ nhớ, đây sẽ không phải là những hoạt động nhanh nhất. Ví dụ:

  • Việc tìm kiếm tất cả các sách được bán hôm nay đều là Sách hư cấu, nhưng không phải sách Khoa học viễn tưởng sẽ liên quan đến việc truy vấn txn tập hợp các giao dịch của ngày hôm nay. Sau đó, lặp lại các SKU để thu thập các danh mục của chúng và sau đó thực hiện các thao tác $ in / $ nin.

Hãy xem cách xử lý vấn đề này bằng cách đưa Redis vào danh sách kết hợp. Vào cuối mỗi ngày, các công việc được lên lịch hàng ngày có thể chạy trên các bộ sưu tập MongoDB này để tạo các bộ Redis. Loại bộ bạn muốn tạo sẽ phụ thuộc vào loại bộ lọc bạn muốn hỗ trợ trên giao diện người dùng của mình. Ví dụ:giả sử bạn muốn hỗ trợ các truy vấn liên quan đến danh mục, chúng tôi sẽ muốn tạo các bộ như:

cat:type:catID
cat:sku:fiction
cat:sku:nonfiction
cat:sku:scfiction
cat:sku:history
cat:sku:milhistory
cat:sku:military
...
cat:cid:fiction
cat:cid:nonfiction
cat:cid:scfiction
cat:cid:history
cat:cid:milhistory
cat:cid:military
...

Bộ cat:sku:* sẽ chứa SKU của sách được bán / xem hôm nay trong danh mục đó. Tương tự, cat:cid:* sẽ chứa CID của những khách hàng đã mua / bán sách trong danh mục đó. Một số câu hỏi mẫu mà chúng tôi có thể trả lời với các nhóm này là:

  • Khách hàng (hoặc # khách hàng) đã xem / mua sách Viễn tưởng (một danh mục) hôm nay: smembers cat:cid:novel
  • Những khách hàng đã xem / mua Lịch sử nhưng không phải Lịch sử quân sự hôm nay: sdiff cat:cid:history cat:cid:milhistory
  • (Số lượng) Sách được bán hôm nay là Khoa học viễn tưởng và Quân sự, tức là khoa học viễn tưởng quân sự: sinter cat:sku:scfiction cat:sku:military
  • Bất kỳ số lượng phép toán hợp nhất, giao nhau và chênh lệch nào như vậy mà bạn quan tâm.

Bản thân điều này cung cấp cho chúng tôi khả năng truy vấn rất mạnh mẽ. Hãy thêm nhiều bộ khác! Giả sử, chúng tôi tạo các bộ bổ sung dựa trên xếp hạng sách. Ví dụ:

rat:sku:5str: Set of books with ratings > 4.5
rat:sku:4str: Set of books with ratings > 3.5 && <= 4.5
rat:sku:3str: ...
rat:sku:2str: ...
...
rat:cid:5str: Set of customer who bought books with ratings as mentioned above.
rat:cid:4str: ...
..

Được trang bị những bộ này, bạn hiện có thể nhanh chóng tìm ra những thứ như:

  • Sách viễn tưởng được xếp hạng 4 sao trở lên được mua ngay hôm nay: suniontore rat:sku:4strabv rat:sku:5str rat:sku:5str / sinter rat:sku:4strabv cat :sku:tiểu thuyết
  • Khách hàng đã mua sách từ 3 sao trở lên trong lịch sử: suniontore rat:cid:5strabv rat:cid:3str rat:cid:5str rat:cid:5str / sinter cat:cid:history rat:cid:5strabv

Bây giờ, giả sử bạn muốn gửi một phiếu giảm giá cho tất cả khách hàng đã mua sách Chiêm tinh hôm nay với xếp hạng từ 2 trở xuống (như một lời xin lỗi vì trải nghiệm tồi tệ về việc phải đọc cuốn sách đó!). Bạn có thể xuất danh sách CustomerID đó s ra và gửi nó đến ứng dụng email của bạn. Tương tự, bạn có thể tạo bộ cho những thứ khác mà bạn có thể muốn hiển thị dưới dạng bộ lọc trong Hồ sơ trực quan của mình như thẻ, phạm vi giá, v.v.

Lợi ích của việc sử dụng Redis Sets là rõ ràng ở đây. Lưu trữ trong bộ nhớ sẽ dẫn đến truy cập thực sự nhanh để giao diện người dùng cảm thấy linh hoạt. Ngoài ra, các hoạt động thiết lập Redis là thời gian không đổi hoặc tuyến tính.

Kết luận

Trong bài đăng này, chúng tôi đã giới thiệu với các ví dụ về một trong những Cấu trúc dữ liệu Redis hữu ích nhất:Bộ. Dưới đây là một số bài đăng khác của chúng tôi trong chuỗi cấu trúc dữ liệu Redis:

  • Redis Hashes
  • Redis Bitmaps
  • Bộ Redis
  • Các bộ được sắp xếp của Redis


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách đổi tên nhiều phím trong Redis

  2. Redis:Amazon EC2 vs Elasticache

  3. Chia sẻ phiên giữa php và nút

  4. Lợi thế của việc sử dụng chương trình phụ trợ tùy chỉnh phiên Gorilla là gì?

  5. Nhiệm vụ cần tây luôn ĐANG ĐẨY