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.
Hướng dẫn cài đặt REDIS
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 http://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 http://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 service redis-server restart
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: https://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:
config set stop-writes-on-bgsave-error no
Lỗi không stop được Redis
Khi stop Redis rất lâu, khi check status thấy lỗi:
Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:signal-handler (1530243631) Received SIGTERM scheduling shutdown... Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:M 28 Jun 23:40:31.641 # User requested shutdown... Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:M 28 Jun 23:40:31.641 * Saving the final RDB snapshot before exiting. Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:M 28 Jun 23:40:31.642 # Failed opening the RDB file dump.rdb (in server root dir /etc/redis) for saving: Permission denied Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:M 28 Jun 23:40:31.642 # Error trying to save the DB, can't exit. Jun 28 23:40:31 ubuntu redis-server[16698]: 16698:M 28 Jun 23:40:31.643 # SIGTERM received but errors trying to shut down the server, check the logs for more information Jun 28 23:41:42 ubuntu systemd[1]: redis.service: Main process exited, code=killed, status=9/KILL Jun 28 23:41:42 ubuntu systemd[1]: Stopped Redis In-Memory Data Store. Jun 28 23:41:42 ubuntu systemd[1]: redis.service: Unit entered failed state. Jun 28 23:41:42 ubuntu systemd[1]: redis.service: Failed with result 'signal'.
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.
Bạn chỉ cần đánh lệnh sau để vào màn hình terminal:
redis-cli
Redis-Cli sẽ hiển thị giao diện ở chế độ lệnh, bạn nhập các lệnh thao tác với Redis ở đây.
Ngoài ra bạn có thể chạy trực tiếp lệnh mà không qua terminal bằng cú pháp sau:
redis-cli -a <password> <redis-command>
Các lệnh thông dụng:
// Liệt kê tất cả key keys * // Lấy dữ liệu 1 key get <tên_key> // Subcribe tất cả các kênh psubscribe '*' // Subcribe một kênh: subscribe <tên_kênh> // Publish dữ liệu tới kênh publish <tên_kênh> 'data' // Lệnh xóa tất cả key Redis flushall flushall async // Xóa các key theo pattern redis-cli -a passtest KEYS "*config_*" | xargs redis-cli -a passtest DEL // Lệnh lấy độ dài queue llen queue_data_test
Các công cụ giao diện hỗ trợ Redis
Hiện có nhiều công cụ giao diện hỗ trợ thao tác với Redis:
- Redis Desktop Manager (Windows)
- Redis Insight (Ubuntu)
- PHP Redis Admin (Web)
Lập trình kết nối tới Redis
Thực tế rất nhiều ngôn ngữ hỗ trợ Redis, ở đây tôi mới sử dụng 2 ngôn ngữ:
Có thể bạn quan tâm: Kiến thức lập trình
Nguồn: Tổng hợp
Nguyễn Ngọc Thành
Cho mình hỏi muốn redis-server đọc 2 file .rdb thì cấu hình kiểu gì ạ. Trong file redis.conf có tham số dbfilename chỉ cho phép 1 file .rdb. Khi file .rdb lớn mình cấu hình dbfilename sang file dump mới, thì làm thế nào để redis-server vẫn đọc được file dump cũ. Cảm ơn bạn
Online Kiếm Tiền
Mình chưa gặp trường hợp này nên không biết để trả lời bạn