Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Sử dụng Lua script trên redis
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 arrayARGV
- Tại sao lại không dùng chung parameter cho
KEY
vàARGV
??? 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??
- 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
- 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
-
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).
-
Bạn có thể thao tác với những script đã được register thông qua hàm
SCRIPT
trên redis-cliSCRIPT FLUSH SCRIPT EXISTS sha1 sha2 ... shaN SCRIPT LOAD script SCRIPT KILL
Happly redis-ing, yo yo, chúc mừng năm mới.







