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 中进行缓存降级可以通过以下一些方式来实现:

基于策略的降级

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

手动触发降级

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

数据分层降级

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

失效时间调整

  • 临时调整某些缓存数据的失效时间,加快数据的更新频率,以适应特殊情况。
相关推荐
BestandW1shEs1 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师1 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球2 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...2 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00012 小时前
MySQL的权限管理机制--授权表
数据库
wqq_9922502772 小时前
ssm旅游推荐系统的设计与开发
数据库·旅游
难以触及的高度2 小时前
mysql中between and怎么用
数据库·mysql
Jacky(易小天)3 小时前
MongoDB比较查询操作符中英对照表及实例详解
数据库·mongodb·typescript·比较操作符
Karoku0663 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch