redis主要由【dict】【expires】两个字典构成。dict负责键值对,expires保存键值对过期时间。
expires结构: { key:指针,指向键对象 value: longlong过期时间,毫秒为单位的UNIX时间戳 }
redis键总是一个字符串对象,value可以是任意redis对象类型
EXPIRE, PEXPIRE关键字设置过期
过期字典:expires字典保存了所有键的过期时间
{
key:指针,指向键对象
value: longlong过期时间,毫秒为单位的UNIX时间戳
}
所以可以通过过期dict里的value和当前unix时间戳比较,判断是否过期。
AOF:AOF写入:一个键过期,但是没被删除,对于AOF不会有影响。当惰性删除or定时删除后,程序向AOF追加一个DEL命令来删除.AOF重写:检查过期的键。 RDB:创建RDB时:对键检查,过期的不会载入到快照。载入RDB文件时:主服务器模式运行会检查键是否过期,从服务器模式不会。
快照式的持久化方法。
redis数据持久化时,现将数据写到临时文件,持久化结束后再用临时文件替换上次持久化好的文件。保证完整
是按照一定的策略周期性的将数据保存到磁盘。配置文件中的 save 参数来定义快照的周期
redis主进程进行数据处理,专门folk出一个子进程进行持久化,让主进程不参加IO
只追加,不改写。
将redis执行过的所有写指令记录到AOF文件中,下次redis重新启动时,只要把这些写指令从前到后重复执行一遍就可以数据恢复了。(默认一秒一次)AOF也是先写临时文件,再替换。
日志数据丢失怎么办:redis有redis-check-aof工具,防止追加日志时导致数据丢失。
日志文件太大怎么办:AOF文件大小超过阈值时,redis自动启动AOF文件重写,内容压缩。
aof数据的恢复完整度更高。rdb保存的有些数据可能不是最新的, 可能丢失数据。
AOF文件会越来越大。
AOF方式恢复的很慢。
如果不小心执行了FLUSHALL, 对数据进行了误删,导致数据清空,AOF可以恢复。(删除最后一个flushall命令,重启Redis)
处理过期不同:
{
AOF:AOF写入:一个键过期,但是没被删除,对于AOF不会有影响。当惰性删除or定时删除后,程序向AOF追加一个DEL命令来删除.AOF重写:检查过期的键。
RDB:创建RDB时:对键检查,过期的不会载入到快照。载入RDB文件时:主服务器模式运行会检查键是否过期,从服务器模式不会。
}