由于MySQL默认的结束分隔符是分号(;),如果我们在BEGIN...END中出现了分号,将被标记成结束,此时没法完成触发器的定义。有一个办法,可以调用DELIMITER命令来暂时修改结束分隔符,用完再改会分号即可。比如改成$:
mysql> DELIMITER $
我们开始定义一个触发器,监听对Student表的插入操作,Student表在上一篇文章中创建的,可以查看上一篇文章。
mysql > DELIMITER $ tg_student > AFTER INSERT on Student > FOR EACH ROW (, new.Sid), , CAST(new.Sid AS CHAR(8)))); (, new.Sid), , CAST(new.Sname AS CHAR(20)))); (, new.Sid), , CAST(new.Sage AS CHAR))); (, new.Sid), , CAST(new.Sgen AS CHAR))); (, new.Sid), , CAST(new.Sdept AS CHAR(10)))); > END $
创建完触发器可以通过show查看,或者drop删除:
mysql> SHOW TRIGGERS;
mysqltg_student;
接下来我们调用一句插入语句,然后观察Redis和MySQL数据的变化:
mysqlStudent , , , ); Query OK, 1 row affected (0.27 sec)
MySQL的结果:
mysql Student; Sid Lucy F Rose F zhsuiy F daemon M David M zhxilin M rows in set (0.00 sec)
Redis的结果:
127.0.0.1:6379> HGETALL stu_09388165 1) "id" 2) "09388165" 3) "name" 4) "Rose" 5) "age" 6) "19" 7) "gender" 8) "F" 9) "department" 10) "SS3-205"
以上结果表明,当MySQL插入数据时,通过触发器调用UDF,实现了自动刷新Redis的数据。另外,调用MySQL插入的命令,可以通过C++实现,进而就实现了在C++的业务逻辑里,只需调用MySQL++的接口就能实现MySQL数据库和Redis缓存的更新,这部分内容在上一篇文章已经介绍过了。
总结
通过实践,能体会到MySQL和Redis是多么相亲相爱吧!^_^
本篇文章讲了从最基础的UDF开始,再到通过UDF连接Redis插入数据,再进一步介绍通过MySQL Trigger自动更新Redis数据的整个思路,实现了一个目标,即只在业务代码中更新MySQL数据库,进而Redis能够自动同步刷新。
MySQL对UDF函数和触发器的支持,使得实现Redis数据和MySQL自动同步成了可能。当然UDF毕竟是通过插件的形式运行在MySQL中的,并没有过多的安全干预,一旦插件发生致命性崩溃,有可能MySQL也会挂,所以在编写UDF的时候需要非常谨慎!