Sử dụng Lua script trên redis
Redis
10
White

LinhPT viết ngày 18/02/2016

Chắc các bạn nào đã sử dụng redis đều thấy đây là một database rất thú vị. Vậy các bạn có biết là redis có thể chạy script trên nó?
Chạy script trên redis đồng nghĩa với việc giả dụ bạn có một đoạn logic sau:

get something in db
check 
increment by N
push back to db

thi thông thường bạn sẽ tốn 2 request : 1 để lấy dữ liệu và 1 để push back lại dữ liệu.
Vậy nếu đoạn logic trên được thực hiện ở "bên trong" database thì sẽ chỉ tốn 1 lần request thôi. Và sẽ có nhiều thứ database sẽ giúp bạn optimize.

Redis hỗ trợ việc đó thông qua LUA script, và cơ bản thông qua việc sử dụng hàm EVAL.

Cách thực hiện rất đơn giản, bạn bật redis-cli lên và chạy:

eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

Ở đoạn code ở trên thì

  • Bên trong quote "" là nội dung của lua script (viết bằng ngôn ngữ LUA, bạn có thể tham khảo về LUA tại đây).
  • Số 2 đằng sau quote là số parameter mô tả Redis key names (ở đây chính là là key1 và key2)
  • Sau key1 và key2 sẽ là các parameter không mô tả key names
  • Các parameter mô tả keynames sẽ được access bên trong LUA script dưới hình thức một phần tử trong array KEY, và các parameter còn lại sẽ được access bên trong LUA script dưới dạng một phần tử trong array ARGV
  • Tại sao lại không dùng chung parameter cho KEYARGV??? Câu trả lời là khi bạn set key cho redis bên trong LUA script thì key đó sẽ chỉ dùng được thông qua KEY parameter

Bạn làm được gì với LUA script??

  1. Bạn có thể access được redis instance thông thông qua biến cùng tên và có thể làm những gì mà redis có thể làm được như insert, update, xoá dữ liệu. Bạn cứ tưởng tượng có một cái redis-cli "bên trong code" để thích làm gì thì làm

Ví dụ

eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
  1. Bạn có thể viết được các logic với full syntax của LUA ví dụ như:
    • Tạo variable với các type khác nhau như number, string...
    • Error handling
    • Control expression như if else while...
    • Arithmetic operation như cộng trừ nhân chia , bitwise...

Ngoài ra

  1. Bạn có thể register một script lên server và gọi nó sau

    > set foo bar
    OK
    > eval "return redis.call('get','foo')" 0
    "bar"
    > evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0
    "bar"
    > evalsha ffffffffffffffffffffffffffffffffffffffff 0
    (error) `NOSCRIPT` No matching script. Please use [EVAL](/commands/eval).
    
  2. Bạn có thể thao tác với những script đã được register thông qua hàm SCRIPT trên redis-cli

    SCRIPT FLUSH
    SCRIPT EXISTS sha1 sha2 ... shaN
    SCRIPT LOAD script
    SCRIPT KILL
    

Happly redis-ing, yo yo, chúc mừng năm mới.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

LinhPT

20 bài viết.
62 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
37 3
Mình thi thoảng phải quản lý linux server, mà trong đó có một số thao tác quản lý quan trong như quản lý đĩa cứng, quản lý mạng, quản lý đường truy...
LinhPT viết gần 3 năm trước
37 3
White
25 2
(Ảnh) Tiêu đề chỉ là câu khách :v, thực ra là có một vài điểm về mysql explain mà chắc chưa nhiều bạn biết, tớ cũng hay quên nên note lại cho nhớ ...
LinhPT viết gần 3 năm trước
25 2
White
18 0
Bài viết được dịch từ http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 Điều cần nhớ trước khi đánh bất kì câu lệnh nào ①Để tránh làm nặng...
LinhPT viết 1 năm trước
18 0
Bài viết liên quan
White
3 0
Mở đầu Chắc hẳn các bạn đã biết về các dịch vụ rút gọn url, điển hình là bit.ly. Mục đích của dịch vụ này là nhằm thu gọn là những url rất dài để ...
huydx viết hơn 3 năm trước
3 0
White
23 5
1. Giới thiệu Redis]] là hệ thống lưu trữ keyvalue với rất nhiều tính năng và được sử dụng rộng rãi]]. Redis nổi bật bởi việc hỗ trợ nhiều cấu trú...
Bùi Hồng Hà viết hơn 3 năm trước
23 5
White
2 2
Chuẩn bị Update thư viện: sudo aptget update Cài trình biên dịch (nếu chưa có) sudo aptget install buildessential Cài tcl
Vũ Hoàng Chung viết gần 3 năm trước
2 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
20 bài viết.
62 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!