缓存中间件会利⽤磁盘做持久化
为了避免内存中的数据在服务器重启或发生意外宕机后丢失,许多缓存中间件(如Redis、Memcached等)提供了数据持久化功能,即将内存中的数据定期或在特定条件下写入到硬盘中。持久化可以帮助系统在故障恢复后快速恢复缓存数据,减少对数据库的直接访问压力,从而提高系统的整体性能和可用性。
对于Redis而言,提供了两种主要的持久化方式:
-
RDB (Redis Database): RDB持久化是通过在指定的时间间隔内,或者满足一定条件(如达到一定数量的写入操作)时,生成数据的快照(snapshot),将内存中的数据序列化成二进制文件dump.rdb,保存在磁盘上。这种方式的优点是文件紧凑,恢复速度快,缺点是在两次持久化期间可能发生的数据丢失。
-
AOF (Append Only File): AOF持久化是将每一次写操作以指令的方式追加到单独的日志文件中,随着写操作的执行,日志文件不断增长。在Redis重启时,会按照AOF日志文件中的指令顺序重新执行一遍,以恢复数据。AOF持久化相比于RDB提供了更好的数据安全性,因为默认配置下它会每隔一秒fsync一次磁盘,丢失的数据相对较少,但缺点是文件可能会变得较大,且恢复速度相对较慢。
通过这两种持久化机制的合理配置和使用,Redis能够在保持高性能的同时,有效地保护内存中的数据免受临时性故障的影响。当然,尽管进行了持久化,但缓存服务的主要目的仍然是加速数据访问,因此重要数据应当始终在底层数据库中备份一份。
缓存的基本思想
缓存中的数据通常存储于内存中,因此访问速度⾮常快。为了避免内 存中的数据在重启或者宕机之后丢失,很多缓存中间件会利⽤磁盘做持久化。也就是说,缓存相⽐较于我们常⽤的关系型数据库(⽐如 MySQL)来说访问速 度要快⾮常多。为了避免⽤户请求数据库中的数据速度过于缓慢,我们可以在数 据库之上增加⼀层缓存。
缓存的分类
- 本地缓存 这个实际在很多项⽬中⽤的蛮多,特别是单体架构的时候。数据量不⼤,并且没 有分布式要求的话,使⽤本地缓存还是可以的。 本地缓存位于应⽤内部,其最⼤的优点是应⽤存在于同⼀个进程内部,请求本地 缓存的速度⾮常快,不存在额外的⽹络开销。
- 分布式缓存 我们可以把分布式缓存(Distributed Cache) 看作是⼀种内存数据库的服务, 它的最终作⽤就是提供缓存数据的服务。 分布式缓存脱离于应⽤独⽴存在,多个应⽤可直接的共同使⽤同⼀个分布式缓存服务。 使⽤分布式缓存之后,缓存服务可以部署在⼀台单独的服务器上,即使同⼀个相 同的服务部署在多台机器上,也是使⽤的同⼀份缓存。 并且,单独的分布式缓存 服务的性能、容量和提供的功能都要更加强⼤。 简单来说,为系统引⼊分布式缓存之后往往会带来下⾯这些问题: 系统复杂性增加 :引⼊缓存之后,你要维护缓存和数据库的数据⼀致性、维 护热点缓存、保证缓存服务的⾼可⽤等等。 系统开发成本往往会增加 :引⼊缓存意味着系统需要⼀个单独的缓存服务, 这是需要花费相应的成本的,并且这个成本还是很贵的,毕竟耗费的是宝贵的内存。
- 多级缓存 比如本地缓存 + 分布式缓存 的多级缓存⽅案。⼀般情况下,我们也是不建议使⽤多级缓存的,这会增加维护负担(⽐如 你需要保证⼀级缓存和⼆级缓存的数据⼀致性),并且,实际带来的提升效果对 于绝⼤部分项⽬来说其实并不是很⼤。 多级缓存⽅案中,第⼀级缓存(L1)使⽤本地内存(⽐如 Caffeine)),第⼆级 缓存(L2)使⽤分布式缓存(⽐如 Redis)。读取缓存数据的时候,我们先从 L1 中读取,读取不到的时候再去 L2 读取。这样可以降低 L2 的压⼒,减少 L2 的 读次数。并且,本地内存的访问速度是最快的,不存在什么⽹络开销。
来自文档——Redis 基础:为什么要⽤分布式缓存?