Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành Thạo Redis Trong Ruby: Hướng Dẫn Thực Hành

Redis Là Gì?

Redis là loại in-memory database có các cấu trúc dữ liệu khác nhau. Như: Key/value storage, Lists, Sets. Không liên quan SQL database như Postgres. Use case Redis: Caching, Leaderboards, Đếm visitor, Autocomplete nhanh, Theo dõi active user session, Work & message queues. Xem cách dùng Redis trong Ruby app!

Cài Đặt Redis Local

Trước hết: Cần cài Redis server. Giống cài DB khác. Ubuntu: apt install redis-server, Mac: brew install redis, Windows 10: "Windows Subsystem for Linux". Server chạy xong dùng redis-cli connect.

Lưu ý: Có thể phải chạy redis-server terminal khác để start server trước khi connect.

Sẵn sàng dùng Redis!

Dùng Redis Gems

Tương tác Redis trực tiếp redis-cli, nhưng từ Ruby dùng gem. Có vài gem: oxblood, redic, redis-rb. Chỉ một officially recommended bởi Redis developers: redis-rb. Cài: gem install redis. Với gem, connect server Redis & bắt đầu. Thêm key a giá trị 1. Code:

 require 'redis'
redis = Redis.new(host: "localhost")
redis.set("a", 1) # "OK"
redis.get("a") # "1" 
Gem map tốt Ruby method đến Redis command, nên check Redis doc hoặc gem doc để biết command available. Dùng incr: redis.incr("a") # "2". Hoặc set key auto-expire setex: redis.setex("bacon", 10, 100). Tham số 2: giây trước expire, tham số cuối: value. Ví dụ: redis.get("bacon") # "100". Sau 10 giây... redis.get("bacon") # nil. Thử command khác!

Cách Dùng Sorted Sets Trong Redis

Redis không giới hạn key/value đơn giản. Cung cấp cấu trúc dữ liệu mạnh. Như sorted set. Cho phép tạo list item duy nhất sorted bởi giá trị cho trước. Giá trị gọi "score" trong Redis doc. Query lấy top N item. Hoàn hảo cho leaderboard! Ví dụ:

 redis.zadd("popular_fruit", 10, "apple") # true
redis.zadd("popular_fruit", 20, "banana") # true
redis.zadd("popular_fruit", 30, "orange") # true 
Có set, query top item: r.zrevrange("popular_fruit", 0, 0) # ["orange"]. Command nói: "Từ rank cao nhất (0), cho top item." Muốn tất cả, theo thứ tự: r.zrevrange("popular_fruit", 0, -1) # ["orange", "banana", "apple"]. Chú ý "rev" trong "zrevrange", nghĩa reverse & cho item descending order. Dùng "zrange" nhận ascending order. Sorted sets vượt leaderboard! Làm fast autocomplete engine với ZRANGEBYLEX. Đọc doc thêm set operation.

Hiểu Keys, Values & Namespacing

Không có column, không table, mọi thứ một namespace phẳng. Làm sao tổ chức data? Dùng tên key. Convention dùng hai chấm (:) tách tên generic & phần specific. Ví dụ: redis.set("fruit:1", "apple"), redis.set("fruit:2", "banana"). Không gì đặc biệt về convention này, Redis (software) key có hai chấm không khác key không có, nhưng cho bạn (dev) giúp organize data.

Data Persistence Trong Redis

Mặc định Redis không save mọi operation như DB thường. Chỉ save disk khi stop server. Hoặc điều kiện: Sau 15 phút, nếu 1+ key thay đổi; sau 5 phút, nếu 10+ key thay đổi; sau 1 phút, nếu 10,000+ key thay đổi. Tạo file dump.rdb thư mục hiện tại. Muốn persistence giống SQL DB, enable "Append Only Mode", save thay đổi mỗi giây. Thêm (uncomment) line config redis: appendonly yes.

Dùng Redis Làm Rails Cache

Từ Rails 5.2 dùng Redis làm cache store. Chỉ cần gem redis & server. Enable:

 # config/environments/production.rb
Rails.application.configure do
  config.cache_store = :redis_cache_store, { url: "redis://localhost:6379/0" }
end 
Rails dùng Redis cho mọi caching. Cũng store trong cache: Rails.cache.write("a", 1) # "OK", Rails.cache.read("a") # 1. Rails lưu giá trị dạng: serialized Ruby object, ví dụ kết quả query ActiveRecord.

Redis F.A.Q

"Có list tất cả key Redis server?" Có, dùng keys hoặc scan, nhưng không khuyến khích vì rất chậm, nhất khi DB lớn. "Khi nào dùng Redis?" Chỉ khi hợp lý use case. Tức tận dụng cấu trúc dữ liệu Redis làm code dễ hiểu hơn. Không dùng Redis chỉ vì cool/popular. Dùng khi giải quyết vấn đề tốt hơn giải pháp khác. "Làm sao Redis nhanh hơn?" Cài gem hiredis trên redis-rb cho performance tối đa.

Tóm Tắt

Bạn đã học Redis, in-memory database nhanh hữu ích đúng tình huống: caching, counting, queues. Nếu bài viết thú vị hãy chia sẻ. Cảm ơn bạn đã đọc!