Redis ngày càng được sử dụng phổ biến, đặc biệt cho các hệ thống lớn đòi hỏi hiệu năng cao. Bài này sẽ giúp bạn từng bước từ việ cài đặt, cấu hình, kết nối, và kinh nghiệm sử dụng Redis.
Mục lục
Giới thiệu về Redis
Redis (REmote DIctionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker. Redis hiện nay được ứng dụng rất nhiều, hay sử dụng làm trạm trung chuyển dữ liệu giữa các thành phần trong hệ thống, đặc biệt với những hệ thống đòi hỏi hiệu năng cao.
Các ứng dụng của Redis
- 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 trong Socket Cluster hay topic trong Apache 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
- 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.
Persistent redis
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. Mặc định 5 phút / lần (Ko nhớ rõ lắm). Nếu dữ liệu lớn, việc snapshot có thể sẽ làm chậm hệ thống.
- 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. 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.
Cài đặt trực tiếp
Về cơ bản bạn chỉ cần chạy các lệnh sau:
// Install sudo add-apt-repository ppa:redislabs/redis sudo apt update sudo apt install redis-server // Auto start sudo systemctl enable redis-server // Start service sudo service redis-server start // Test redis-cli
Hướng dẫn cài đặt Redis có rất nhiều, bạn có thể search thêm trên mạng.
Cài đặt thủ công
Trông trường hợp bạn cần cài đặt phiên bản xác định nào đó, bạn có thể sử dụng phương pháp thủ công bằng cách build từ mã nguồn:
Ví dụ lệnh cài đặt phiên bản 4.0.8:
sudo apt-get install build-essential libssl-dev wget //download.redis.io/releases/redis-4.0.8.tar.gz tar xvzf redis-4.0.8.tar.gz cd redis-4.0.8 make sudo make install
Cài đặt phiên bản 4.0.9:
sudo apt-get install build-essential libssl-dev wget //download.redis.io/releases/redis-4.0.9.tar.gz tar xvzf redis-4.0.9.tar.gz cd redis-4.0.9 cd deps make hiredis jemalloc linenoise lua geohash-int cd .. make sudo make install
Sau khi cài đặt xong, kiểm tra bằng lệnh:
redis-server -v redis-cli
Trong trường hợp cài thủ công mà bạn muốn chạy Redis dưới dạng Service, bạn cần phải cấu hình chạy bằng SystemD. SystemD mặc định có trên Ubuntu. Các bước thực hiện như sau:
Copy tệp redis.conf vào thư mục /etc/redis. Tạo tệp redis-server.service trong thư mục /etc/systemd/system:
sudo nano /etc/systemd/system/redis-server.service
Nội dung như sau:
[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli -a test@123 shutdown Restart=always [Install] WantedBy=multi-user.target
Ghi chú:
- Nhớ đảm bảo redis-server, redis-cli trong thư mục/usr/local/bin
- Nhớ đảm bảo tệp redis.conf trong thư mục /etc/redis
- Dòng “Restart=always” => Đảm bảo mỗi khi redis-server chết sẽ tự khởi động lại. Nếu không muốn khởi động lại thì bỏ dòng này đi
- Dòng “WantedBy=multi-user.target” => Đảm bảo redis-server được start ngay sau khi máy khởi động xong.
- Dòng User với Group để xác định user chạy => Nếu có dòng này bạn phải tạo user và group redis như dưới. Không thì không cần.
Trong trường hợp bạn muốn chạy dịch vụ thông qua 1 user khác, bạn phải user và group redis như sau:
sudo adduser --system --group --no-create-home redis sudo mkdir /var/lib/redis sudo chown redis:redis /var/lib/redis sudo chmod 770 /var/lib/redis
Nếu bạn muốn service chạy tự động mỗi khi server khởi động lại sử dụng lệnh sau:
sudo systemctl enable redis-server
Bạn muốn bỏ chế độ chạy này thì dùng lệnh sau:
sudo systemctl disable redis-server
Cách lệnh sau để thao tác vơi dịch vụ:
sudo systemctl start redis-server sudo systemctl stop redis-server systemctl status redis-server sudo service redis-server start sudo service redis-server stop service redis-server status
Cấu hình Redis
Thông thường tệp cấu hình của Redis ở vị trí: /etc/redis/redis.conf. Bạn cần thay đổi gì thì sửa trực tiếp tệp này. Có hai cấu hình hay được thay đổi nhất đó là:
- Cấu hình cho phép server khác có thể kết nối tới Redis: bind 127.0.0.1 -::1 Đổi thành: bind 0.0.0.0 -::1
- Cấu hình yêu cầu Client phải xác thực: Uncomment cho dòng sau, mật khẩu foobared tùy bạn thay đổi cho phù hợp: requirepass foobared
Sau khi sửa xong thì restart Redis bằng lệnh:
sudo apt-get install build-essential libssl-dev wget //download.redis.io/releases/redis-4.0.8.tar.gz tar xvzf redis-4.0.8.tar.gz cd redis-4.0.8 make sudo make install
0
Các lỗi gặp khi cài đặt Redis
Thường hay xảy ra khi bạn cài đặt theo cách thủ công hoặc do bạn thay đổi các configure nào đó. Chứ cài đặt và sử dụng các cấu hình mặc định thì rất khó xảy ra các lỗi kiểu này.
Redis can’t set maximum open files to 10032 because of OS error: Operation not permitted
Khi chạy redis service thấy okie, telnet tới cổng 6379 okie nhưng không thực hiện các lệnh được, kết nối bằng redis-cli cũng không được. Khi kiểm tra log của Redis (/var/log/redis/redis-server.log) thì thấy có dòng lỗi như sau: …
Sử dụng redis-cli thì kết nối được nhưng sử dụng Redis Desktop Manager hoặc ứng dụng kết nối thì lỗi
Tham khảo: //stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots
Lỗi này do Lỗi cấu hình cấu hình liên quan tới việc lưu RDB snapshots Vào redis-cli, sau đó đánh lệnh sau:
sudo apt-get install build-essential libssl-dev wget //download.redis.io/releases/redis-4.0.8.tar.gz tar xvzf redis-4.0.8.tar.gz cd redis-4.0.8 make sudo make install
1
Lỗi không stop được Redis
Khi stop Redis rất lâu, khi check status thấy lỗi:
sudo apt-get install build-essential libssl-dev wget //download.redis.io/releases/redis-4.0.8.tar.gz tar xvzf redis-4.0.8.tar.gz cd redis-4.0.8 make sudo make install
2
Lỗi này do Redis không có quyền lưu dữ liệu xuống HDD. Nguyên nhân lỗi này thường do Redis không có quyền lưu dữ liệu. Có hai cách sửa:
Cách 1: Xem redis.service trong thư mục /lib/systemd/system hoặc /etc/systemd/system Tìm tệp config của Redis => /etc/redis/redis.conf Xem user và group chạy service này: User=redis Group=redis Mở tệp redis.conf xem “The working directory” với key là dir => dir /etc/redis Chuyển thư mục này sang thuộc quyền sở hữu của user redis: sudo chown redis:redis -R /etc/redis
Cách 2: Sửa tệp redis.service trong thư mục /lib/systemd/system hoặc /etc/systemd/system Bỏ hai dòng dưới để Redis chạy với user root. User=redis Group=redis
Kinh nghiệm sử dụng Redis
Một số lệnh thao tác với Redis-Cli
redis-cli là một công cụ giống như 1 Client cho phép người dùng gõ các lệnh để thao tác với Redis. Thường những người có nhiều kinh nghiệm sử dụng Redis họ đều nhớ hầu hết các lệnh này.