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 subscribe
ngườ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ẽ publish
nhắ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