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

Redis chỉ là một bộ nhớ cache?

Không, Redis không chỉ là một bộ nhớ cache.

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

Cách tốt nhất để hiểu Redis là lập mô hình 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.

Giả sử 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.

Lập mô hình 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 dưới dạng Bản đồ. Ví dụ:Câu hỏi là một bản đồ với các trường {id, title, date_asked, vote, ask_by, status}. Tương tự, một Câu trả lời là một bản đồ với các trường {id, question_id, answer_text, answer_by, phiếu bầu, trạng thái}. Tương tự, chúng ta có thể lập mô hình đố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

Giờ đây, mỗi khi ai đó ủng hộ một câu hỏi hoặc câu trả lời, bạn chỉ cần thực hiện việc này

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

Danh sách các 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 một chương trình .NET hoặc Java, bạn sẽ lưu trữ các câu hỏi trong một Danh sách. Hóa ra, đó cũng là cách tốt nhất để lưu trữ điều này trong Redis.

Mỗi khi ai đó đặt câu hỏi, chúng tôi thêm id của người đó 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 hiển thị trang chủ của mình, bạn hỏi Redis 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, hãy truy xuất 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

Tiếp theo, chúng tôi muốn truy xuất 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 nhiều nhất, 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 Tập hợp được sắp xếp của Redis. Tập hợp đã sắp xếp cho phép bạn liên kết điểm với từng phần tử. Sau đó, bạn có thể truy xuất các phần tử dựa trên điểm số của chúng.

Hãy tiếp tục và thực hiện việc 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ác câu hỏi vào một nhóm được sắp xếp và liên kết điểm (số phiếu bầu) cho mỗi câu hỏi. Mỗi khi một câu hỏi được ủng hộ, chúng tôi sẽ tăng điểm cho câu hỏi đó. 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ỉ thực hiện zrevrange 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 vẫn mở trang câu hỏi, SO sẽ thông báo cho bạn khi câu hỏi mới được thêm vào. Redis có thể giúp gì ở đây?

Redis có một mô hình pub-sub. Bạn có thể tạo kênh, ví dụ:"channel_questions_tagged_redis". Sau đó, bạn subscribe người dùng vào một kênh cụ thể. Khi một câu hỏi mới được thêm vào, bạn sẽ publish một tin nhắn đến 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 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 sẽ giúp bạn với tất cả các đường ống dẫn nước ở phía máy chủ.

Tính bền bỉ, độ tin cậy, v.v.

Không giống như Cache, Redis duy trì dữ liệu trên đĩa cứng. Bạn có thể 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ủ đề về Độ bền và Nhân rộng tại đây - http://redis.io/documentation



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để Redis biết được liệu nó phải trả lại dữ liệu đã lưu trong bộ đệm hay dữ liệu mới từ DB

  2. Làm thế nào để lồng một danh sách vào một cấu trúc trong Redis để giảm cấp cao nhất?

  3. Kết nối với AWS ElastiCache bằng Mã hóa In-Transit + Xác thực từ ứng dụng khách không phải redis-cli + stunnel

  4. Redis Nhiều người đăng ký

  5. Hoạt động của @cache_page () decorator trong django-redis-cache