Redis

September 13, 2023 作者: yijianhao 分类: 默认分类 浏览: 85 评论: 0

redis可以用在数据库、缓存、消息代理和Stream引擎, 是一个开源的(BSD许可的)内存数据结构存储。

Redis 的数据类型

  • String 字符串

  • Lists

  • Sets

  • Hashes

  • Sorted sets

  • Streams

  • Geospatial indexes

  • Bitmaps

  • Bitfields

  • HyperLogLog

https://redis.io/docs/data-types

持久化 persistence

Redis persistence | Redis

redis可以设置一以下几种持久化方式

  • RDB(Redis Database): 以指定的时间间隔执行数据集的时间快照

  • AOF (Append Only File): AOF持久化记录服务器接收到的每个写操作。这些操作可以在服务器启动时重播,重建原始数据集。命令使用与Redis协议本身相同的格式记录

  • No persistence: 不持久

  • RDB + AOF: 混合使用

RDB的优势

  • RDB是Redis数据的一个非常紧凑的单文件时间点表示。RDB文件非常适合备份。例如,您可能想要对最近24小时内的RDB文件进行每小时存档,并保存30天内每天的RDB快照。这允许您在发生灾难时轻松地恢复数据集的不同版本。

  • RDB非常适合用于灾难恢复,因为它是一个紧凑的文件,可以传输到远端的数据中心或Amazon S3(可能是加密的)。

  • RDB最大化了Redis的性能,因为Redis父进程为了持久化所需要做的唯一工作就是创建(forking)一个子进程来完成剩下的所有工作。父进程永远不会执行磁盘I/O或类似操作。与AOF相比,RDB允许在大数据集上更快地重启。

  • 在副本上,RDB支持重启和故障转移后的部分重新同步。

RDB的劣势

  • 如果你需要在Redis停止工作(例如停电)的情况下最小化数据丢失的机会,那么RDB不是一个好选择。您可以配置生成RDB的不同保存点(例如,在对数据集进行至少5分钟和100次写入之后,您可以有多个保存点)。然而,你通常会每五分钟或更长时间创建一个RDB快照,所以如果Redis因为任何原因而停止工作,你应该做好丢失最新数据的准备。

  • 为了使用子进程持久化到磁盘上,RDB经常需要fork()。如果数据集很大,fork()可能很耗时,如果数据集很大,CPU性能不太好,可能会导致Redis停止为客户端服务几毫秒甚至一秒钟。AOF也需要fork(),但不太频繁,你可以调整重写日志的频率,而无需权衡持久性。

AOF 的优势

  • 使用AOF Redis更持久:你可以有不同的fsync策略:完全不同步、每秒同步、每次查询都同步。使用默认的每秒同步策略,写性能仍然很好。Fsync是使用后台线程执行的,当没有正在进行的Fsync时,主线程将努力执行写入操作,因此您只能丢失一秒的写入值。

  • AOF日志是一个只能追加的日志,因此在停电时不会出现寻道或腐败问题。即使日志由于某些原因(磁盘已满或其他原因)以写了一半的命令结束,redis-check-aof工具也能够轻松地修复它。

  • Redis能够在后台自动重写AOF,当它变得太大时。重写是完全安全的,因为当Redis继续追加到旧文件时,使用创建当前数据集所需的最小操作集生成一个全新的文件,一旦第二个文件准备好,Redis会切换两个文件并开始追加到新文件。

  • AOF以易于理解和解析的格式一个接一个地包含所有操作的日志。您甚至可以轻松导出AOF文件。例如,即使用户不小心使用FLUSHALL命令刷出了所有数据,只要在此期间没有重写日志,用户仍然可以通过停止服务器、删除最新的命令并重新启动Redis来保存数据集。

AOF 的劣势

  • 对于相同的数据集,AOF文件通常比对应的RDB文件大。

  • AOF可能比RDB慢,这取决于确切的fsync策略。一般来说,如果将fsync设置为每秒一次,性能仍然非常高,如果禁用fsync,即使在高负载下,它的速度也应该与RDB一样快。即使在写负载很大的情况下,RDB仍然能够为最大延迟提供更多的保证。

Redis 常见面试问题

  • Q: Redis有哪些持久化方式?

    A: Redis支持三种持久化方式:RDB、AOF和混合模式。RDB是定期将内存中的数据快照保存到磁盘的方式,文件体积小,适合做备份和灾难恢复。AOF是将每次对数据的修改操作追加到一个日志文件中的方式,可以保证数据的实时性,Redis宕机后不易丢失数据。混合模式是同时使用RDB和AOF,结合了两者的优点,是官方推荐的持久化方式。

  • Q: 你知道Redis缓存雪崩、缓存击穿和缓存穿透么?

    A: 缓存雪崩、缓存击穿和缓存穿透。这些都是Redis作为缓存时可能遇到的问题,它们的原因和解决方案如下:

    • Redis缓存雪崩:指的是当Redis中的大量热点key同时过期或者Redis服务器宕机时,导致大量的请求直接访问数据库,可能造成数据库的压力过大甚至崩溃。解决方案有以下几种:

      • 设置不同的过期时间:为热点key设置不同的过期时间,避免它们同时失效。

      • 设置热备缓存:为Redis设置一个热备服务器,当主服务器宕机时,可以快速切换到备用服务器。

      • 限流降级:对请求进行限流,当请求超过一定阈值时,可以降级服务或者拒绝服务,避免数据库被打垮。

    • Redis缓存击穿:指的是当某个热点key过期时,由于并发请求过多,导致数据库被频繁访问,影响性能。解决方案有以下几种:

      • 设置永不过期:对于一些不会变化的数据,可以设置为永不过期,避免失效后的并发访问。

      • 加锁更新:对于过期的key,只允许一个线程去数据库查询并更新缓存,其他线程等待或者返回旧值,避免多次查询数据库。

      • 异步更新:对于即将过期的key,可以提前异步更新缓存,避免同步更新造成的延迟。

    • Redis缓存穿透:指的是当请求的key在Redis中不存在时,导致每次都要访问数据库,影响性能。这可能是由于恶意攻击或者数据本身不存在造成的。解决方案有以下几种:

      • 缓存空值:对于查询结果为空的key,也进行缓存,并设置一个较短的过期时间,避免频繁访问数据库。

      • 使用布隆过滤器:使用一个足够大的bitmap,将所有可能存在的key进行哈希映射到bitmap中,在请求前先判断key是否在bitmap中,如果不在,则直接返回空值,避免访问数据库。


评论