下载地址: https://github.com/wj596/go-mysql-transfer.git
编译运行同步数据到redis
#Linux在my.cnf文件
#Windows在my.ini文件
[mysqld]
# log_bin
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 go-mysql-transfer 的 slave_id 重复
# app.yml
redis_addrs: 127.0.0.1:6379 #地址,多个用逗号分隔
#redis_group_type: cluster # 集群类型 sentinel或者cluster
#redis_master_name: mymaster # Master节点名称,如果group_type为sentinel则此项不能为空,为cluster此项无效
#redis_pass: 123456 #redis密码
#redis_database: 0 #redis数据库 0-16,默认0。如果group_type为cluster此项无效
规则配置(使用lua脚本方式)
#规则配置
rule:
-
schema: gotest #数据库名称
table: t_user #表名称
lua_file_path: lua/t_user_redis.lua #lua脚本文件
go build
./go-mysql-transfer
实例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列的值
print(id)
print(userName)
local key = "user_"..id -- 定义key
if action == "delete" -- 删除事件
then
ops.DEL(key)
ops.SREM("user_set",userName)
else
local createTime = row["create_time"] --获取CREATE_TIME列的值
local result = {} -- 定义一个table
print(id)
print(createTime)
result["id"] = id
result["userName"] = userName
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