为什么在 Redis 实现 Lua 脚本事务

为什么在 Redis 实现 Lua 脚本事务


HUX布斯
浏览 1007回答 3
3回答

忽然笑

数据完整性从很多方面来看,Redis 很像当初采用 InnoDB 前的 MySQL。而 Redis 采用了一种很合理的方式来保证数据完整性(复制,AOF 等),并且从 Redis2.6 开始引入的 Lua 脚本在功能与易用性方面为 Redis 的成长提供了很大助力。相对来说,Lua 脚本与其他数据库中的存储过程很相似,但脚本的执行有些许不同。在本文中最重要的一点就是一旦将脚本写入数据库,它会一直执行直到以下任一种情况出现:1. 完成所有工作,所有写操作处理完成后脚本会自动退出。2. 脚本运行时出错并中途退出,所有以前执行的写操作都已发生,但不会再有其他写操作。3. Redis 通过 SHUTDOWN NOSAVE 关闭时(不保存)。4. 你附加了调试器来“使”脚本完成 #1 与 #2 (或其他手段来保证不会丢失数据)。对于使用数据库开发软件的人,我想你也认同只有情景 #1 是最理想的。情景 #2,#3,#4 都会导致数据异常(#2 与#4)和/或数据丢失(#3 和 #4)。如果你很重视数据,你应该尽可能地阻止数据异常与丢失。这不是哲学,而是工作(This is notphilosophy, this is doing your job)。但很遗憾目前的 Redis 也帮不了你多少。所以我决定改变这种情况。

富国沪深

为了将内存中的数据传送到磁盘上,我们需要使用交换文件。这些文件与数据持久性无关,Redis会在退出前会将它们全部删除。由于对交换文件的访问方式大多为随机访问,因此建议将交换文件存储在固态磁盘上,这样可以大大提高系统的运行效率。

守候你守候我

1. 完成所有工作,所有写操作处理完成后脚本会自动退出。2. 脚本运行时出错并中途退出,所有以前执行的写操作都已发生,但不会再有其他写操作。3. Redis 通过 SHUTDOWN NOSAVE 关闭时(不保存)。4. 你附加了调试器来“使”脚本完成 #1 与 #2 (或其他手段来保证不会丢失数据)。对于使用数据库开发软件的人,我想你也认同只有情景 #1 是最理想的。情景 #2,#3,#4 都会导致数据异常(#2 与 #4)和/或数据丢失(#3 和 #4)。如果你很重视数据,你应该尽可能地阻止数据异常与丢失。这不是哲学,而是工作(This is not philosophy, this is doing your job)。但很遗憾目前的 Redis 也帮不了你多少。所以我决定改变这种情况。
打开App,查看更多内容
随时随地看视频慕课网APP