美文网首页LinuxPHP经验分享
redis如何设置键过期和键过期对内存的影响

redis如何设置键过期和键过期对内存的影响

作者: PHP的艺术编程 | 来源:发表于2018-12-19 10:19 被阅读0次

如何设置键过期

Redis所有的键都可以设置过期属性,内部保存在过期字典中。

  • expire key seconds --键在seconds秒后过期

  • expireat key timestamp --键在秒级时间戳timestamp后过期

注意:
expireat和expire类似,不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。

//key 不存在测试
127.0.0.1:6379> exists test:key:expire
(integer) 0
127.0.0.1:6379> expire test:key:expire 15 
(integer) 0
127.0.0.1:6379> ttl test:key:expire
(integer) -2

//key存在
127.0.0.1:6379> set test:key:expire 'test'
OK
127.0.0.1:6379> expire test:key:expire 15
(integer) 1
127.0.0.1:6379> ttl test:key:expire
(integer) 10

//key过期
127.0.0.1:6379> ttl test:key:expire
(integer) -2
127.0.0.1:6379> exists test:key:expire
(integer) 0
//key不存在
127.0.0.1:6379> exists test:key:expireat
(integer) 0
127.0.0.1:6379> time
1) "1545183509"
2) "248303"
127.0.0.1:6379> expireat test:key:expireat 1545183700
(integer) 0

//key存在
127.0.0.1:6379> set test:key:expireat 'test'
OK
127.0.0.1:6379> expireat test:key:expireat 1545183720
(integer) 1
127.0.0.1:6379> ttl test:key:expireat
(integer) 93

//key过期
127.0.0.1:6379> ttl test:key:expireat
(integer) -2
127.0.0.1:6379> exists test:key:expireat
(integer) 0
补充:
ttl和pttl命令的返回:
   (1)大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。
   (2)-1:键没有设置过期时间。
   (3)-2:键不存在。

除此之外,redis还提供了毫秒级的过期方案:

  • pexpire key milliseconds: --键在milliseconds毫秒后过期。
  • pexpireat key milliseconds-timestamp --键在毫秒级时间戳timestamp后过期。
注意:
(1)如果过期时间为负值,键会立即被删除,犹如使用del命令一样;
(2)persist命令可以将键的过期时间清除;
(3)==对于字符串类型键,执行set命令会去掉过期时间==;
(4)Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置;
(5)setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间。

键过期对内存的影响

redis对内存的管理回收有两个方面,一个是删除到期过期时间的key对象,一个是内存使用到达maxmemory上限时触发内存溢出控制策略。现在我们来讨论一下先者。

由于进程内保存大量的键,维护每个键精准的过期删除机制会导致消耗大量的CPU,对于单线程的Redis来说成本过高,因此Redis采用惰性删除和定时任务删除机制实现过期键的内存回收。

  • 惰性删除:惰性删除用于当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护TTL链表来处理过期键的删除。但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。正因为如此,Redis还提供另一种定时任务删除机制作为惰性删除的补充。

  • 定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例、使用快慢两种速率模式回收键

image.png

相关文章

  • redis如何设置键过期和键过期对内存的影响

    如何设置键过期 Redis所有的键都可以设置过期属性,内部保存在过期字典中。 expire key seconds...

  • Redis键的生存时间和过期时间

    一、设置键的过期时间 Redis可以通过EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT对键设置...

  • Redis 特性

    一、键的过期 Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。 二、事务与流水线 使用 MULT...

  • redis的过期时间和过期删除机制

    一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: 二:保存过期时间 那么redis里面对...

  • Redis过期删除策略和内存淘汰策略

    1. 过期删除策略 Redis可以用使用expire指令设置过期时间,在Redis内部,每当我们设置一个键的过期时...

  • redis操作

    1.设置redis键的过期时间(秒) : set key value ex 10 # 设置key的过期时间10...

  • Redis单机数据库的实现

    数据库 redis默认会创建16个数据库;删除过期键有三种策略: 定时删除:对某个键设置过期时间,时间一到就删除键...

  • redis原理分析

    过期时间设置 在Redis中提供了Expire命令设置一个键的过期时间,到期以后Redis会自动删除它。EXPIR...

  • redis过期时间的设置

    设置过期时间 移除过期时间 查看过期时间 是否设置过期时间 过期键的删除策略: 立即删除:在创建键的操作时间时,创...

  • Redis 的过期策略是如何实现的?

    背景 为了减少占用内存空间,通常会对放到 Redis 中的键通过 expire 设置一个过期时间,那 Redis ...

网友评论

    本文标题:redis如何设置键过期和键过期对内存的影响

    本文链接:https://www.haomeiwen.com/subject/mlmdkqtx.html