Có phải Redis chỉ là một bộ đệm?


255

Tôi đã đọc một số tài liệu Redis và thử hướng dẫn tại http://try.redis-db.com/ . Cho đến nay, tôi không thể thấy bất kỳ sự khác biệt nào giữa Redis và các công nghệ bộ đệm như Velocity hoặc Khung bộ đệm thư viện doanh nghiệp

Bạn thực sự chỉ cần thêm các đối tượng vào một kho lưu trữ dữ liệu trong bộ nhớ bằng một khóa duy nhất. Dường như không có bất kỳ ngữ nghĩa quan hệ nào ...

Tôi đang thiếu gì?


3
Từ redis.io : Redis là một kho lưu trữ khóa-giá trị nâng cao. Nó thường được gọi là một máy chủ cấu trúc dữ liệu vì các khóa có thể chứa chuỗi, băm, danh sách, bộ và bộ được sắp xếp. Điều đó nói rằng, tôi đã bỏ phiếu để đóng câu hỏi của bạn vì nó không phù hợp với định dạng của StackOverflow.
Linus Thiel

29
Tôi đồng ý nó không phải là định dạng SO. Bạn nghĩ nó sẽ phù hợp hơn ở đâu?
Matt Evans

Câu trả lời:


631

Không, Redis không chỉ là bộ đệm.

Giống như Cache, Redis lưu trữ cặp khóa = giá trị. Nhưng không giống như bộ đệm, Redis cho phép bạn thao tác trên các giá trị. Có 5 loại dữ liệu trong Redis - Chuỗi, Bộ, Hash, Danh sách và Bộ sắp xếp. Mỗi loại dữ liệu cho thấy các hoạt động khác nhau.

Cách tốt nhất để hiểu Redis là mô hình hóa một ứng dụng mà không cần suy nghĩ về cách bạn sẽ lưu trữ nó trong cơ sở dữ liệu.

Hãy nói rằng chúng tôi muốn xây dựng StackOverflow.com. Để đơn giản, chúng tôi cần Câu hỏi, Câu trả lời, Thẻ và Người dùng.

Mô hình hóa câu hỏi, người dùng và câu trả lời

Mỗi đối tượng có thể được mô hình hóa như một Bản đồ. Ví dụ: Câu hỏi là bản đồ với các trường {id, title, date_asked, phiếu bầu, hỏi_by, trạng thái}. Tương tự, Câu trả lời là bản đồ với các trường {id, question_id, answer lòng, answer_by, phiếu bầu, trạng thái}. Tương tự, chúng ta có thể mô hình hóa một đối tượng người dùng.

Mỗi đối tượng này có thể được lưu trữ trực tiếp trong Redis dưới dạng Hash. Để tạo id duy nhất, bạn có thể sử dụng lệnh tăng nguyên tử. Một cái gì đó như thế này -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Xử lý phiếu bầu

Bây giờ, mỗi khi ai đó đưa ra một câu hỏi hoặc một câu trả lời, bạn chỉ cần làm điều này

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Danh sách câu hỏi cho trang chủ

Tiếp theo, chúng tôi muốn lưu trữ các câu hỏi gần đây nhất để hiển thị trên trang chủ. Nếu bạn đang viết chương trình .NET hoặc Java, bạn sẽ lưu trữ các câu hỏi trong Danh sách. Hóa ra, đó cũng là cách tốt nhất để lưu trữ thứ này trong Redis.

Mỗi khi ai đó hỏi một câu hỏi, chúng tôi thêm id của nó vào danh sách.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Bây giờ, khi bạn muốn kết xuất trang chủ của mình, bạn hỏi Redis cho 25 câu hỏi gần đây nhất.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Bây giờ bạn đã có id, lấy các mục từ Redis bằng cách sử dụng pipelining và hiển thị chúng cho người dùng.

Câu hỏi theo Thẻ, Sắp xếp theo Phiếu bầu

Tiếp theo, chúng tôi muốn lấy câu hỏi cho mỗi thẻ. Nhưng SO cho phép bạn xem các câu hỏi được bình chọn hàng đầu, câu hỏi mới hoặc câu hỏi chưa được trả lời dưới mỗi thẻ.

Để mô hình hóa điều này, chúng tôi sử dụng tính năng Bộ sắp xếp của Redis. Một bộ sắp xếp cho phép bạn liên kết một số điểm với từng yếu tố. Sau đó, bạn có thể lấy các yếu tố dựa trên điểm số của họ.

Hãy tiếp tục và làm điều này cho thẻ Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Chúng ta đã làm gì ở đây? Chúng tôi đã thêm câu hỏi vào một tập hợp được sắp xếp và liên kết một số điểm (số phiếu) cho mỗi câu hỏi. Mỗi khi một câu hỏi được đưa ra, chúng tôi sẽ tăng điểm của nó. Và khi người dùng nhấp vào "Câu hỏi được gắn thẻ Redis, được sắp xếp theo phiếu bầu", chúng tôi chỉ cần làm mộtzrevrange và nhận lại các câu hỏi hàng đầu.

Câu hỏi thời gian thực mà không cần làm mới trang

Và cuối cùng, một tính năng tiền thưởng. Nếu bạn giữ trang câu hỏi được mở, SO sẽ thông báo cho bạn khi một câu hỏi mới được thêm vào. Làm thế nào Redis có thể giúp đỡ ở đây?

Redis có một mô hình pub-sub. Bạn có thể tạo các kênh, ví dụ "channel_questions_tagged_redis". Sau đó, bạn subscribengười dùng đến một kênh cụ thể. Khi một câu hỏi mới được thêm vào, bạn sẽ publishnhắn tin cho kênh đó. Tất cả người dùng sau đó sẽ nhận được tin nhắn. Bạn sẽ phải sử dụng một công nghệ web như ổ cắm web hoặc sao chổi để thực sự gửi thông điệp đến trình duyệt, nhưng Redis giúp bạn với tất cả hệ thống ống nước ở phía máy chủ.

Kiên trì, Độ tin cậy, vv

Không giống như Cache, Redis vẫn tồn tại dữ liệu trên đĩa cứng. Bạn có thể có một thiết lập master-Slave để cung cấp độ tin cậy tốt hơn. Để tìm hiểu thêm, hãy xem qua các chủ đề Kiên trì và Nhân rộng tại đây - http://redis.io/documentation


15
Đây cũng là một bus dịch vụ cực kỳ đơn giản sử dụng các lệnh liên quan đến PUB / SUB.
Jim Dennis

3
Làm thế nào tôi có thể lấy câu hỏi của người dùng? Tôi có nên tạo một danh sách cho mỗi người dùng với câu hỏi của bạn, như câu hỏi: người dùng: 1 hoặc tôi nên sử dụng thẻ?
Diogo Alves

2
giải thích rất hữu ích và chi tiết mà tôi từng thấy trên SO
Trọng Vũ

5

Không chỉ là một bộ đệm.

  • Trong bộ nhớ lưu trữ khóa-giá trị
  • Hỗ trợ nhiều kiểu dữ liệu (chuỗi, băm, danh sách, bộ, bộ đã sắp xếp, bitmap và hyperloglog)
  • Nó cung cấp khả năng lưu trữ dữ liệu bộ nhớ cache vào bộ nhớ vật lý (nếu cần).
  • Hỗ trợ mô hình pub-sub
  • Redis cache cung cấp bản sao cho tính sẵn sàng cao (chính / phụ)

4

Redis có những khả năng độc đáo như lua-scripts siêu nhanh. Thời gian thực hiện của nó bằng với thực thi lệnh C. Điều này cũng mang lại tính nguyên tử cho thao tác dữ liệu Redis tinh vi cần thiết cho công việc của nhiều đối tượng nâng cao như Khóa và Semaphores.

Có một Redis dựa trên lưới dữ liệu bộ nhớ được gọi là Redisson , cho phép dễ dàng xây dựng ứng dụng phân tán trên Java . Nhờ phân phối Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapđối tượng và nhiều người khác.

Hoạt động hoàn hảo trên đám mây và hỗ trợ AWS Elasticache , AWS Elasticache ClusterAzure Redis Cache hỗ trợ


1

Trên thực tế không có sự phụ thuộc giữa biểu diễn dữ liệu tương đối (hoặc bất kỳ loại biểu diễn dữ liệu nào) và vai trò cơ sở dữ liệu (bộ đệm, lưu trữ vĩnh viễn, v.v.).

Redis là tốt cho bộ nhớ cache đó là sự thật, nhưng nó không chỉ là bộ đệm. Đó là cơ sở dữ liệu trong bộ nhớ tốc độ cao. Nó không tồn tại dữ liệu trên đĩa. Nó không liên quan, đó là lưu trữ giá trị khóa.

Chúng tôi sử dụng nó trong sản xuất. Redis giúp chúng tôi xây dựng phần mềm xử lý hàng ngàn yêu cầu mỗi giây và giữ dữ liệu kinh doanh của khách hàng trong suốt vòng đời tự nhiên.


0

Redis là bộ đệm phù hợp nhất với môi trường phân tán / kiến ​​trúc microservice.

Nó nhanh, đáng tin cậy, cung cấp tính nguyên tử và tính nhất quán và có một loạt các kiểu dữ liệu như bộ, băm, danh sách, v.v.

Tôi đang sử dụng nó từ một năm trước và nó thực sự là một vị cứu tinh khi bạn cần cung cấp giải pháp sẵn sàng sản xuất rất nhanh và cho bất kỳ vấn đề nào liên quan đến hiệu suất vì bạn luôn có thể sử dụng nó để lưu trữ dữ liệu.


0

Bên cạnh việc là một máy chủ bộ đệm, Redis đặc biệt là một máy chủ cấu trúc dữ liệu. Trở thành một bộ đệm ở dạng máy chủ cấu trúc dữ liệu có ý nghĩa rất lớn, bởi vì cấu trúc dữ liệu là nguyên tắc cơ bản của các chương trình hoặc ứng dụng . Hãy xem xét bạn đang sử dụng cơ sở dữ liệu SQL làm công nghệ lưu trữ và cần xây dựng một danh sách, bản đồ băm, bộ xếp hạng hoặc những thứ tương tự, đó là một nỗi đau ở cổ. Redis có thể cung cấp cho bạn các chức năng trực tiếp theo cách rất đơn giản, do đó rất đơn giản hóa sự phát triển.

Mặt khác, một máy chủ cấu trúc dữ liệu không nhất thiết phải ở dạng bộ đệm. Có những dự án tương thích với Redis nhưng có công cụ lưu trữ liên tục.


0

Redis hỗ trợ các cấu trúc dữ liệu như chuỗi, băm, danh sách, bộ, bộ được sắp xếp với các truy vấn phạm vi, bitmap, hyperloglog, chỉ mục không gian địa lý với các truy vấn và luồng bán kính. Redis đã tích hợp sao chép, kịch bản Lua, trục xuất LRU, giao dịch và các mức độ tồn tại khác nhau trên đĩa và cung cấp tính sẵn sàng cao thông qua Redis Sentinel và phân vùng tự động với Redis Cluster.

triển khai với trăn

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

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.