redis内存淘汰策略

LRU (Least recently used, 最近很少使用)

思想: 越最近使用过的数据,接下来使用的机会越大,越应该保留,剔除哪些很久之前使用过的数据

  1. 新数据插入到列表头部;
  2. 每当缓存命中(即缓存数据被访问),则将数据移到列表头部;
  3. 当列表满的时候,将列表尾部的数据丢弃。
LFU(Least Frequently Used 最近频繁使用算法)

思想:使用的次数越高(频率),接下来使用的机会就越高,越应该保留.剔除哪些使用次数少的

  • 定期衰减 (例如:每隔一定的时间次数减半)

redis中的淘汰策略

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。 默认
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
redis 4.x后支持LFU策略,最少频率使用
  • allkeys-lru
  • volatile-lru

可以通过redis的配置文件来控制

  • maxmemory-policy volatile-lru
  • maxmemory bytes 控制redis最大能使用多少内存
结论:
  • redis作为缓存 可以不用配置持久化 但是需要配置内存淘汰策略
  • redis作为业务数据存储 要配置持久化策略 但是内存淘汰一定要用默认的noeviction
源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方法获得曲线**: - 插值方法:依据关键帧信息,选用插值方法(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
### Redis 内存淘汰策略机制及实现 Redis内存管理机制是其性能优化的核心之一,当 Redis内存使用量达到配置的限制时(由 `maxmemory` 参数控制),Redis 会根据指定的内存淘汰策略来释放空间,以保证服务的可用性[^1]。以下是 Redis 内存淘汰策略的工作原理和实现细节。 #### 一、内存淘汰策略概述 Redis 提供了多种内存淘汰策略,这些策略通过 `maxmemory-policy` 配置项进行设置。根据键的范围和淘汰算法的不同,可以将这些策略分为三类[^5]: - **noeviction**:不淘汰任何键,当内存不足时直接返回错误。 - **allkeys**:在所有键中选择淘汰目标。 - **volatile**:仅在设置了过期时间的键中选择淘汰目标。 具体淘汰算法包括以下四种: 1. **随机淘汰(Random)**:随机选择键进行淘汰。 2. **最少使用(LRU, Least Recently Used)**:淘汰最久未使用的键。 3. **最少访问频率(LFU, Least Frequently Used)**:淘汰访问频率最低的键。 4. **基于大小(TTL, Time To Live)**:优先淘汰剩余存活时间较短的键。 #### 二、内存淘汰策略的实现细节 1. **随机淘汰** - 在 `allkeys-random` 和 `volatile-random` 策略中,Redis 使用伪随机数生成器从候选键集合中随机选择键进行淘汰[^5]。 - 这种方法简单高效,但可能会导致重要数据被意外删除。 2. **LRU 淘汰** - LRU 淘汰策略(如 `allkeys-lru` 和 `volatile-lru`)依赖于 Redis 的内部 LRU 数据结构,该结构记录每个键的最后访问时间[^1]。 - 当需要淘汰键时,Redis 会扫描一定数量的候选键,并选择最后访问时间最早的键进行淘汰。 - Redis 并不维护一个完整的全局 LRU 列表,而是通过采样技术(例如每轮检查 5 个随机键)来近似实现 LRU 淘汰[^2]。 3. **LFU 淘汰** - LFU 淘汰策略(如 `allkeys-lfu` 和 `volatile-lfu`)基于键的访问频率进行淘汰[^3]。 - Redis 使用一个计数器记录每个键的访问频率,淘汰时选择访问频率最低的键。 - 访问频率的计算结合了时间衰减因子,确保长期未访问的键也能被淘汰。 4. **TTL 淘汰** - TTL 淘汰策略(如 `volatile-ttl`)优先淘汰剩余存活时间较短的键[^4]。 - 这种策略特别适用于缓存场景,能够有效减少内存占用。 #### 三、内存淘汰策略的监控与优化 为了确保内存淘汰策略的有效性,建议通过监控工具(如 RedisInsight 或 Prometheus)实时跟踪内存使用情况和淘汰指标[^2]。常见的优化实践包括: - 根据业务需求选择合适的淘汰策略。 - 定期分析淘汰日志,识别高频淘汰的键并优化存储逻辑。 - 调整 `maxmemory` 配置以平衡内存使用和性能需求。 ```python # 示例:设置 maxmemory 和淘汰策略 redis-cli config set maxmemory 1gb redis-cli config set maxmemory-policy allkeys-lru ``` #### 四、内存回收机制 除了内存淘汰策略外,Redis 还通过定期删除和惰性删除两种方式来清除过期的键[^3]: - **惰性删除**:仅在访问某个键时检查其是否已过期,若已过期则立即删除。 - **定期删除**:后台线程定期扫描一定比例的过期键并删除。 这两种机制共同作用,确保过期键不会长时间占用内存。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值