Redis面试真题总结(四)
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
AOF 持久化?
AOF(
Append Only File
)持久化是Redis提供的另一种数据持久化方法。通过AOF持久化,Redis将写操作追加到一个文件中
- 以保证数据在重启或者异常情况下的持久性。
AOF持久化工作原理:
追加写操作:
- 当有写操作(增删改)发生时,Redis会将这些写操作以文本的形式追加到AOF文件末尾。
文件同步:
- Redis会通过
fsync()
系统调用将AOF文件的内容强制刷写到磁盘上,以保证数据的持久性。- 可以通过配置
appendfsync
参数来调整同步频率
- 可以选择每次写入都同步(always)、每秒同步一次(everysec)或者操作系统自行决定(no)。
文件重写:
- 当AOF文件变得过大时,可以通过
BGREWRITEAOF
命令触发AOF文件的重写。- Redis会启动一个子进程,将当前内存中的数据重写到一个新的AOF文件中,并且优化写入操作,减小AOF文件的体积。
恢复数据:
- 在Redis重启的时候,会通过加载AOF文件中保存的写操作来恢复数据,重建内存中的数据状态。
AOF持久化的优点:
数据可靠性高:
- AOF持久化记录了写操作的历史记录,因此在异常断电或者重启时
- 可以通过AOF文件将数据快速恢复,避免了数据丢失的风险。
数据实时性高:
- 相比于RDB持久化的定期快照记录,AOF持久化会实时追加写操作到AOF文件中
- 因此对于实时性要求较高的应用场景更为适合。
可读性好:
- AOF文件以纯文本形式记录写操作,可以直接查看和修改AOF文件,方便进行恢复和数据分析。
AOF持久化的缺点:
文件体积较大:
- 由于AOF记录了所有的写操作历史,因此AOF文件会比RDB文件大,可能会占据更多的磁盘空间。
写入操作耗时:
- 由于每次写操作都需要追加到AOF文件中,相比于RDB持久化,AOF持久化会有一定的写入延迟,可能会影响Redis的性能。
文件重写需要时间:
- 当AOF文件变得过大时,进行AOF文件的重写是一项耗时的操作,可能会对Redis的性能产生一定影响。
Redis默认采用哪个持久化方式?
Redis默认采用的持久化方式是RDB(
Redis Database
)持久化。
- 在默认配置下,Redis将周期性地将内存中的数据生成快照并写入磁盘,以保证数据的持久性。
RDB持久化通过将数据以二进制的形式保存到磁盘的RDB文件中,包含了Redis数据的全量快照。
- 可以通过配置文件中的
save
参数来设置快照生成的条件
- 比如在指定的时间间隔内、指定的写操作次数等。
Redis 内存淘汰策略有哪些?
Redis提供了一些策略,以便在届满最大内存限制时进行内存淘汰:
noeviction:
- 当内存不足以容纳更多数据时,新的写入操作会报错。这是默认策略。
allkeys-lru:
- 在内存不足时让位于新值内容的,是最近最少使用的键(
LRU:Least Recently Used
)。volatile-lru:
- 在设置了过期时间的键中,淘汰最近最少使用的键,新的写入操作会报错。
allkeys-random:
- 在内存不足时随机删除某个键的值,为新值让出空间。
volatile-random:
- 在设置了过期时间的键中,随机淘汰一些键。
volatile-ttl:
- 在设置了过期时间的键中,有更早过期时间的键优先被淘汰。
如果你的程序可以接受偶发的性能下降,
allkeys-lru
可能是一个好选择。如果你知道一些键是可以安全删除的,你可以为它们设置过期时间,然后使用
volatile-lru
。如果数据的重要性不等,你可以为重要的数据设置过期时间,然后使用
volatile-ttl
策略。
Redis过期键的删除策略
Redis使用过期键的删除策略来自动清除已经过期的键,以释放内存空间。
Redis采用了多种策略来删除过期键,具体的删除策略由配置参数
eviction
决定。常见的策略包括:
定期删除策略(定时删除):
- Redis会在每个指定的时间间隔(由配置参数
hz
决定)内,检查一批键是否过期,然后删除过期的键。- 这种策略不会频繁地检查每个键是否过期,因此对CPU的消耗较少。
惰性删除策略(懒汉式删除):
- 当访问某个键时,Redis会先检查该键是否过期,如果过期则立即删除。
- 这种策略相对更加高效,因为它只会在需要时才进行检查和删除操作。
定期删除与惰性删除的结合:
- Redis同时使用了定期删除和惰性删除两种策略,在有限的时间间隔内通过定期删除来批量清除过期键
- 同时在读写操作中使用惰性删除来保证及时的清理。
需要注意的是,无论采用哪种删除策略,Redis并不是立即清除过期键
- 而是通过在查询和写入操作时进行过期键的检查和删除。
因此,在过期时间到达之后,过期键可能仍然存在一段时间,直到Redis执行删除操作。
- 如果需要确保即时删除过期键,可以使用
DEL
命令主动删除过期键。同时,可以通过配置参数
maxmemory
来限制Redis使用的内存大小
- 当达到内存限制时,Redis会根据所采用的删除策略来淘汰一些数据以释放内存空间。