【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

Redis 过期策略详解:从基础到高级 (redis过期策略六种)

用户投稿2024-04-19热门资讯18

Redis 是一个流行的开源、内存数据库,以其高性能和灵活性而闻名。过期策略是 Redis 的一项重要特性,它允许您设置键的有效期,当超过该有效期时,键和相关值将自动从数据库中删除。

过期策略的类型

Redis 提供了六种不同的过期策略:

  • 无过期策略

    键没有任何过期时间,将永久存在于数据库中。

    使用场景:当您需要存储永久数据时,例如用户配置文件或统计信息。

  • 定期过期策略

    键有一个固定的过期时间,超过该时间后将被删除。

    使用场景:当您需要存储临时数据时,例如会话令牌或购物篮内容。

  • 空闲过期策略

    键有一个空闲过期时间,在该时间段内如果键没有被访问,则将被删除。

    Redis 过期策略详解:从基础到高级 (redis过期策略六种) 第1张

    使用场景:当您需要存储不经常访问的数据时,例如日志记录或审计信息。

  • 驱逐策略

    当 Redis 内存不足时,使用驱逐策略来删除过期键。

    使用场景:当您需要防止 Redis 因内存耗尽而崩溃时,例如在高流量的情况下。

  • 渐进式过期策略

    渐进式过期策略将过期键分成多个时间段,并在每个时间段中删除一部分键。

    使用场景:当您需要平滑地释放 Redis 内存时,例如在系统负载较低时。

  • 随机过期策略

    随机过期策略在给定的时间范围内随机删除过期键。

    使用场景:当您需要防止攻击者通过猜测过期时间来预测键何时会被删除时。

选择最佳过期策略

选择最佳的过期策略取决于您的具体应用程序需求。

以下是一些准则:

  • 无过期策略:用于存储永久数据。
  • 定期过期策略:用于存储临时数据,例如会话令牌或购物篮内容。
  • 空闲过期策略:用于存储不经常访问的数据,例如日志记录或审计信息。
  • 驱逐策略:用于防止 Redis 因内存耗尽而崩溃。
  • 渐进式过期策略:用于平滑地释放 Redis 内存。
  • 随机过期策略:用于防止攻击者预测键何时会被删除。

配置过期策略

要为键配置过期策略,可以使用以下 Redis 命令:

SET key value EX seconds

其中:

  • key 是键的名称。
  • value 是要存储的值。
  • EX 指定使用定期过期策略。
  • seconds 是要设置的过期时间(以秒为单位)。

例如,要为键 mykey 设置定期过期策略,有效期为 30 秒,可以使用以下命令:

SET mykey myvalue EX 30

管理过期键

Redis 提供了以下命令来管理过期键:

  • EXPIRE key seconds :为指定的键设置定期过期策略。
  • EXPIREAT key timestamp :为指定的键设置定期过期策略,并使用 Unix 时间戳指定过期时间。
  • TTL key :返回指定键的剩余存活时间(以秒为单位)。
  • PERSIST key :清除指定键的过期策略,使其成为永久键。

结论

过期策略是 Redis 的一项重要特性,可让您控制键和相关值在数据库中的生命周期。通过了解不同的过期策略类型以及如何选择和配置它们,您可以优化 Redis 以满足您的特定应用程序需求。


Redis数据的过期与淘汰

懒惰处理 Redis在get操作时遇到过期的key会进行删除操作。

集中处理 Redis会将设置了过期时间的key放到一个独立的字典里,默认每秒10次过期扫描。扫描方式:

为防止扫描时间过长,扫描时间限制为25ms,开发时应尽量避免大量key同时过期。 从库不会进行过期扫描,主库删除时,会在AOF文件里增加一条del指令,同步到所有从库,从库通过此指令来删除。由于指令的同步存在异步,所以会出现主从数据不一致的情况。

当Redis内存超出物理内存限制时,内存数据会开始和磁盘产生频繁的交换,使得性能急剧下降。为了限制内存的使用,Redis提供参数 maxmemory 来限制最大内存,当内存超出后,会有以下策略( maxmemory-policy )来淘汰key以腾出空间:

由于LRU算法需要消耗大量的额外内存,redis采用一种近似的LRU算法。它给每个 key 增加了一个额外的小字段(24bit),也就是最后一次被访问的时间戳。每次执行写操作时,如果发现内存超出 maxmemory ,就随机采样5个(参数 maxmemory_samples 配置)key,然后淘汰最旧的。如果淘汰之后还是超出,那就继续随机淘汰,直到不超出为止。如果 maxmemory-policy 是volatile-xxx,就从设置过期时间的key里采样,否则就从所有key里采样。 Redis3.0里增加了一个淘汰池,就是一个大小为 maxmemory_samples 的数组。每次淘汰时会将随机出来的key和数组里的key融合,淘汰掉最旧的一个,然后将剩下的较旧的key放到淘汰池里给下个循环用。

redis的删除del在删除一个大对象的时候有可能造成卡顿。为了解决这个问题Redis4.0引入了unlink指令,将这个key的对象引用从Redis内存数据里删除,将删除操作封装成一个任务丢到一个异步队列里。然后有个异步线程会从这个队列里取出任务并执行。 清空操作 flushdb 和 flushall ,在Redis4.0后,在指令后面增加 async ,就也可以像上面一样异步执行。

《Redis深度历险:核心原理和应用实践》

Redis缓存过期机制

一、针对与设置了过期时间的key值 1.(主动)定期删除:定时随机的检查过期的key,如果过期则清理删除 (每秒检查的次数1-500)配置: hz 10 2.(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除 所以,虽然key过期了,但是没被清理的话,还是会占内存的。 二、内存淘汰管理机制Memory Management 当内存占满之后,redis提供缓存淘汰机制。 : maxmemory <bytes> * noeviction:旧缓存永不过期,新缓存设置不了,返回错误 * allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用) * allkeys-random:在所有的缓存中随机删除(不推荐) * volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存 * volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存 * volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的

redis八种淘汰策略是什么

1、noeviction:默认策略,不淘汰数据;大部分写命令都将返回错误(DEL等少数除外)。

2、allkeys-lru:从所有数据中根据 LRU 算法挑选数据淘汰。

3、volatile-lru:从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰 。

4、allkeys-random:从所有数据中随机挑选数据淘汰。

5、volatile-random:从设置了过期时间的数据中随机挑选数据淘汰。

6、volatile-ttl:从设置了过期时间的数据中,挑选越早过期的数据进行删除。

7、allkeys-lfu:从所有数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)。

8、volatile-lfu:从设置了过期时间的数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)。

LRU算法:

LRU(Least Recently Used)最近最少使用。优先淘汰最近未被使用的数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LRU底层结构是 hash 表 + 双向链表。hash 表用于保证查询操作的时间复杂度是O(1),双向链表用于保证节点插入、节点删除的时间复杂度是O(1)。

单链表可以实现头部插入新节点、尾部删除旧节点的时间复杂度都是O(1),但是对于中间节点时间复杂度是O(n),因为对于中间节点c,我们需要将该节点c移动到头部,此时只知道他的下一个节点,要知道其上一个节点需要遍历整个链表,时间复杂度为O(n)。

LRU GET操作:如果节点存在,则将该节点移动到链表头部,并返回节点值。

LRU PUT操作:

1、节点不存在,则新增节点,并将该节点放到链表头部。

2、节点存在,则更新节点,并将该节点放到链表头部。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

Redis 过期策略详解:从基础到高级 (redis过期策略六种) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!