Redis

**Redis** (/ˈrɛdɪs/; từ viết tắt của **Remote Dictionary Server**) là một cơ sở dữ liệu phân tán trong bộ nhớ, được sử dụng như một cơ sở dữ liệu đệm lưu dữ liệu dạng cặp khóa-giá trị (key-value cache) thông qua các message broker trong bộ nhớ, trong khoảng thời gian tùy chọn.

Redis hỗ trợ nhiều loại cấu trúc dữ liệu trừu tượng khác nhau, như chuỗi, danh sách, bản đồ, tập hợp, tập hợp có sắp xếp, HyperLogLogs, bitmap, streams và các index không gian (spatial indices). Dự án này được phát triển và bảo trì bởi Salvatore Sanfilippo, bắt đầu từ năm 2009. Từ năm 2015 đến năm 2020, ông đã dẫn dắt một nhóm nhân sự cốt lõi của dự án được tài trợ bởi Redis Labs. Salvatore Sanfilippo rời khỏi Redis vào năm 2020. Redis hiện là phần mềm mã nguồn mở được phát hành theo giấy phép BSD 3-clause. Năm 2021, không lâu sau khi tác giả ban đầu và nhà bảo trì chính rời khỏi dự án, Redis Labs đã xóa từ "Labs" khỏi tên và hiện được biết đến đơn giản là "Redis".

## Khái quát
Redis là một dạng cơ sở dữ liệu được phát triển trên ý tưởng về một hệ thống vừa có thể được là hệ lưu trữ dữ liệu vừa có thể là một bộ đệm cùng một lúc. Nó được thiết kế sao cho dữ liệu luôn được sửa đổi và đọc từ bộ nhớ chính của máy tính, tuy nhiên nó cũng hỗ trợ lưu trữ trên đĩa nhưng ở định dạng không phù hợp để truy cập dữ liệu ngẫu nhiên. Định dạng dữ liệu lưu trữ được thiết kế để có thể tái định dạng tái cấu trúc vào bộ nhớ sau khi hệ thống khởi động lại.

Với cách tổ chức này, Redis cung cấp một mô hình dữ liệu rất khác thường so với hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS). Các lệnh truy vấn của người dùng không mô tả để được thực thi bởi công cụ từ engine của cơ sở dữ liệu mà chỉ là các toán tử trên các loại dữ liệu trừu tượng đã cho. Để có thể hoạt động như một bộ đệm, dữ liệu phải được lưu trữ theo cách phù hợp sau này để truy xuất nhanh nhất. Việc truy xuất được thực hiện mà tức thời mà không cần sự trợ giúp từ hệ thống cơ sở dữ liệu dưới dạng chỉ mục (index), truy vấn phức hợp (aggregation) tập hợp hay các kiểu truy vấn phổ biến khác của RDBMS truyền thống. Thay vào đó Redis được triển khai sử dụng nhiều lệnh gọi hệ thống gọi là fork, để nhân bản các tiến trình lưu trữ dữ liệu, việc này cho phép trình cha tiếp tục phục vụ truy vấn từ máy khách trong khi tiến trình con vẫn thực hiện tạo bản sao dữ liệu trong bộ nhớ trên đĩa.

Redis nhanh chóng trở thành cơ sở dữ liệu lưu trữ dạng key-value phổ biến nhất theo bảng xếp hạng DB-Engines ranking của Solid IT.

## Ngôn ngữ hỗ trợ
Từ phiên bản 2.6, Redis hỗ trợ ngôn ngữ scripting phía server-side là Lua.

Các ngôn ngữ lập trình được hỗ trợ phía client-side rất nhiều bao gồm:

* ActionScript
* C
* C++
* C#
* Clojure

* Common Lisp
* Dart
* Erlang
* Go
* Haskell

* Haxe
* Io
* Java
* Fibjs
* Node.js
* Lua

* Objective-C
* Perl
* PHP
* Pure Data
* Python

* R
* Ruby
* Scala
* Smalltalk
* Tcl
Ví dụ code client sử dụng Redis trên Python:
```python
import redis

# Connect to Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)

# Set a value in Redis
redis_client.set('my_key', 'my_value')

# Get a value from Redis
value = redis_client.get('my_key')
print(value)
```


## Kiểu dữ liệu
Redis ánh xạ khóa key tới các loại giá trị khác nhau. Một điểm khác biệt quan trọng giữa Redis và các hệ thống lưu trữ có cấu trúc khác là Redis không chỉ hỗ trợ dữ liệu kiểu chuỗi mà còn cả các kiểu dữ liệu trừu tượng khác như:

* Danh sách chuỗi (List of string)
* Tập hợp chuỗi (Set of string), đây là tập hợp các giá trị chưa sắp xếp và không lặp lại
* Tập hợp chuỗi có xắp xếp, đây là tập hợp các giá trị không lặp lại được sắp xếp theo trọng số
* Bảng mã băm (Hash table)
* HyperLogLogs, đây là kiểu dữ liệu dùng để ước tính xấp xỉ giá trị cardinality, được Redis đưa ra từ phiên bản 2.8.9 vào tháng 4 năm 2014.
* Luồng đối tượng (Stream of entries), cho phép lưu trữ các trường giá trị và chuỗi tự động theo trình tự thời gian ở từng khóa key, được Redis đưa ra từ phiên bản 5.0 vào tháng 10 năm 2018
* Dữ liệu không gian (Geospatial data) được triển khai sử dụng kỹ thuật geohash, được Redis đưa ra từ phiên bản 3.2.

Kiểu của một value sẽ xác định các toán tử (hay lệnh) nào có thể được sử dụng với nó. Redis hỗ trợ các tập lệnh hở mức cao phía  server-side như các lệnh giao cắt (intersection), tập hợp (union) và tìm tâp khác biệt (difference) giữa các kiểu tập hợp không sắp xếp, danh sách và các tập hợp có sắp xếp.

Một số kiểu dữ liệu khác được hỗ trợ qua Redis Modules API như:

* JSON – RedisJSON triển khai trên chuẩn ECMA-404 (chuẩn JavaScript Object Notation Data Interchange Standard) như một dạng dữ liệu native.
* Graph – RedisGraph triển khai truy vấn graph trên thuộc tính
* Time series – RedisTimeSeries triển khai các cấu trúc dữ liệu theo thời gian (time series data structure)
* Bloom filter, Cuckoo filter, Count–min sketch, và Top-K – RedisBloom triển khai tập hợp dữ liệu cấu trúc xác suất trên Redis

## Tham khảo