Redis 常见问题

什么是Reids

Redis是一个使用C语言写的开源的高性能key-value非关系型数据库.

Redis中包含string, list ,set, zset, hash 等数据类型.

Redis的数据都基于缓存的, 每秒可以处理10万次读写, 是已知最快的key-value 数据库.

Redis可以实现写入磁盘, 保证数据安全.

Redis的操作是原子性的.

Redis为什么快

  1. 完全基于内存.
  2. 数据结构简单
  3. 采用单线程, 避免了不必要的上下文切换和竞争条件.
  4. 使用多路I/O复用模型, 非阻塞IO
  5. 底层通信协议不同.

Redis的持久化机制是什么

Reids提供了2中持久化机制: RDB(默认) 和 AOF机制.

RDB: 是Redis DataBase缩写快照.

RDB是Redis默认持久化方式, 按照一定时间将内存的数据以快照的形式保存到硬盘中, 对应产生的数据文件为dump.rdb

通过配置文件中的save参数定义快照周期.

优点:

  1. 只有一个文件dump.rdb, 方便持久化
  2. 容灾性好.
  3. 性能最大化
  4. 相对于数据集大时, 比AOF的启动效率更高.

缺点:

  1. 数据安全性低: RDB是间隔一段时间进行持久化, 可能丢失间隙数据.

AOF持久化(Append Only File)

将Redis执行的每次写命令记录到单独的日志文件中, 当重启Redis会重新回复数据.

两种方式都开启时, 优先选择AOF.

优点:

  1. 数据安全, AOF持久化可以配置appendfsync数据,有always 保证每次都记录.

缺点:

  1. AOF 文件比RDB文件大

Redis过期键的删除策略

Redis 提供了多种过期键删除策略,包括:

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,当键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除:放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
  • 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。
  • 随机删除:随机选择一部分过期键并对其进行删除

Redis 服务器实际使用的是定时删除、惰性删除和定期删除。这些策略可以在 Redis 的配置文件中进行设置,也可以通过 Redis 命令进行动态配置。

以下是一些常见的配置和使用删除策略的方法:

  1. 配置文件设置 :可以在 Redis 的配置文件(通常是redis.conf)中设置删除策略的相关参数。例如,可以设置maxmemory-policy参数来指定使用的删除策略,如volatile-lruallkeys-lruvolatile-random等。

  2. Redis 命令设置 :可以使用 Redis 命令来动态设置删除策略。例如,可以使用CONFIG SET命令来设置maxmemory-policy参数。

  3. 选择合适的删除策略:根据实际应用的需求和场景,选择合适的删除策略。例如,如果对内存限制较为严格,可以选择定时删除或定期删除策略;如果对 CPU 资源较为敏感,可以选择惰性删除策略。

  4. 监控和调整:在使用删除策略时,需要监控 Redis 的内存使用情况和性能指标,并根据实际情况进行调整。如果发现内存占用过高或性能下降,可以考虑调整删除策略或其他相关参数。

需要注意的是,不同的删除策略在内存占用和 CPU 资源消耗方面存在差异,因此需要根据具体情况进行选择和优化。此外,Redis 还提供了一些其他的配置参数,如maxmemorymaxmemory-samples等,可以进一步调整删除策略的行为.

Redids内存淘汰策略

Redis 提供了多种内存淘汰策略,用于在内存使用达到上限时,决定清理哪些数据以释放内存空间。以下是一些常见的 Redis 内存淘汰策略:

  • noeviction:不会继续服务写请求(DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。
  • allkeys-lru:从数据集(server.db(i).dict)中挑选最近最少使用的数据淘汰,该策略要淘汰的 key 面向的是全体 key 集合,而非过期的 key 集合。
  • allkeys-random:从数据集(server.db(i).dict)中选择任意数据淘汰。
  • volatile-lru:从设置过期时间的数据集(server.db(i).expires)中挑选出最近最少使用的数据淘汰。没有设置过期时间的 key 不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。
  • volatile-ttl:除了淘汰机制采用 LRU,策略基本上与 volatile-lru 相似,从设置过期时间的数据集(server.db(i).expires)中挑选将要过期的数据淘汰,ttl 值越大越优先被淘汰。
  • volatile-random:从已设置过期时间的数据集(server.db(i).expires)中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个 key。

这些策略可以根据具体的应用需求进行选择和配置。例如,如果希望保留最近使用过的数据,可以选择 allkeys-lru 策略;如果希望优先删除即将过期的数据,可以选择 volatile-ttl 策略。同时,还可以通过调整相关参数来进一步优化内存淘汰的行为。

什么是Reids事务

Redis 事务是一组命令的集合,可以将多个命令打包一次性执行,保证这些命令执行的原子性。

在一个 Redis 事务中,所有命令都会被序列化并按顺序执行。要么所有命令都成功执行,要么都不执行。

在执行事务时,通常的步骤如下:

  1. 使用 **MULTI**命令开启事务。
  2. 依次发送要执行的命令。
  3. 使用 **EXEC**命令执行事务中的所有命令。

如果在事务执行过程中出现错误,有以下情况:

  • 如果是在执行命令时发生错误(比如语法错误等),则整个事务会失败,所有命令都不会执行。
  • 如果是命令执行后返回错误结果(比如对一个不存在的键进行操作等),其他命令仍然会执行,只是出错的命令会有相应错误结果。

Redis 事务可以保证一定程度上的一致性和隔离性,但它并不像传统关系型数据库的事务那样严格。例如,它不能保证回滚到事务开始前的状态。

Redis事务相关命令

Redis 中与事务相关的命令主要包括以下几种:

  1. MULTI:标记事务的开始。当你调用 MULTI 命令后,Redis 会进入事务状态,之后发送的所有命令都不会立即执行,而是被放入一个队列中等待执行;
  2. EXEC:执行事务。当所有要执行的命令都已通过 MULTI 收集完毕后,调用 EXEC 命令会使 Redis 服务器顺序执行队列中的所有命令。这些命令作为一个整体被提交,实现了事务的原子性,尽管这种原子性是有限的,不包括失败回滚;
  3. DISCARD:取消事务。如果你在 MULTI 后、EXEC 前决定不执行事务中的命令,可以使用 DISCARD 来清空命令队列并退出事务状态;
  4. WATCH:为事务提供乐观锁机制。使用 WATCH 命令可以监视一个或多个键,如果在 WATCH 后、EXEC 前这段时间内,被监视的键被其他客户端修改了,那么当执行 EXEC 时,事务会失败并返回一个错误,从而可以实现基于条件的事务执行;

Redis哨兵模式

Redis 哨兵模式是一种高可用解决方案,用于监控 Redis 主节点的状态,并在主节点发生故障时自动进行故障转移。以下是关于 Redis 哨兵模式的一些关键信息:

  • 功能

    • 监控:持续监控 Redis 主节点和从节点的运行状态。
    • 通知:在主节点发生故障时,通过 API 通知监控系统或其他应用程序。
    • 自动故障恢复:当主节点发生故障时,自动将从节点提升为主节点,并通知客户端使用新的主节点。
    • 配置中心:为客户端提供 Redis 主节点的地址信息。
  • 工作原理

    • 每个 Sentinel 实例会以每秒一次的频率向主节点、从节点和其他 sentinel 实例发送 PING 命令,以检查它们的状态。
    • 如果一个实例在指定的时间内(down-after-milliseconds)没有响应 PING 命令,或者返回错误,sentinel 会将该实例标记为主观下线。
    • 如果多个 sentinel 实例都认为主节点主观下线,并且达到了 quorum 数量的 sentinel 实例达成共识,那么主节点将被标记为客观下线。
    • 一旦主节点被标记为客观下线,sentinel 会开始进行故障转移。它会从从节点中选择一个合适的节点作为新的主节点,并通知其他从节点切换到新的主节点进行复制。
    • 客户端可以通过连接 sentinel 实例来获取当前主节点的地址信息。
  • 搭建哨兵模式

    • 准备多个 Redis 实例,包括主节点和从节点。
    • 为每个 sentinel 实例创建配置文件,指定监控的主节点信息和其他 sentinel 实例的地址。
    • 启动 Redis 实例和 sentinel 实例。

通过使用 Redis 哨兵模式,可以提高 Redis 系统的可用性和可靠性,减少人工干预和故障恢复时间。但需要注意的是,哨兵模式仍然存在一些局限性,例如在网络分区等情况下可能会出现误判。在实际应用中,需要根据具体需求和场景进行评估和选择。

Redis 哨兵模式的工作原理主要包括以下几个方面:

  1. 监控:哨兵节点会定期向主节点、从节点和其他哨兵节点发送 PING 命令,以检查它们的状态。如果一个节点在指定的时间内没有响应 PING 命令,或者返回错误,哨兵会将该节点标记为主观下线。
  2. 通知:当一个节点被标记为主观下线时,哨兵会向其他哨兵节点发送通知,询问它们是否也认为该节点下线。如果多个哨兵节点都认为该节点下线,那么该节点将被标记为客观下线。
  3. 选举 Leader Sentinel:当主节点被标记为客观下线时,哨兵节点会进行选举,选出一个 Leader sentinel。Leader sentinel 负责进行故障转移操作,将从节点提升为主节点。
  4. 故障转移:一旦选举出 Leader sentinel,它会开始进行故障转移。首先,它会从从节点中选择一个合适的节点作为新的主节点。选择的标准通常包括节点的健康状况、数据完整性等。然后,Leader sentinel 会向其他从节点发送命令,让它们切换到新的主节点进行复制。
  5. 通知客户端:故障转移完成后,Leader sentinel 会通知客户端新的主节点的地址,以便客户端能够重新连接到 Redis 集群。

通过以上工作原理,Redis 哨兵模式可以实现自动故障检测和转移,提高了 Redis 集群的可用性和可靠性。同时,哨兵模式还可以实现对 Redis 集群的监控和管理,方便管理员进行维护和管理。

Redis主从架构

实现 Redis 主从架构的一般步骤:

  1. 配置主节点

    • 在主节点的 Redis 配置文件(通常是 redis.conf)中,无需特殊配置来明确其为主节点。
  2. 配置从节点

    • 在从节点的配置文件中添加以下配置:
      • slaveof <主节点 IP> <主节点端口> ,指定主节点的地址和端口。
  3. 启动主从节点:分别启动主节点和从节点的 Redis 服务。

  4. 验证

    • 可以在从节点上使用 INFO replication 命令查看复制状态,确认从节点是否成功连接到主节点并开始同步数据。

另外,也可以通过命令行动态地设置从节点:在从节点上执行 SLAVEOF <主节点 IP> <主节点端口> 命令来建立主从关系。

Redis实现分布式锁

Reids缓存穿透, 缓存雪崩

Redis缓存降级

在 Redis 中进行缓存降级可以通过以下一些方式来实现:

基于策略的降级

  • 可以设置一些规则,例如当缓存命中率低于一定阈值时,采取降级措施。比如不再从缓存中获取数据,直接从数据源(如数据库)获取并返回。

手动触发降级

  • 在某些特定场景下,比如系统面临高并发压力或缓存出现故障时,手动将系统切换到从数据源获取数据的模式。

数据分层降级

  • 可以将缓存数据分为不同的重要级别。当出现问题时,先放弃不太重要数据的缓存,保证关键数据的缓存正常服务。

失效时间调整

  • 临时调整某些缓存数据的失效时间,加快数据的更新频率,以适应特殊情况。
相关推荐
cyt涛40 分钟前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油1 小时前
01_SQLite
数据库·sqlite
liuxin334455661 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。2 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec2 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa2 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录3 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.4 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构