Tìm hiểu về Redis

Khi một trang web có càng nhiều người dùng cũng như có càng nhiều chức năng thì điều đó đồng nghĩa với việc sẽ có càng nhiều tương tác, càng nhiều request vào database, thời gian response sẽ lâu hơn. Để giải quyết vấn đề đó thì có một cách đó là ... thuê server khỏe hơn 🤣. Nhưng rất may nhờ những kỹ sư tài hoa đi trước, đấy không phải là cách duy nhất. Trong bài viết này, mình sẽ giới thiệu sơ lược về Caching - hay dịch nôm na là Bộ nhớ đệm - cũng như Redis - một công cụ tuyệt vời để implement Caching.

1. Cache là gì?

Cache (Bộ nhớ đệm) là một bộ nhớ tạm thời mà những dữ liệu ở đó có thể cần dùng đến trong tương lai. Giúp cho tốc độ xử lý dữ liệu được nhanh chóng và chính xác hơn. Đặc điểm nổi bật của Cache là có dung lượng thấptốc độ xử lý nhanh. Bất cứ khi nào ứng dụng của bạn cần truy xuất dữ liệu thì nó sẽ tìm trong Cache trước, nếu như không tìm thấy thì lúc đó nó mới truy xuất vào database. Caching giúp giảm độ trễgiảm thời gian load của server và database. Có một công cụ tuyệt vời hỗ trợ cho việc này, đó chính là Redis.

2. Redis là gì?

Theo trang chủ của Redis:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams.

Vậy, ta có thể hiểu Redis là một nơi lưu trữ dữ liệu, được dùng như một database, bộ nhớ đệm hoặc là nơi trung chuyển thông tin. Những dữ liệu mà nó có thể lưu trữ bao gồm: strings, hashes, lists, sets, bitmaps ...

3. Ưu điểm của Redis.

  1. Redis được viết bằng C, vậy nên tốc độ của nó rất nhanh!
  2. Redis là một database thuộc dạng NoSQL Database, vì vậy rất hiệu quả để lưu trữ những dữ liệu dynamic hoặc phức tạp (ví dụ như hash, lists hay kiểu dữ liệu dạng cây hierarchical).
  3. Redis được sử dụng bởi nhiều ông lớn như GitHub, Weibo, Pinterest, StackOverflow, Flickr, ... Chứng tỏ nó đã có một chỗ đứng nhất định.
  4. Redis được hỗ trợ bởi rất nhiều ngôn ngữ lập trình như JavaScript, Java, Go, C, C++, C#, Python, Ruby, PHP, Objective-C, ...
  5. Và cuối cùng, Redis open sourcerất ổn định. Vậy thì tại sao không dùng? 😛

4. Redis khác so với các "NoSQL Databases" còn lại ở điểm nào?

Redis là một database theo kiểu Key - Value.

Như hình bên trên, ta có thể thấy NoSQL Database có thể được phân loại thành nhiều dạng khác nhau tùy thuộc vào mục đích sử dụng của chúng. Hầu hết các loại database này đều không định nghĩa cấu trúc như table hay hỗ trợ các câu query như SQL SELECT. NoSQL ít ràng buộc với schema hơn khi mà dữ liệu của nó hầu hết được lưu trữ dưới dạng JSON.

Redis là một database theo kiểu Key - Value. Có nghĩa là một value sẽ được ánh xạ tương ứng với một key. Những value này có thể khác nhau hoàn toàn và không tuân theo bất cứ một cấu trúc cụ thể nào cả. Tuy nhiên, cách duy nhất để có thể lấy value là thông qua key.

Key - Value database.

5. Một số câu lệnh hay dùng.

Cài đặt Redis cũng khá đơn giản, bạn có thể làm theo chỉ dẫn trong phần download ở trang chủ của Redis.

SET (Setting a Key)

127.0.0.1:6379> SET foo "Hello World"
OK // setting a key

GET (Getting a Key)

127.0.0.1:6379> GET foo
"Hello World" // getting a key

DEL (Deleting a Key)

127.0.0.1:6379> GET foo 
"Hello World" // getting a key
127.0.0.1:6379> DEL foo
(integer) 1 // key just got deleted
127.0.0.1:6379> GET foo
(nil) // since key is deleted therefore, result is nil.

SETEX (Setting a key with an expiry)

127.0.0.1:6379> SETEX foo 40 "I said, Hello World!"
OK // key has been set with 40 seconds as expiration

TTL (Total Time left for a key that has a timeout)

127.0.0.1:6379> TTL foo
(integer) 36 // 36 seconds left to timeout

PERSIST (Removing the timeout from key)

127.0.0.1:6379> PERSIST foo
(integer) 1 // turning the key from volatile to persistent (key won't expire)

RENAME (Renaming the current existing key)

127.0.0.1:6379> RENAME foo bar
OK // renaming the key 'foo' as bar

FLUSHALL (Flushing everything so far saved)

127.0.0.1:6379> flushall
OK // just got flushed

6. Dùng Redis với Ruby Gem.

Có một số gem hỗ trợ cho việc dùng Redis bằng Ruby:

Nhưng được recommend nhiều nhất vẫn là redis-rb.

Install redis-rb

gem install redis

Note: Bạn phải chạy redis-server ở một terminal khác để start server trước khi bắt đầu.

redis-rb cũng cung cấp những method tương tự giống như redis-cli và một số method khác nữa:

require 'redis'

redis = Redis.new(host: "localhost")

redis.set("a", 1)
# "OK"
redis.get("a")
# "1"
redis.incr("a") # tăng value cho key "a".
# "2"
redis.setex("bacon", 10, 100) # tham số thứ hai là số giây mà cái key này sẽ expire còn tham số thứ ba là value của nó.

Tuy nhiên có một nhược điểm: Không có column, không có table, chỉ có plain text thì làm thể nào để quản lý dữ liệu cho hiệu quả?

Một cách khá phổ biến đó là sử dụng dấu hai chấm (: - colon):

redis.set("fruit:1", "apple")
# OK
redis.set("fruit:2", "banana")
# OK

Sử dụng dấu hai chấm về bản chất không có gì thay đổi, Redis vẫn sẽ nhận diện đây là hai key khác nhau và không có gì bất thường. Tuy nhiên, đối với một dev thì convention này sẽ giúp cho bạn rất nhiều trong việc sắp xếp và quản lý dữ liệu một cách hiệu quả.

7. Nguồn tham khảo