Redis淘汰和过期策略

Redis淘汰和过期策略



一、为什么选择Redis?

优越于其它键值数据存储系统的特点:

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
  • Redis可以将数据复制到任意数量的从机中。

Redis的其他优点

  • 开源的 key-value 存储系统
  • 异常快 - 由于主要在内存操作,Redis非常快。每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
    操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。
  • 支持master-slave (主从) 同步和哨兵模式。

二、Redis淘汰策略

 Redis 提供了几种内存淘汰机制让用户选择:
  • noeviction:当内存超出 最大内存,写入请求会报错,但是删除和读请求可以继续。
  • allkeys-lru:当内存超出 最大内存,在所有的 key 中,移除最少使用的key。
可实现LRU的算法(参考)
 算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
 1. 新数据插入到链表头部;
 2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
 3. 当链表满的时候,将链表尾部的数据丢弃。
  • allkeys-random:当内存超出 最大内存,在所有的 key 中,随机移除某个 key。
  • volatile-lru:当内存超出 最大内存,在设置了过期时间 key 的字典中,移除最少使用的 key。把 Redis 既当缓存,又做持久化的时候使用这种策略。
  • volatile-random:当内存超出 最大内存,在设置了过期时间 key 的字典中,随机移除某个key。
  • volatile-ttl:当内存超出 最大内存,在设置了过期时间 key 的字典中,优先移除 ttl 小的。
LRU(least recently used)最近最少使用
LFU(least frequently used )最少经常使用

设置方法

  1. maxmemory-policy属性设置
  • redis.conf配置文件中的maxmemory-policy属性设置,没有配置时默认为no-eviction模式。
  • config set maxmemory-policy <策略>,设置后立即生效,不需重启Redis,但重启就失效
  1. 设置maxmemory
  • 通过redis-cli命令设置:config get maxmemory和 config set maxmemory 100MB;
  • 修改redis配置文件redis.conf: maxmemory 100MB

三、过期策略

Redis采用的是定期删除 + 懒惰删除策略。

定期删除策略 在同一时间出现大面积 key 过期可能导致卡顿,而且在高并发的情况下,可能会导致
缓存雪崩

性能问题:
如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,又或者在使用 FLUSHDB 和 FLUSHALL 删除包含大量键的数据库时,那么删除操作就会导致单线程卡顿。

解决方案:异步
版本:>=4.0
### Redis过期策略淘汰策略 #### 过期策略 Redis过期策略主要用于处理设置了生存时间(TTL)的键。当一个键被设置为在某个时间点后自动删除时,Redis 并不会立即删除该键,而是采用惰性删除定期删除两种机制来管理这些过期键。 - **惰性删除**:只有当客户端尝试访问一个键时,Redis 才会检查该键是否已过期。如果已过期,则删除该键[^1]。 - **定期删除**:Redis 会在后台周期性地检查数据库中是否存在过期键,并主动删除它们。这种机制可以减少内存占用,但也会增加 CPU 负载。定期删除的频率每次删除的键数量由 Redis 配置决定[^1]。 #### 淘汰策略 Redis淘汰策略用于解决内存不足的问题。当 Redis 内存达到最大限制时,它会根据配置的淘汰策略选择一些键进行删除,以释放内存空间。常见的淘汰策略包括: - **LRU (Least Recently Used)**:删除最近最少使用的键。此策略假设最近未使用的键在未来也不太可能被使用[^2]。 - **LFU (Least Frequently Used)**:删除最不常使用的键。此策略基于访问频率,认为访问频率低的键在未来也不太可能被频繁使用[^3]。 - **TTL (Time To Live)**:删除剩余生存时间最短的键。此策略适用于那些设置了较短生存时间的键[^4]。 - **Random**:随机删除键。此策略简单粗暴,但可能导致重要数据被删除[^5]。 #### 使用场景 不同的淘汰策略适用于不同的使用场景: - **LRU**:适合缓存场景,尤其是当数据访问模式具有明显的局部性时,例如网页缓存、API 响应缓存等[^2]。 - **LFU**:适合需要长期保存某些数据的场景,例如分布式系统中的元数据存储,其中某些数据可能长时间未被访问但仍然重要[^3]。 - **TTL**:适合短期任务或临时数据存储,例如会话管理、验证码存储等[^4]。 - **Random**:适合对数据丢失敏感度较低的场景,例如日志存储、统计分析等[^5]。 #### 示例代码 以下是一个简单的 Redis 配置示例,展示如何设置淘汰策略: ```bash # 设置 Redis 的最大内存限制 maxmemory 100mb # 设置淘汰策略为 LRU maxmemory-policy allkeys-lru ``` #### 注意事项 - 在生产环境中,建议根据实际需求选择合适的淘汰策略,并监控 Redis 的内存使用情况。 - 对于关键数据,避免使用容易被淘汰策略,如 Random 或 TTL。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值