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