使用Lua脚本可以实现更复杂的数据处理逻辑,go-mysql-transfer支持Lua5.1语法
# **示例**
t_user表,数据如下:
![](images/Redis8.png)
## **示例一**
Lua脚本:
```
-- t_user_redis.lua
local json = require("json") -- 加载json模块
local ops = require("redisOps") --加载redis操作模块
local row = ops.rawRow() --数据库当前变更的一行数据,table类型,key为列名称
local action = ops.rawAction() --当前数据库事件,包括:insert、updare、delete
local id = row["ID"] --获取ID列的值
local userName = row["USER_NAME"] --获取USER_NAME列的值
local key = "user_"..id -- 定义key
if action == "delete" -- 删除事件
then
ops.DEL(key)
ops.SREM("user_set",userName)
else
local password = row["PASSWORD"] --获取USER_NAME列的值
local createTime = row["CREATE_TIME"] --获取CREATE_TIME列的值
local result = {} -- 定义一个table
result["id"] = id
result["userName"] = userName
result["password"] = password
result["createTime"] = createTime
result["source"] = "binlog" -- 数据来源
local val = json.encode(result) -- 将newTable转为json
ops.SET(key,val) -- 对应Redis的SET命令,第一个参数为key(支持string类型),第二个参数为value
if action == "update" -- 修改事件
then
local oldRow = ops.rawOldRow() --数据库变更之前的数据(修改之前的数据)
local oldUserName = oldRow["USER_NAME"] --获取USER_NAME列的值
ops.SREM("user_set",oldUserName) -- 删除旧值
end
ops.SADD("user_set",userName) -- 对应Redis的SADD命令,第一个参数为key(支持string类型),第二个参数为value
end
```
引入脚本:
```
rule:
-
schema: eseap
table: t_user
lua_file_path: lua/t_user_redis.lua #lua脚本文件
```
同步到Redis的数据如下:
![](images/Redis9.png)
![](images/Redis10.png)
## **示例二,将talbe中的一行映射成一个HASH**
Lua脚本如下:
```
-- t_user_redis2.lua
local ops = require("redisOps") --加载redis操作模块
local row = ops.rawRow() --当前数据库的一行数据,table类型,key为列名称
local action = ops.rawAction() --当前数据库事件,包括:insert、updare、delete
if action == "insert" -- 只监听insert事件
then
local key = row["USER_NAME"] --获取USER_NAME列的值
local id = row["ID"] --获取ID列的值
local userName = row["USER_NAME"] --获取USER_NAME列的值
local password = row["PASSWORD"] --获取PASSWORD列的值
local createTime = row["CREATE_TIME"] --获取CREATE_TIME列的值
ops.HSET(key,"id",id) -- 对应Redis的HSET命令
ops.HSET(key,"userName",userName) -- 对应Redis的HSET命令
ops.HSET(key,"password",password) -- 对应Redis的HSET命令
ops.HSET(key,"createTime",createTime) -- 对应Redis的HSET命令
end
```
引入脚本:
```
rule:
-
schema: eseap
table: t_user
lua_file_path: lua/t_user_redis2.lua #lua脚本文件
```
同步到Redis的数据如下:
![](images/Redis11.png)
# **redisOps模块**
redisOps模块提供了操作Redis的方法,如下:
1. SET: Redis字符串命令,设置指定key的值。如:ops.SET(key,val)
2. DEL: Redis字符串命令,删除指定key的值。如:ops.DEL(key)
3. HSET: Redishash命令,设置哈希表key中的字段field的值。如:ops.HSET(key,field,val)
4. HDEL: Redishash命令,设置哈希表key中的字段。如:ops.HDEL(key,field)
5. RPUSH: Redis列表命令,将值插入到列表key的头部。如:ops.RPUSH(key,val)
6. LREM: Redis列表命令,移除列表key的值。如:ops.LREM(key,val)
7. SADD: Redis集合命令,向集合key添加值。如:ops.SADD(key,val)
8. SREM: Redis集合命令,移除集合key的值。如:ops.SREM(key,val)
9. ZADD: Redis有序集合命令,向有序集合key添加值。如:ops.ZADD(key,score,val)
10. ZREM: Redis有序集合命令,移除有序集合key的值。如:ops.ZREM(key,val)