陇南地网站建设,珠海网站建设公司怎么样,如何进行网站推广,前端开发培训学校Redis 的过期策略主要是指管理和删除那些设定了过期时间的键#xff0c;以确保内存的有效使用和数据的及时清理。 具体来说#xff0c;Redis 有三种主要的过期策略#xff1a;定期删除#xff08;Scheduled Deletion#xff09;、惰性删除#xff08;Lazy Deletion#…Redis 的过期策略主要是指管理和删除那些设定了过期时间的键以确保内存的有效使用和数据的及时清理。 具体来说Redis 有三种主要的过期策略定期删除Scheduled Deletion、惰性删除Lazy Deletion和内存淘汰策略Eviction Policies。 1. 定期删除
Redis 的定期删除策略Scheduled Deletion的步骤如下 设置定期任务 Redis 会在后台线程中设置一个定期任务用于扫描和删除过期键。这个任务会在特定的时间间隔内执行默认每 100 毫秒运行一次。 随机抽样检查 在每次定期任务执行时Redis 会从已设置过期时间的键中随机抽取一部分键进行检查而不是一次性检查所有键。这样可以减少对 CPU 的负载。 检查键的过期状态 对于抽取的每一个键Redis 会检查该键的过期时间。如果发现某个键已经过期Redis 就会立即删除该键。 重复检查 如果在一次扫描中发现了删除的健的占比超过了设置的阈值(比如25%那么 Redis 会继续进行下一轮的随机抽样检查直到在一次扫描中没有找到任何过期的键为止。 调节扫描频率和负载 为了防止定期删除任务占用过多的 CPU 资源Redis 会根据上一次扫描中删除的过期键的数量来动态调整下一次扫描的强度。比如如果上一次扫描删除了大量的过期键那么下一次扫描的键数量可能会减少反之亦然。
2. 惰性删除
Redis 的惰性删除策略Lazy Deletion的步骤如下 访问键时检查过期状态 当客户端对 Redis 发起读操作如 GET或写操作如 SET时Redis 首先会检查被访问的键是否设置了过期时间。 获取当前时间 Redis 获取当前的系统时间用来与键的过期时间进行比较。 比较过期时间 如果键的过期时间早于当前时间说明该键已经过期。 删除过期键 如果键已经过期Redis 会立即删除该键并返回一个特殊的响应如返回 nil 表示键不存在或其他与操作类型相关的结果。 处理未过期键 如果键未过期Redis 会继续正常处理客户端的请求返回键的值或执行相应的写操作。
示例
假设客户端向 Redis 发起一个 GET 操作来读取键 mykey 的值惰性删除的详细步骤如下 客户端发送 GET mykey 客户端向 Redis 发送 GET mykey 命令。 Redis 接收请求并查找键 Redis 接收到请求后查找键 mykey。 检查过期时间 Redis 发现 mykey 设置了过期时间获取当前时间。 比较当前时间和过期时间 Redis 比较当前时间和 mykey 的过期时间。 如果 mykey 的过期时间是 2024-06-01 12:00:00当前时间是 2024-06-01 12:01:00则 mykey 已经过期。如果当前时间是 2024-06-01 11:59:00则 mykey 未过期。 删除过期键或返回值 如果 mykey 已经过期Redis 立即删除 mykey并返回 nil 表示键不存在。如果 mykey 未过期Redis 返回 mykey 的值。
3. 内存淘汰
Redis 的内存淘汰策略Eviction Policies是指当 Redis 实例的内存使用达到配置的最大上限时采取的一系列措施来删除现有的键以腾出空间给新的数据。
以下是 Redis 内存淘汰策略的详细说明
删除策略
1. volatile-lru使用 LRU 算法删除设置了过期时间的键
描述从设置了过期时间的键中使用 LRULeast Recently Used最近最少使用算法删除最不常用的键。应用场景适用于需要在有过期时间的键中保持最常用的数据的情况。
2. allkeys-lru使用 LRU 算法删除所有键
描述从所有键中使用 LRU 算法删除最不常用的键。应用场景适用于希望在所有数据中保持最常用的数据的情况而不考虑键是否设置了过期时间。
3. volatile-random随机删除设置了过期时间的键
描述从设置了过期时间的键中随机删除键。应用场景适用于希望简单地随机删除有过期时间的键以释放内存的情况。
4. allkeys-random随机删除所有键
描述从所有键中随机删除键。应用场景适用于希望简单地随机删除键以释放内存的情况。
5. volatile-ttl删除设置了过期时间且剩余存活时间最短的键
描述从设置了过期时间的键中删除剩余存活时间TTLTime to Live最短的键。应用场景适用于希望首先删除那些即将过期的键以尽量保留长时间有效数据的情况。
6. noeviction不删除任何键
描述当内存使用达到上限时不删除任何键直接返回错误。应用场景适用于希望严格控制内存使用不希望自动删除任何键的情况。通常用于希望 Redis 只作为缓存或持久存储的一部分并在达到内存上限时明确地处理错误。
具体操作步骤
以下是 Redis 内存淘汰策略的具体操作步骤 达到内存上限 Redis 实例的内存使用达到配置的最大上限由配置参数 maxmemory 设置。 选择淘汰策略 Redis 根据配置的淘汰策略由 maxmemory-policy 参数设置来决定如何释放内存。 执行淘汰策略 根据选定的策略Redis 选择要删除的键 LRU 算法Redis 使用近似 LRU 算法维护一个候选键列表并删除最不常用的键。随机删除Redis 从符合条件的键中随机选择并删除。TTL 最短Redis 删除剩余存活时间最短的键。无淘汰Redis 不删除键直接返回错误如 OOM command not allowed。 释放内存 删除选中的键释放内存。 继续处理请求 如果删除的键足以腾出足够的空间Redis 继续处理客户端请求否则重复执行淘汰策略直到满足内存要求或返回错误。
示例
假设 Redis 配置了 maxmemory 为 100MBmaxmemory-policy 为 allkeys-lru当前内存使用已达到 100MB 客户端发送 SET mykey value Redis 接收到 SET mykey value 请求。 检测内存使用 Redis 发现内存使用已达上限触发淘汰策略。 选择淘汰策略 allkeys-lru Redis 使用 LRU 算法从所有键中选择最不常用的键。 删除最不常用的键 Redis 删除 LRU 列表中的最不常用键如 oldkey1 和 oldkey2。 释放内存并处理请求 删除键后释放足够内存Redis 继续处理 SET mykey value 请求并成功存储新键 mykey。
4. 三种策略相互配合
配合工作 正常情况下 定期删除 和 惰性删除 是主要的过期数据清理手段。定期删除在后台自动清理一部分过期键减少内存占用。惰性删除确保每次访问时过期键都能被及时清理保证数据的有效性。 内存压力增大时 当内存使用达到配置的最大上限时触发 内存淘汰策略。内存淘汰策略根据配置的策略如 LRU、随机删除等选择并删除部分键以释放内存。在这种情况下定期删除和惰性删除继续工作但主要任务是由内存淘汰策略来完成。 高效配合 定期删除和惰性删除保证大部分过期键能够在不影响系统性能的情况下被清理。内存淘汰策略则在内存压力过大时提供额外的保护确保系统不会因为内存不足而出现问题。这种多层次的内存管理机制保证了 Redis 的高效和稳定运行。
示例场景
假设 Redis 实例设置了 maxmemory 为 100MB淘汰策略为 allkeys-lru 系统正常运行 定期删除任务每 100 毫秒运行一次随机检查一些设置了过期时间的键删除过期键。客户端访问键时惰性删除机制检查键是否过期过期键立即删除。 内存使用达到 90MB 定期删除和惰性删除继续工作但由于某些键没有被及时访问或定期任务未覆盖内存使用仍在增长。 内存使用达到 100MB 触发内存淘汰策略 allkeys-lruRedis 删除最近最少使用的键释放内存。继续接受并处理新的客户端请求确保系统正常运行。
关于ArchManual
https://archmanual.com
https://github.com/yingqiangh/ArchManual