Định nghĩa Redis là gì? Cơ chế hoạt động của Redis như thế nào?
Dân lập trình chắc chắn không còn xa lạ với Redis. Vậy định nghĩa chính xác Redis là gì? Redis là viết tắt của cụm từ Tiếng Anh Remote Dictionary Server. Redis là mã nguồn có thể mở được đảm nhiệm trọng trách lưu trữ các dữ liệu có cấu trúc.
Hệ thống Redis
Redis là một hệ thống dùng để lưu trữ dữ liệu dưới dạng Key – Value mạnh mẽ. Nếu nói Redis như một bộ nhớ Cache, một Database hoặc Message Broker cũng không sai. Mọi thông tin, dữ liệu đều được redis ghi trên ram thay vì ổ đĩa hay ổ SSD như bình thường. Nhờ việc không cần dùng ổ đĩa hay ổ SSD nên Redis sẽ rút ngắn thời gian tìm kiếm, truy cập dữ liệu. Vì thế mà tốc độ đọc và ghi dữ liệu trên Redis rất nhanh, rất lý tưởng.
Vì sao Redis được các Developer săn đón?
Vai trò của Redis
Ưu điểm thu hút các lập trình viên săn đón Redis là gì? Ứng dụng redis, người dùng sẽ được “tận hưởng” nhiều điểm cộng không thể nào lý tưởng hơn:
Redis hỗ trợ người dùng có thể thêm mới hoặc loại bỏ dữ liệu trong thời gian ngắn.
Redis có thể nhận và ghi dữ liệu lên Ram và có thể xuất hiện trên Disk tại một thời điểm.
Key của Redis là một string nhưng được hỗ trợ sử dụng linh hoạt đa dạng các value như List, Sorted sets, Sets,…
Dễ dàng di chuyển key từ cơ sở dữ liệu này sang cơ sở dữ liệu khác.
Redis được trang bị nhiều lệnh đặc biệt. Vì thế mà Redis rất nhanh trong quá trình lấy và ghi dữ liệu.
Tính năng Master – slave thích hợp cho người dùng muốn gia tăng sự an toàn cho dữ liệu, mở rộng hoặc thu hẹp không gian lưu trữ Data.
Người dùng có thể tìm kiếm dữ liệu nhanh chóng nhất.
Redis cho phép người dùng sử dụng linh hoạt nhiều kiểu dữ liệu khác nhau.
Người dùng có thể để key tự động xóa đi ở một thời gian nhất định nào đó.
Nhiều ưu điểm là thế, nhưng không phải Redis là một hệ thống lưu trữ dữ liệu hoàn hảo. Vậy nhược điểm của Redis là gì? Khi lượng file cache lớn thì máy chủ Server sẽ làm thiếu Ram.
Các kiểu dữ liệu được sử dụng trong Redis là gì?
Điểm cộng lớn của Redis là hỗ trợ lưu trữ nhiều kiểu dữ liệu khác nhau. Vậy những kiểu dữ liệu được sử dụng trong Redis là gì? Dưới đây là tổng hợp chi tiết:
String gồm có string, float hoặc integer. Hệ thống lưu trữ dữ liệu Redis hoàn toàn có thể làm việc với string, từng bộ phận của string hoặc dễ dàng tăng giảm giá trị của float hoặc integer.
List chính là danh sách liên kết của các strings, người dùng được hỗ trợ nhiều thao tác linh hoạt như Push, pop, tìm đọc các items có trong list. Bên cạnh đó, người dùng có thể tìm kiếm và xóa các giá trị trong thời gian ngắn.
Set: Redis có thể thêm, xóa, đọc tập hợp các string đã không được sắp xếp. Chưa hết, Redis giúp người dùng hỗ trợ tốt cho các phép toán tập hợp. Điển hình như intersect/union hoặc difference.
Hash: Redis lưu trữ hash table cho các cặp key và value. Trong hệ thống lưu trữ dữ liệu Redis, Key không được sắp xếp theo một trình tự nào cả. Đồng thời, Redis thực hiện thêm, xóa, đọc, ghi các giá trị.
Zset: Đây là một danh ách tập hợp của các phần tử. Trong đó, mỗi phần tử tập hợp là một map của 1 string và 1 score. Dựa vào Range của string hoặc score thực hiện thêm, xóa, ghi, đọc mỗi phần tử.
Các ứng dụng của Redis
Sau khái niệm redis là gì thì chúng ta hãy đi đến ứng dụng của Redis ngoài tính năng lưu trữ KEY-VALUE trên RAM thì Redis còn hỗ trợ tính năng xắp xếp, query, backup dữ liệu trên đĩa cứng cho phép bạn có thể phục hồi dữ liệu khi hệ thống gặp sự cố…và có thể nhân bản (Chạy nhiều Server Redis cùng lúc).
- Caching:Sử dụng làm bộ nhớ đệm. Chính tốc độ đọc ghi nhanh mà Redis có thể làm bộ nhớ đệm, nơi chia sẻ dữ liệu giữa các ứng dụng hoặc làm database tạm thời. Ngoài ra Redis có thể sử dụng để làm Full Page Cache cho website. Cũng vì tính nhất quán của Redis, cho dù restart Redis thì người dùng cũng không có cảm nhận chậm khi tải trang.
- Counter:Sử dụng làm bộ đếm. Với thuộc tính tăng giảm thông số rất nhanh trong khi dữ liệu được lưu trên RAM, sets và sorted sets được sử dụng thực hiện đếm lượt view của một website, các bảng xếp hạng trong game chẳng hạng. Redis hỗ trợ thread safe do đó nó có thể đồng bộ dữ liệu giữa các request.
- Publish/Suscribe (Pub/Sub):Tạo kênh chia sẻ dữ liệu. Redis hỗ trợ tạo các channel để trao đổi dữ liệu giữa publisher và subscriber giống như channel trongSocket Clusterhay topic trongApache Kafka. Ví dụ:Pub/Sub được sử dụng theo dõi các kết nối trong mạng xã hội hoặc các hệ thống chat.
- Queues:Tạo hàng đợi để xử lý lần lượt các request. Redis cho phép lưu trữ theo list và cung cấp rất nhiều thao tác với các phần tử trong list, vì vậy nó còn được sử dụng như một message queue.
Các kiểu dữ liệu trong Redis
Khác với RDMS như MySQL, hay PostgreSQL, Redis không có table (bảng). Redis lưu trữ data dưới dạng key-value. Thực tế thì memcache cũng làm vậy, nhưng kiểu dữ liệu của memcache bị hạn chế, không đa dạng được như Redis, do đó không hỗ trợ được nhiều thao tác từ phía người dùng. Dưới đây là sơ lược về các kiểu dữ liệu Redis dùng để lưu value.
– STRING: string, integer hoặc float. Redis có thể làm việc với cả string, từng phần của string, cũng như tăng/giảm giá trị của integer, float.
– LIST: List là một danh sách của strings, sắp xếp theo thứ tự insert. Redis có thể thêm một phần tử vào đầu hoặc cuối list. List phù hợp cho các bài toán cần thao tác với các phần tử gần đầu và cuối vì việc truy xuất này là cực nhanh, cho dù insert cả triệu phần tử. Tuy nhiên nhược điểm là việc truy cập vào các phần tử ở giữa list rất chậm.
– SET: tập hợp các string (không được sắp xếp). Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, kiểm tra sự xuất hiện của phần tử trong tập hợp. Ngoài ra Redis còn hỗ trợ các phép toán tập hợp, gồm intersect/union/difference.
– HASH: lưu trữ hash table của các cặp key-value, trong đó key được sắp xếp ngẫu nhiên, không theo thứ tự nào cả. Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, cũng như đọc tất cả giá trị.
–SORTED SET (ZSET): là 1 danh sách, trong đó mỗi phần tử là map của 1 string (member) và 1 floating-point number (score), danh sách được sắp xếp theo score này. Các phần tử của zset được sắp xếp theo thứ tự từ score nhỏ tới lớn.
Ngoài ra, Redis còn hỗ trợ các data types khác như: Bit arrays, HyperLogLogs, Streams. Để cài đặt bạn tham khảo docs của Redis nhé.
Để có thể quản lý được Redis bằng giao diện web các bạn có thể sử dụng công cụ phpRedisAdmin: //github.com/erikdubbelboer/phpRedisAdmin để quản lý các database.
Persistent redis là gì
Bên cạnh việc lưu key-value trên bộ nhớ RAM, Redis có 2 background threads chuyên làm nhiệm vụ định kỳ ghi dữ liệu lên đĩa cứng.
Có 2 loại file được ghi xuống đĩa cứng:
RDB (Redis DataBase file)
RDB thực hiện tạo và sao lưu snapshot của DB vào ổ cứng sau mỗi khoảng thời gian nhất định.
Ưu điểm
RDB cho phép người dùng lưu các version khác nhau của DB, rất thuận tiện khi có sự cố xảy ra.
Bằng việc lưu trữ data vào 1 file cố định, người dùng có thể dễ dàng chuyển data đến các data centers, máy chủ khác nhau.
Khi restart server, dùng RDB làm việc với lượng data lớn sẽ có tốc độ cao hơn là dùng AOF.
Nhược điểm
RDB không phải là lựa chọn tốt nếu bạn muốn giảm thiểu tối đa nguy cơ mất mát dữ liệu.
Thông thường người dùng sẽ set up để tạo RDB snapshot 5 phút 1 lần (hoặc nhiều hơn). Do vậy, trong trường hợp có sự cố, Redis không thể hoạt động, dữ liệu trong những phút cuối sẽ bị mất.
RDB cần dùng fork() để tạo tiến trình con phục vụ cho thao tác disk I/O. Trong trường hợp dữ liệu quá lớn, quá trình fork() có thể tốn thời gian và server sẽ không thể đáp ứng được request từ client trong vài milisecond hoặc thậm chí là 1 second tùy thuộc vào lượng data và hiệu năng CPU.
AOF (Append Only File)
AOF lưu lại tất cả các thao tác write mà server nhận được, các thao tác này sẽ được chạy lại khi restart server hoặc tái thiết lập dataset ban đầu.
Ưu điểm
Sử dụng AOF sẽ giúp đảm bảo dataset được bền vững hơn so với dùng RDB. Người dùng có thể config để Redis ghi log theo từng câu query hoặc mỗi giây 1 lần.
Redis ghi log AOF theo kiểu thêm vào cuối file sẵn có, do đó tiến trình seek trên file có sẵn là không cần thiết. Ngoài ra, kể cả khi chỉ 1 nửa câu lệnh được ghi trong file log (có thể do ổ đĩa bị full), Redis vẫn có cơ chế quản lý và sửa chữa lối đó (redis-check-aof).
Redis cung cấp tiến trình chạy nền, cho phép ghi lại file AOF khi dung lượng file quá lớn.
Nhược điểm
File AOF thường lớn hơn file RDB với cùng 1 dataset.
AOF có thể chậm hơn RDB tùy theo cách thức thiết lập khoảng thời gian cho việc sao lưu vào ổ cứng. Tuy nhiên, nếu thiết lập log 1 giây 1 lần có thể đạt hiệu năng tương đương với RDB.
Developer của Redis đã từng gặp phải bug với AOF (mặc dù là rất hiếm), đó là lỗi AOF không thể tái tạo lại chính xác dataset khi restart Redis. Lỗi này chưa gặp phải khi làm việc với RDB bao giờ.
Kết luận redis là gì?
Redislà một sự lựa chọn tuyệt vời khi ta cần đến một server lưu trữ dữ liệu đòi hỏi tính mở rộng cao (scaleable) và chia sẻ bởi nhiều tiến trình, nhiều ứng dụng và nhiều server khác nhau.