一、Redis key没设置过期时间却被redis主动删除了
如果一个 Redis 键没有设置过期时间,那么 Redis 无法判断该键是否应该自动删除。因此,如果一个没有设置过期时间的键被 Redis 主动删除了,可能是以下原因之一:
- 内存不足:如果 Redis 内存不足,它会删除一些键以释放内存。如果该键没有被设置过期时间,则可能会被作为“临时”键删除。
- 数据库空间不足:如果 Redis 数据库空间不足,它会删除一些键以释放空间。在这种情况下,可能会删除没有设置过期时间的键。
- 手动删除:可能是有人手动删除了该键。
可以通过以下方法来避免 Redis 主动删除没有设置过期时间的键:
- 设置键的过期时间为一个较长的值,例如 230000 年。这样可以避免 Redis 在键被使用之前将其删除。
- 在使用完键之后,手动删除它。这样 Redis 就不会在键被使用之前将其删除。如果你不再需要这个键,那么最好将其删除,以便释放内存。
需要注意的是,如果你设置了太多的键,而且这些键的过期时间很短,那么 Redis 的内存占用可能会迅速增加,从而导致性能下降或者宕机。因此,在设置键的过期时间时需要权衡好内存占用和性能之间的关系。
二、Redis有哪些淘汰key的策略
主动清理策略在Redis 4.0之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略,总共8种
a)针对设置了过期时间的key做处理:
- volatile-tl: 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除.
- volatile-random: 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
- volatile-lru: 会使用 LRU 算法筛选设置了过期时间的键值对删除
- volatile-lfu: 会使用 LFU 算法筛选设置了过期时间的键值对删除。
b) 针对所有的key做处理:
- allkeys-random: 从所有键值对中随机选择并删除数据
- allkeys-lru: 使用 LRU 算法在所有数据中进行筛选删除
- allkeys-lfu: 使用 LFU 算法在所有数据中进行筛选删除
c) 不处理:
- noeviction: 不会别除任何数据,拒绝所有写入操作并返回客户端错误信息"eror) 00M command not allowed whenused memory”,此时Redis只响应读操作。
三、Redis淘汰key策略LRU与LFU的区别
-
LRU(Least Recently Used):最近最少使用策略。当Key空间被占满时,淘汰最近最少使用的Key。
-
LFU(Least Frequently Used):最不经常使用策略。当Key空间被占满时,淘汰最不经常使用的Key
LRU是按时间轴来淘汰数据,即淘汰最近最少使用的数据;LFU是按使用次数来淘汰数据,即淘汰最不经常使用的数据。
当内存空间不足时,Redis会根据淘汰策略来删除部分数据,以释放内存空间。可以在Redis的配置文件中配置淘汰策略的相关参数,如最大内存、淘汰策略的阈值等。
绝太多数情况下我们使用LRU策略,当存在大量热点缓存数据时,推荐使用LFU
补充说明:
在Redis中,LRU算法是通过一个叫做“过期字典”的机制来实现的。当一个key被设置了过期时间时,Redis会在过期时间到达后将其从内存中删除。如果一个key没有被设置过期时间,但是已经很久没有被访问了,那么Redis会将其标记为“过期”,并在下一次垃圾回收时将其删除 。
四、删除Key时会阻塞Redis吗?
在Redis中,删除Key的操作通常不会阻塞其他操作。这是因为Redis使用单线程模型,并且删除Key是一个原子性操作,不需要其他线程来协助完成。
然而,在某些情况下,删除Key可能会阻塞Redis。
- 例如,当你使用Redis作为数据库时,如果一个客户端正在读取数据库,并且另一个客户端正在删除一个Key,那么删除Key的操作可能会导致读取操作失败,因为Key已经不存在了。这种情况通常会在数据库中发生,因为数据库需要保持一致性。
- 如果删除的是Bigkey,里面的数据比较大,删除需要比较长的时间,可能会阻塞Redis。
总的来说,删除Key的操作在Redis中是一个相对较快的操作,不会阻塞其他操作。但是,在某些情况下,它可能会对其他操作产生影响,因此需要仔细考虑在使用Redis时如何处理删除Key的操作。
五、Redis主从、哨兵、集群架构优缺点比较
1. 主从架构
主节点负责处理所有的写请求,将数据写入到内存中,并将数据异步地同步给从节点。从节点负责处理读请求,从主节点同步数据,并在主节点挂掉后,顶替主节点继续提供服务。
Redis主从架构的好处:
- 提高数据的可用性:从节点可以处理读请求,当主节点挂掉时,可以从从节点读取数据,从而提高了数据的可用性。
- 备份数据:从节点会将数据同步到磁盘中,从而可以备份数据,提高数据的安全性。
- 分担负载:从节点可以分担主节点的负载,提高Redis的性能。
- 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高Redis的读写效率。
Redis主从架构的缺点:
- 复制延迟:在Redis主从架构中,主节点需要将写操作复制到从节点中,这个过程需要一定的时间,可能导致数据复制延迟。这可能会影响数据的实时性和一致性。
- 性能下降:当从节点数量增加时,Redis主从架构的性能可能会下降。因为每个从节点都需要从主1. 节点获取数据,这会增加主节点的负载,从而影响整个集群的性能。
故障转移风险:在Redis主从架构中,如果主节点出现故障,需要手动将一个从节点提升为主节点。这会导致一定的数据丢失风险,因为提升的从节点可能没有主节点最新的数据。 - 数据不一致性:在Redis主从架构中,如果主节点和从节点的数据存在不一致性,可能会导致数据错误。例如,当主节点和从节点的数据更新时间不同时,就可能出现这种情况。
- 运维难度:Redis主从架构的运维难度较大,需要专业的运维团队进行管理和维护。运维人员需要熟悉Redis的运行机制和主从架构的配置方式,以便及时处理故障和调整配置。
2. 哨兵架构
Redis 哨兵架构是一种 Redis 集群管理模式,用于监控 Redis 主节点和从节点的运行状态,并自动处理节点故障。
Redis 哨兵架构包括以下几个部分:
- 哨兵进程(Sentinel):哨兵进程是 Redis 集群的监控器,会持续监控主节点和从节点的状态,如果发现主节点或从节点出现故障,哨兵进程会触发自动故障转移操作。
- 主节点(Master):主节点是 Redis 集群中的写节点,负责处理所有的写请求。
- 从节点(Slave):从节点是 Redis 集群中的读节点,负责处理读请求,并在主节点故障时,进行故障转移操作。
- 故障转移(Failover):当主节点出现故障时,哨兵进程会通过选举操作选出一个从节点作为新的主节点,并将所有的写请求发送给新的主节点。
- 重新同步(Resynchronization):当从节点出现故障时,哨兵进程会重新同步从节点和主节点之间的数据,以确保数据的一致性。
Redis 哨兵架构的好处:
- 监控节点状态:Redis 哨兵架构可以持续监控节点的状态,及时发现和处理节点故障。
- 自动故障转移:当主节点出现故障时,Redis 哨兵架构可以自动选出新的主节点,并将所有的写请求发送给新的主节点,从而提高了数据的可用性和可靠性。
- 数据备份:从节点可以将数据同步到磁盘中,从而备份数据,提高数据的安全性。
- 分担负载:从节点可以分担主节点的负载,提高 Redis 的性能。
- 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高 Redis 的读写效率。
Redis 哨兵架构的缺点:
- 监控开销:Redis 哨兵架构需要持续监控主节点和从节点的状态,这会增加一定的监控开销,导致哨兵进程可能会成为整个集群的性能瓶颈。
- 配置复杂:Redis 哨兵架构的配置比较复杂,需要配置多个文件,并且需要保证配置的一致性。如果配置不当,可能会导致哨兵进程无法正确监控节点状态,从而导致故障转移失败。
- 故障转移时间:当主节点出现故障时,Redis 哨兵架构需要进行故障转移操作,选择一个新的从节点作为新的主节点。这个过程需要一定的时间,可能会导致一段时间内 Redis 集群无法处理写请求。
- 数据不一致性:当从节点出现故障时,Redis 哨兵架构需要进行重新同步操作,将主节点和从节点之间的数据同步到新的从节点上。如果重新同步操作不成功,可能会导致数据不一致性。
- 运维难度:Redis 哨兵架构的运维难度较大,需要专业的运维团队进行管理和维护。运维人员需要熟悉 Redis 的运行机制和哨兵模式的配置方式,以便及时处理故障和调整配置。
3. Redis集群架构
Redis集群架构是为了提高Redis数据的可用性和可靠性的一种架构模式。Redis集群架构通常包括多个节点,这些节点组成了一个分布式的存储系统,可以对外提供读写服务。
Redis集群架构有两种方案:
- 带有主从结构的集群架构:这种架构包含一个主节点和多个从节点。主节点负责处理所有的写请求,并将写请求同步给从节点。从节点只负责处理读请求,并在主节点挂掉时,进行故障转移操作。
- 不带有主从结构的集群架构:这种架构中,所有节点都是平等的,都可以处理读请求和写请求。这种架构通常需要使用一些分片机制,将数据分散到不同的节点上,以实现数据的分布式存储。
在Redis集群架构中,数据的读写流程如下:
- 客户端向集群中任意一个节点发送一个读请求。
- 接收到请求的节点会检查自己是否拥有该数据,如果拥有,则直接返回数据;如果不拥有,则将请求转发给拥有该数据的节点。
- 客户端向集群中任意一个节点发送一个写请求。
- 接收到请求的节点会检查自己是否拥有该数据,如果拥有,则直接执行写操作;如果不拥有,则将请求转发给拥有该数据的节点。
Redis集群架构的好处:
- 提高数据的可用性和可靠性:多个节点可以互相备份,当某个节点挂掉时,可以从其他节点读取数据,从而提高了数据的可用性和可靠性。
- 分担负载:多个节点可以分担主节点的负载,提高 Redis 的性能。
- 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高 Redis 的读写效率。
Redis集群架构的缺点:
- 节点故障:当集群中某个节点出现故障时,会导致该节点上的数据无法访问。虽然可以通过数据备份和故障转移等方式来减少数据丢失的风险,但是故障转移操作可能会导致一定的数据不一致性。
- 性能限制:Redis 集群架构的性能受到节点数量和节点处理能力的限制。当集群规模较大时,性能可能会受到影响,而且大规模的集群管理也可能会变得复杂。
- 数据分片:在带有分片机制的 Redis 集群架构中,数据需要被均匀地分配到各个节点上。但是如果数据分配不均匀,可能会导致某些节点的负载过高,从而影响整个集群的性能。
- 运维难度:Redis 集群架构的运维难度较大,需要专业的运维团队进行管理和维护。
- 成本增加:Redis 集群架构需要更多的节点和服务器,从而增加了硬件成本和运维成本。