## Redis with Lua script (Spring boot) - After Redis 2.6, Redis has provided a new feature that let us use Lua script to do some operations. - Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications. - If you had played with World of Warcraft, you may know lua script is used a lot in the game. - Lua's features - lightweight - multi-paradigm - atomic: If redis is running a lua script, it will not run another lua script at the same time. So please make sure you use the script carefully. - Find the practice project [here](https://github.com/mister33221/sprng-boot-spring--data-redis-lua-script-practice.git) ### Types of lua script - nil: It means null. - boolean: True or false. - number - string - table: It is a key-value data structure. ### Declare a variable - There are two ways to declare a variable in lua script. - local: It means the variable is only available in the current scope. - global: It means the variable is available in the whole script. - In a script for redis, try not to use global variable. Because local variable is more efficient than global variable. ### Type - table - Table is a key-value data structure. - It can store any type of data even like below. - table = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - table = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "hello", true, nil} - Example ```lua -- 創建一個 table local t = {} -- 給 table 添加元素 t["key"] = "value" t[1] = "one" t[2] = "two" -- 讀取 table 中的元素 print(t["key"]) -- 輸出 "value" print(t[1]) -- 輸出 "one" print(t[2]) -- 輸出 "two" ``` ### If statement - Example ```lua if condition then -- do something elseif condition then -- do something else -- do something end ``` - Eample with redis ```lua if redis.call("EXISTS", KEYS[1]) == 1 then return redis.call("GET", KEYS[1]) else return redis.call("SET", KEYS[1], ARGV[1]) end ``` ### For loop - In lua script, there are two ways to use for loop. - numeric for loop - generic for loop #### Numeric for loop - Example ```lua for i = 1, 10 do print(i) end ``` #### Generic for loop - Example ```lua local t = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for k, v in pairs(t) do print(k, v) end ``` - Example with redis ```lua local t = redis.call("KEYS", "*") for k, v in pairs(t) do redis.call("DEL", v) end ``` ### Return value - In lua, it can return multiple values. but in redis, don't suggest to return multiple values. Because it will make the script more complex.