分布式释放锁lua脚本:if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end
aof和rdb是redis的持久化机制, 用于服务宕机或突发意外时恢复数据.
rdb特征:
fork一个进程, 遍历hash table, 利用copy on write(写入时复制), 把整个db dump保存下来.
save, shutdown, slave 命令会触发这个操作。
粒度比较大, 如果在save, shutdown, slave之前宕机了, 则中间的操作没办法恢复.
同时也可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).
aof特征:
把写操作指令持续的写到一个类似日志文件里. (类似于从将数据库文件转储为结构和数据的SQL文件,只记录写操作)
粒度较小, 宕机之后, 只有宕机之前没有来得及日志的操作没方法恢复.
日志文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾
两者的区别就是, AOF是持续的用日志记录写操作, 宕机后利用日志恢复; RDB是平时写操作的时候不会触发写, 只有手动提交save命令, 或则是关闭命令时, 才触发备份操作.
rdb优点:
rdb 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份, 你可以设置一个间隔时间用以定期快照来备份数据.这样可以将数据还原到不同的版本.同时它非常适用于灾难恢复(disaster recovery). rdb可以最大化redis的性能, 在恢复大数据集时的是速度比aof速度要快.
缺点:
如果你要保证数据的完整性,不想在服务器故障时丢失数据,那么rdb不适合你. 你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据.
aof的优点:
aof持久化会让redis变得非常耐久(much more durable), aof默认的策略为每秒钟fsync一次, 在这种配置下, redis仍然可以保持良好的性能, 就算发生宕机,也最多丢失一秒钟的数据. aof文件是一个追加操作的日志文件(append only log), 即使日志因为某些原因而包含了未写入完整命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。
缺点:
对于相同的数据集来说, aof文件的体积通常要大于rdb文件的提及. 根据所使用的fsync策略, aof的速度可能会慢于rdb.AOF 在过去曾经发生过这样的 bug : 因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样。 (举个例子,阻塞命令 BRPOPLPUSH 就曾经引起过这样的 bug 。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数据来确保一切正常。 虽然这种 bug 在 AOF 文件中并不常见, 但是对比来说, RDB 几乎是不可能出现这种 bug 的。
rdb和aof应该用哪一个呢?
如何选择就得看系统是愿意牺牲性能换取更高的缓存一致性(aof), 还是愿意写操作频繁的时候, 不启用备份来换取更高的性能, 等手动运行的时候在做备份.(rdb) 偷偷告诉大家,其实这两者持久化方式能同时使用