redis 持久化、过期策略和淘汰逐出策略

redis 目前支持的持久化方式

RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。
AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。
Redis的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。
两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据。

RDB快照方式:

  1. SAVE 模式:保存快照的同时,会停止redis服务,直到快照落地,才会重新开始提供服务。
  2. BGSAVE 模式:使用fork的方式拷贝redis内存,fork的同时会导致服务停止,但是间隔比较短,拷贝完内存后,redis重新提供服务,将内存数据落地,因为涉及到内存的拷贝,要求系统拥有和redis占用内存相同大小的空闲内存。

快照缺点:
只能恢复最近一次的快照,有部分数据出现丢失。

aof方式:

每次写入redis前,都会将操作写入内存缓冲区,然后以一定的策略刷至磁盘,恢复redis通过日子回放。

  1. always : Redis在每次有写操作发生时都会同步到硬盘,这种方式会给IO带来很大压力,实际中写入的速率要考虑硬盘的IO速率。
  2. everysec :Redis每1秒将日志同步到硬盘,这种方式性能较好,但也意为着如果Redis崩溃那么将丢失1秒的数据。
  3. no : Redis不主动控制内存缓存区和硬盘的同步,而由操作系统来控制。这种方式不可控,一般不采用。

aof缺点:
随着redis运行,持久化文件的体积会越来越大,redis恢复的时间越长。所以引入BGREWRITEAOF机制,相同key的操作和不断重写,减小文件体积,提高恢复速度。

BGREWRITEAOF 机制:
aof 存放所有key的值,redis会以一定的策略对aof进行压缩和rewrite,rewrite之后aof文件会保存keys的最后的状态,清除掉之前冗余的,来缩小这个文件。

过期策略:

  1. 定时过期:为每个设置过ttl的key都设置定时器,一旦到期立马设置为过期,缺点:cpu占用高
  2. 惰性过期:只有在访问key的时候才会设置过期,缺点:极端情况下内存浪费严重,无法得到有效利用
  3. 定期过期:每隔一段时间,扫描删除部分过期的key

目前redis同时使用2,3两种策略

淘汰策略

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,不逐出。
  2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

ps:淘汰策略和过期策略互不干扰。

你可能感兴趣的:(redis)