Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Thực thi truy vấn Redis SQL dễ dàng không downtime

Chạy truy vấn Redis SQL không phải khó khăn. Tôi từng nêu vấn đề này vài năm trước khi nói chuyện với bạn quản lý giải pháp data warehouse tại công ty bán lẻ. Chúng ta bắt đầu nói về truy vấn Redis sau khi anh ấy giải thích vấn đề đang gặp.

"Chúng tôi gặp điểm đau với giải pháp data warehouse. Có use case cần ghi dữ liệu và thực hiện phân tích real-time. Tuy nhiên, đôi khi mất vài phút để có kết quả. Redis có giúp được không? Lưu ý chúng tôi không thể thay thế giải pháp SQL-based một lúc. Chỉ có thể tiến từng bước nhỏ."

Nếu bạn đang trong tình huống giống bạn tôi, tin tốt là có nhiều cách chạy truy vấn Redis và đưa Redis vào kiến trúc không làm gián đoạn giải pháp SQL hiện tại.

Hãy khám phá cách làm. Trước khi đi sâu, có contestant Redis Hackathon tạo app cho phép truy vấn dữ liệu Redis bằng SQL. Xem video dưới đây.

Tái cấu trúc bảng thành cấu trúc dữ liệu Redis

Ánh xạ bảng sang cấu trúc dữ liệu Redis khá đơn giản. Các cấu trúc dữ liệu hữu ích nhất:

  • Hash
  • Sorted Set
  • Set

Một cách: lưu mỗi dòng như Hash với key dựa trên primary key của bảng, và lưu key trong Set hoặc Sorted Set.

Hình 1 minh họa ánh xạ bảng sang cấu trúc Redis. Ví dụ bảng Products. Mỗi dòng ánh xạ sang Hash.

Dòng primary id 10001 vào Hash key: product:10001. Có hai Sorted Set: đầu tiên duyệt dataset theo primary key, thứ hai truy vấn theo giá.

Thực thi truy vấn Redis SQL dễ dàng không downtime

Với tùy chọn này, cần thay đổi code dùng truy vấn Redis thay vì lệnh SQL. Dưới đây ví dụ lệnh SQL và Redis tương đương:

A. Chèn dữ liệu

SQL: insert into Products (id, name, description, price) values = (10200, "ZXYW","Description for ZXYW", 300);
Redis: MULTI HMSET product:10200 name ZXYW desc "Description for ZXYW" price 300 ZADD product_list 10200 product:10200 ZADD product_price 300 product:10200 EXEC

B. Truy vấn theo product id

SQL: select * from Products where id = 10200
Redis: HGETALL product:10200

C. Truy vấn theo giá

SQL: select * from Product where price < 300
Redis: ZRANGEBYSCORE product_price 0 300

Trả về key: product:10001, product:10002, product:10003. Chạy HGETALL cho mỗi key.

HGETALL product:10001 HGETALL product:10002 HGETALL product:10003

Dùng DataFrames tự động ánh xạ bảng sang cấu trúc Redis

Nếu muốn giữ giao diện SQL trong giải pháp và chỉ thay data store bên dưới bằng Redis để nhanh hơn, có thể dùng Apache Spark và thư viện Spark-Redis.

Thư viện Spark-Redis cho phép dùng DataFrame APIs để lưu và truy cập dữ liệu Redis. Nghĩa là bạn insert, update, query bằng lệnh SQL, nhưng dữ liệu nội bộ ánh xạ sang cấu trúc Redis.

Thực thi truy vấn Redis SQL dễ dàng không downtime

Đầu tiên, tải spark-redis và build thư viện để lấy file jar. Ví dụ spark-redis 2.3.1, bạn được spark-redis-2.3.1-SNAPSHOT-jar-with-dependencies.jar.

Tiếp theo đảm bảo instance Redis chạy. Ví dụ chạy Redis localhost cổng mặc định 6379.
Bạn cũng chạy query trên Apache Spark engine. Ví dụ cách làm:

$ spark-shell --jars spark-redis-2.3.1-SNAPSHOT-jar-with-dependencies.jar
scala> import org.apache.spark.sql.SparkSession
scala> val spark = SparkSession
 .builder()
 .appName("redis-sql")
 .master("local[*]")
 .config("spark.redis.host","localhost")
 .config("spark.redis.port","6379").getOrCreate()
scala> import spark.sql
scala> import spark.implicits._
scala> sql("create table if not exists products(id string, name string, description string, price int) using org.apache.spark.sql.redis options (table 'product')")
scala> sql("insert into products values = ('10200','ZXYW','Description of ZXYW', 300)")
scala> val results = sql("select * from products")
scala> results.show()
+-----+----+-------------------+-----+
| id|name| description|price|
+-----+----+-------------------+-----+
|10200|ZXYW|Description of ZXYW| 300|
+-----+----+-------------------+-----+

Bây giờ cũng dùng Redis client truy cập dữ liệu như cấu trúc Redis:

127.0.0.1:6379> keys product*
1) "product:2e3f8611dbe94a588706a2aaea547caa"

Cách hiệu quả hơn dùng lệnh scan vì cho phép phân trang khi duyệt dữ liệu.

127.0.0.1:6379> scan 0 match product*
1) "3"
2) 1) "product:2e3f8611dbe94a588706a2aaea547caa"
127.0.0.1:6379> hgetall product:2e3f8611dbe94a588706a2aaea547caa
1) "name"
2) "ZXYW"
3) "price"
4) "300"
5) "description"
6) "Description of ZXYW"
7) "id"
8) "10200"

Vậy là xong – hai cách đơn giản chạy truy vấn Redis SQL không gián đoạn. Tiến xa hơn, bạn có thể đọc whitepaper Tại sao SQL Server của bạn cần Redis.

Nhưng về dữ liệu real-time với Redis, đây chỉ là một trong nhiều cách dùng Redis đảm bảo truyền dữ liệu real-time.

Nếu muốn khám phá Redis đảm bảo truyền dữ liệu real-time như thế nào, hãy liên hệ chúng tôi.