Redis 生死簿是如何删除数据的?

存储 存储软件 Redis
Redis 中所有的键都可以设置过期策略,就像是所有的键都可以上"生死簿",上了生死簿的键到时间后阎王就会叉掉这个键。同一时间大量的键过期,阎王就会忙不过来。

Redis 中所有的键都可以设置过期策略,就像是所有的键都可以上"生死簿",上了生死簿的键到时间后阎王就会叉掉这个键。同一时间大量的键过期,阎王就会忙不过来。同时因为 Redis 是单线程的,导致阎王的处理时间会变得很长,而且处理繁忙,Redis 就会出现卡顿现象。

Redis 有三种策略删除过期 Key

相关命令

  1. expire key seconds  # 过期时间为秒数,key 不存在时返回(integer) 0,key 存在的时返回(integer) 1 
  2.  
  3. pexpire key milliseconds # 同 expire,设置的过期时间为毫秒数 
  4.  
  5. setex key seconds value # 只能设置字符串的过期时间 
  6.  
  7. ttl key # 查看 Key 的过期时间(秒数),用不过期返回(integer) -1,Key 不存在返回(integer) -2 
  8.  
  9. pttl key # 同 ttl,返回毫秒数 

过期 Key

Redis 的每个设置了过期时间的 Key 都会放在一个独立的字典中,用于遍历删除。

过期策略

被动删除

Key 在被操作时,Redis 主动检查 Key 是否过期,过期则删除,返回 nil

  • 对 CPU 友好,只有 Key 在被操作时删除,不会浪费 CPU 时间
  • 对内存不友好,如果同时有大量的 Key 过期,这些 Key 在被使用之前不会被删除,就会浪费内存

主动删除

Redis 会周期性的随机扫描一批设置了过期时间的 Key 并进行处理,Redis 每秒进行10次过期扫描会做的操作有:

随机扫描100个设置了过期时间的 Key

删除所有发现的过期 Key

如果删除的 Key 超过1/4则重复步骤1

  1. hz 10 

Redis 除了设置每秒10次的扫描频率之外,还设置了每次扫描不会超过25ms 的上限,以防出现过度循环扫描,导致线程卡死。

maxmemory 

  1. # maxmemory <bytes> 

当已用的内存超过 maxmemory 配置的内存时,会触发主动清除策略

  1. # maxmemory-policy noeviction 
  • noeviction 永不过期策略,当已用内存超过 maxmemory 配置时,写操作将返回错误,读操作和 del 操作可以继续服务。
  • volatile-lru 只删除设置了过期时间的 Key,使用频率越少的 Key 优先删除,不会对没有设置过期时间的 Key 删除
  • volatile-ttl 和上面一样,只删除设置过期时间的 Key,TTL 过期时间越少优先删除
  • volatile-random 随机删除快要过期的 Key
  • allkeys-lru 和 lru 一样,删除所有的 Key,没有设置过期时间的 Key 也会被删除
  • allkeys-random 和上面一样,删除掉随机的 Key

Redis 采用的过期策略

被动删除+主动删除

总结 

学好 java 需要的刚需知识越来越多,越来越多...,还大伙儿都下班学学学,就这样的卷呀卷呀卷!

 

责任编辑:武晓燕 来源: Java技术指北
相关推荐

2014-04-14 13:05:41

RedisDBA服务器

2019-12-20 14:56:50

批量删除数据数据删除

2011-02-21 10:35:00

查询删除数据

2020-02-27 10:25:06

运维架构技术

2011-05-18 15:08:03

mysql删除修改数据

2023-09-05 08:40:57

删除数据库Oracle

2010-09-02 10:15:46

SQL删除

2023-05-29 00:07:45

2009-09-04 17:56:22

C#删除数据

2009-09-14 10:45:33

LINQ删除数据

2009-11-25 16:29:08

PHP删除数组元素

2021-03-22 08:51:59

RedisKey数据库

2010-09-30 09:42:22

DB2删除数据

2010-11-04 14:39:44

DB2删除数据

2010-09-02 11:24:45

SQL删除

2017-02-06 10:53:33

2010-10-22 16:40:27

SQL TRUNCAT

2017-04-01 18:30:47

MySQL误删除数据库

2014-12-22 09:48:58

DBCAOracle 11

2010-11-10 11:42:35

SQL Server2
点赞
收藏

51CTO技术栈公众号