LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức phần mềm

Hướng dẫn cài đặt, cấu hình, kết nối, và kinh nghiệm sử dụng Redis

Hướng dẫn cài đặt, cấu hình, kết nối, sử dụng Redis và một số kinh nghiệm xử lý lỗi

Hướng dẫn cài đặt, cấu hình, kết nối, sử dụng Redis và một số kinh nghiệm xử lý lỗi

Chia sẻ bài viết
5
(6)

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.

Hướng dẫn cài đặt, cấu hình, kết nối, sử dụng Redis và một số kinh nghiệm xử lý lỗi
Hướng dẫn cài đặt, cấu hình, kết nối, sử dụng Redis và một số kinh nghiệm xử lý lỗi

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ảohttps://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:

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ữ:

  • NodeJs: Sử dụng thư viện redis
  • C/C++: Sử dụng thư viện hiredis

Có thể bạn quan tâm: Kiến thức lập trình

Nguồn: Tổng hợp

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 6

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

2 Bình luận

  1. 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

Trả lời

Giao diện bởi Anders Norén