服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - Redis 生死簿是如何删除数据的?

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

2022-01-04 21:49Java技术指北指北君 Redis

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

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

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

Redis 有三种策略删除过期 Key

相关命令

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

当已用的内存超过 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 需要的刚需知识越来越多,越来越多...,还大伙儿都下班学学学,就这样的卷呀卷呀卷!

原文链接:https://mp.weixin.qq.com/s/GgsF3qZ8tAgQ4XBU2f3wXg

延伸 · 阅读

精彩推荐
  • Redis在ssm项目中使用redis缓存查询数据的方法

    在ssm项目中使用redis缓存查询数据的方法

    本文主要简单的使用Java代码进行redis缓存,即在查询的时候先在service层从redis缓存中获取数据。如果大家对在ssm项目中使用redis缓存查询数据的相关知识感...

    caychen8962019-11-12
  • Redisredis启动,停止,及端口占用处理方法

    redis启动,停止,及端口占用处理方法

    今天小编就为大家分享一篇redis启动,停止,及端口占用处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    澄海单挑狂5152019-11-14
  • RedisLinux Redis 的安装步骤详解

    Linux Redis 的安装步骤详解

    这篇文章主要介绍了 Linux Redis 的安装步骤详解的相关资料,希望大家通过本文能掌握如何安装Redis,需要的朋友可以参考下 ...

    carl-zhao3822019-11-08
  • RedisRedis存取序列化与反序列化性能问题详解

    Redis存取序列化与反序列化性能问题详解

    这篇文章主要给大家介绍了关于Redis存取序列化与反序列化性能问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    这名字已经存在9742021-02-24
  • Redis就这?Redis持久化策略——AOF

    就这?Redis持久化策略——AOF

    今天为大家介绍Redis的另一种持久化策略——AOF。注意:AOF文件只会记录Redis的写操作命令,因为读命令对数据的恢复没有任何意义...

    头发茂密的刘叔4052021-12-14
  • RedisRedis分布式锁升级版RedLock及SpringBoot实现方法

    Redis分布式锁升级版RedLock及SpringBoot实现方法

    这篇文章主要介绍了Redis分布式锁升级版RedLock及SpringBoot实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    等不到的口琴7802021-07-25
  • RedisRedis数据结构之链表与字典的使用

    Redis数据结构之链表与字典的使用

    这篇文章主要介绍了Redis数据结构之链表与字典的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    白泽来了4052021-08-03
  • Redis聊一聊Redis与MySQL双写一致性如何保证

    聊一聊Redis与MySQL双写一致性如何保证

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。本文给大家分享Redis与MySQL双写一致性该如何保证,感兴趣的朋友一...

    mind_programmonkey6432021-08-12