Redis持久化与过期机制

文章目录

  • Redis持久化与过期机制
    • 1. 持久化机制
      • 1.1 RDB(默认)
      • 1.2 AOF
    • 2. 过期机制
      • 2.1 根据过期策略删除数据
      • 2.2 当内存过大装不下新数据时,将启用淘汰机制
    • 3. 其他
      • 3.1 Redis快的原因
      • 3.2 如何解决缓存穿透、缓存击穿、缓存雪崩?
      • 3.3 应该为什么样的数据提前做缓存?

Redis持久化与过期机制

1. 持久化机制

1.1 RDB(默认)

  • 机制
    • 指定时间内、指定次数写操作 -> 会将内存中的数据写入磁盘(dump.rdb文件)
    • 重启Redis将会加载磁盘中已持久化的数据
  • 优点:恢复速度快,适用于大多数场景
  • 缺点:数据的数据完整性、一致性不高(因为如果内存中的数据写入磁盘之前,程序挂了或者宕机,会导致新的数据没有被持久化)

1.2 AOF

  • 机制
    • 将每个写操作以日志的方式记录并追加到文件中
    • 重启Redis将会读取日志文件进行恢复
  • 优点:数据的完整性、一致性更高
  • 缺点:日志记录较多,恢复速度慢

2. 过期机制

2.1 根据过期策略删除数据

  • 定时删除:内存占用低,CPU消耗高。每100ms进行一次随机抽样(100个key),删除过期的key。如果删除的key超过抽样总数的25%(即25个),那么立即进行下一次抽样检查。
  • 惰性删除:内存占用高,CPU消耗低。当key被访问时,才检查key是否过期,如果过期则删除这个key,并返回空。
  • 定期删除:定时删除与惰性删除的结合版。如果删除频次较高,转为定时删除,如果删除频次较低,转为惰性删除。

2.2 当内存过大装不下新数据时,将启用淘汰机制

  • 一般为了防止Redis占用内存过大,影响整个服务器,会设置其最大内存值,即maxmemory
  • 当内存超过maxmemory时,将根据maxmemory_policy释放内存
    • noeviction:写入新数据时,直接报错
    • allkeys-lru:写入新数据时,删除所有数据中最近最少使用的key
    • allkeys-lfu:写入新数据时,删除所有数据中使用频次最少的key
    • allkeys-random:写入新数据时,随机删除所有数据中的key
    • volatile-lru:写入新数据时,删除设置了过期时间的数据中最近最少使用的key
    • volatile-lfu:写入新数据时,删除设置了过期时间的数据中使用频次最少的key
    • volatile-random:写入新数据时,随机删除设置了过期时间的数据中的key
    • volatile-ttl:写入新数据时,优先删除过期时间较早的key
  • 补充
    • LRU -> least recently used
    • LFU -> least frequently used

3. 其他

3.1 Redis快的原因

  • 纯内存操作
  • epoll是单线程,没有多线程的加锁以及切换(Redis6开始支持多线程I/O)

3.2 如何解决缓存穿透、缓存击穿、缓存雪崩?

  • 缓存穿透 ->
    • 布隆过滤器
  • 缓存击穿 ->
    • 去数据库(例如MySQL)取值时,先在Redis中为该key设置一个占位值,这样后续大量针对该key的请求就不会直接传到后面的数据库
    • 二级缓存
    • 分布式锁(Redis、Zookeeper)
  • 缓存雪崩 ->
    • 为Redis生成带过期时间的key时,给一个随机的浮动时间,防止同一时间大量key一起过期
  • 另外,内存足够的话,建议将热门数据设置无过期时间

3.3 应该为什么样的数据提前做缓存?

  • 这个和具体的业务相关,要根据实际场景来分析
  • 提前做好缓存是为了降低后面到来的流量高潮导致的压力
  • 注意:这里主要强调提前做缓存,是主动的。内存足够时,建议直接设置无过期或是较长的过期时间。
  • 举例(主要是可预测的热点数据)
    • 电商中促销活动商品的数据
    • 节日相关的商品的数据
    • 实时热点文章的数据
    • 热搜词相关的商品的数据
    • 新上映的电影相关的数据

你可能感兴趣的:(DataBase,Redis,持久化,过期机制,过期策略)