Redis 删除策略的三种实现

 更新时间:2023年06月21日 09:18:50   作者:Doker 多克  
本文主要介绍了Redis 删除策略的三种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Redis中的数据删除策略包括定:时删除、惰性删除、定期删除

一、Redis过期时间设置

Redis提供了四个命令来设置过期时间(生存时间)。

  • EXPIRE :表示将键 key 的生存时间设置为 ttl 秒。
  • PEXPIRE :表示将键 key 的生存时间设置为 ttl 毫秒。
  • EXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳。
  • PEXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的毫秒数时间戳。

二、定时删除

  • 当key设置有过期时间,且过期时间到达时,立即执行key的删除操作
  • 优点:节约内存,到时就删除,立即释放不必要的内存占用
  • 缺点:CPU压力较大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
  • 总结:用处理器性能换取存储空间(时间换空间),适用于小内存,强CPU场景

三、惰性删除 (空间换时间)

数据到达过期时间,先不做处理。等下次访问该数据时,发现数据已过期,删除,给客户端返回不存在。

  • 优点:节约CPU性能,发现不得不删除的时候才删除
  • 缺点:内存空间压力很大,出现长期占用内存的数据
  • 总结:用存储空间换取处理器性能 (空间换时间),适用于大内存,弱CPU场景

四、 定期删除(中和以上两种方案)

由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

注意:并不是一次运行就检查所有的库,所有的键,而是随机检查一定数量的键。

定期删除函数的运行频率,在Redis2.6版本中,规定每秒运行10次,大概100ms运行一次。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数。

  • 特点1:CPU性能占用设置有峰值,检测频度可自定义设置
  • 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

五、三种删除方案对比

内存占用

CPU占用特征

定时删除

节约内存,无占用

不分时段占用CPU资源,频度高

时间换空间
惰性删除

内存占用严重

延时执行,CPU利用率高

空间换时间

定期删除

内存定期随机清理

每秒花费固定的CPU资源维护内存

随机抽查,重点抽查

六、逐出算法

Redis密钥驱逐策略概述(LRU、LFU等)
当Redis被用作缓存时,在添加新数据时,让它自动收回旧数据通常很方便。这种行为在开发人员社区中是众所周知的,因为它是流行的memcached系统的默认行为。
本页介绍了Redis maxmemory指令的更一般的主题,该指令用于将内存使用限制在固定数量。它还广泛涵盖了Redis使用的LRU驱逐算法,该算法实际上是精确LRU的近似值。

1、MaxMemory配置指令

maxmemory配置指令将Redis配置为对数据集使用指定数量的内存。您可以使用redis.conf文件设置配置指令,或者稍后在运行时使用CONFIG set命令设置配置指令。
例如,要配置100兆字节的内存限制,可以在redis.conf文件中使用以下指令:

maxmemory 100mb

将maxmemory设置为零将导致无内存限制。这是64位系统的默认行为,而32位系统使用3GB的隐式内存限制。
当达到指定的内存量时,驱逐策略的配置方式决定了默认行为。Redis可以为可能导致使用更多内存的命令返回错误,也可以在每次添加新数据时收回一些旧数据以返回到指定的限制。

2、驱逐政策

当达到最大内存限制时,Redis遵循的确切行为是使用maxmemory策略配置指令配置的。
以下策略可用:

  • noeviction:当达到内存限制时,不会保存新值。当数据库使用复制时,这适用于主数据库
  • allkeys-lru:保留最近使用的密钥;删除最近最少使用的(LRU)密钥
  • allkeys-lfu:保留常用密钥;删除最不常用的(LFU)密钥
  • volatilelru:删除最近最少使用的密钥,并将expire字段设置为true。
  • volatile lfu:删除过期字段设置为true的最不常用密钥。
  • allkeys random:随机删除密钥,为添加的新数据腾出空间。
  • volatile random:随机删除过期字段设置为true的密钥。
  • volatile ttl:删除过期字段设置为true和剩余最短生存时间(ttl)值的键。

到此这篇关于Redis 删除策略的三种实现的文章就介绍到这了,更多相关Redis 删除策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis缓存lettuce更换为Jedis的实现步骤

    Redis缓存lettuce更换为Jedis的实现步骤

    在springboot中引入spring-boot-starter-data-redis依赖时,默认使用的是lettuce,如果不想使用lettuce而是使用Jedis连接池,本文主要介绍了Redis缓存lettuce更换为Jedis的实现步骤,感兴趣的可以了解一下
    2024-08-08
  • Redis集群搭建(主从模式、哨兵模式、集群模式)

    Redis集群搭建(主从模式、哨兵模式、集群模式)

    本文主要介绍了Redis集群搭建,主要包括主从模式、哨兵模式、集群模式这三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 详解Redis 键和字符串常用命令

    详解Redis 键和字符串常用命令

    字符串是 Redis 最基本的数据结构,它将以一个键 和一个值 储存在 Redis 内部,本文重点给大家介绍Redis键和字符串常用命令,感兴趣的朋友一起看看吧
    2022-02-02
  • redis中跳表zset的具体使用

    redis中跳表zset的具体使用

    Redis跳表zset是一种结合了跳表和有序集合的高效数据结构,适用于实现排序和大规模数据的快速查询,本文主要介绍了redis中跳表zset的具体使用,感兴趣的可以了解一下
    2024-01-01
  • 利用redis lua脚本实现时间窗分布式限流

    利用redis lua脚本实现时间窗分布式限流

    Lua是一种轻量小巧的脚本语言,Redis是高性能的key-value内存数据库,在部分场景下,是对关系数据库的良好补充,本文给大家介绍了如何利用redis lua脚本实现时间窗分布式限流,需要的朋友可以参考下
    2024-03-03
  • redis中List列表常见命令及使用场景

    redis中List列表常见命令及使用场景

    这篇文章主要给大家介绍了关于redis中List列表常见命令及使用场景的相关资料,Redis列表是简单的字符串列表,按照插入顺序排序,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 基于redis分布式锁实现秒杀功能

    基于redis分布式锁实现秒杀功能

    这篇文章主要为大家详细介绍了基于redis分布式锁实现秒杀功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Redis数据结构SortedSet的底层原理解析

    Redis数据结构SortedSet的底层原理解析

    这篇文章主要介绍了Redis数据结构SortedSet的底层原理解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • redis.config配置文件

    redis.config配置文件

    在使用Redis时,我们通常需要对Redis进行一些配置,以确保其能够正常运行并满足我们的需求,本文主要介绍了redis.config配置文件,感兴趣的可以了解一下
    2023-11-11
  • Redis处理高并发机制原理及实例解析

    Redis处理高并发机制原理及实例解析

    这篇文章主要介绍了Redis处理高并发机制原理及实例解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值析,需要的朋友可以参考下
    2020-08-08

最新评论