Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。

大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑更多的业务服务,就必须要让那些访问频率不高的缓存删除掉,为新的缓存腾出内存空间。

Redis主要通过两种方式相互配合来实现键值的清理,即:过期策略和内存淘汰机制。

内存淘汰策略

当 Redis 节点分配的内存使用到达最大值以后,为了继续提供服务,Redis 会启动内存淘汰策略,在Redis4.0之前主要是以下六种淘汰策略:

  • noeviction:不淘汰任何数据,当内存不足时,执行缓存新增操作会报错,这种策略下可以保证数据不丢失,它也是 Redis 默认的内存淘汰策略。

  • allkeys-lru:淘汰整个键值中最久未使用的键值,这也就是我们常说的LRU算法。

  • allkeys-random:随机淘汰任意键值。

  • volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值。

  • volatile-random:随机淘汰设置了过期时间的任意键值。

  • volatile-ttl:优先淘汰设置了过期时间中更早过期的键值。

通过上面的内存淘汰策略可以看出,以 allkeys- 开头的表示从所有key中进行数据淘汰,而以 volatile-开头的会从设置了过期时间的key中进行数据淘汰。

而在Redis4.0版本中又新增了2种淘汰策略:

  • allkeys-lfu,淘汰整个键值中最少使用的键值,这也就是我们常说的LRU算法。

  • volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值。

LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰;

LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰。

大家可以在 redis.conf 配置文件中修改配置项 maxmemory-policy ,将其修改成需要设置的类型即可。

缓存过期策略

内存淘汰策略是当内存不够用时才会触发的一种机制,是缓存服务层面的操作,而过期策略定义的是具体缓存数据何时失效。我们在使用Redis的时候经常会给redis的key设置一个过期时间如:EXPIRE key 30,过期策略就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。

对于已经过期的数据,Redis将使用两种策略搭配使用来删除这些过期的键值,分别是惰性删除,定期删除。

惰性删除

惰性删除 是指 Redis 服务器不主动删除过期的键值,而是在客户端要获取某个键值时,Redis会先去检测一下这个key是否已经过期,如果没有过期则返回给客户端,如果已经过期了,那么Redis会删除这个key并返回null给客户端。

惰性删除可以解决一些过期了,但没被定期删除随机抽取到的key。但有些过期的key既没有被随机抽取,也没有被客户端访问,就会一直保留在数据库,占用内存,长期下去可能会导致内存耗尽。所以Redis提供了内存淘汰机制来解决这个问题。

惰性删除的优点是不会浪费太多的系统资源,只是在每次访问时才检查键值是否过期。缺点是像上面说的删除过期键不及时,造成了一定的空间浪费。

定期删除

定期删除 是指 Redis 服务器每隔一段时间会检查一下缓存数据库,看看是否有过期键可以被清除。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为“hz 10”。

因为key太多,如果全盘扫描所有的key会非常耗性能,所以定期删除是随机抽取一些key来删除。这样就有可能删除不完,需要惰性删除配合。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

你说,Redis如何实现键值自动清理?相关推荐

  1. linux创建redis容器,docker-compose实现redis部署及键值添加

    为了简化部署过程,减少手工操作,研究出使用docker-compose方式实现redis部署并往该redis中添加键值 以下为我编写的docker-compose.yml文件的内容 #vi /opt/ ...

  2. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  3. Redis入门-基础键值对、list、set、hashlist基础操作

    关于Redis Redis是非关系型数据库(NoSQL)的一种,区别于关系型数据库.其内部数据间相互独立,性能表现优秀.即使是在大量数据下性能也很好,这都得益于其数据结构简单,数据间相互独立的特性.而 ...

  4. 深入探索Redis:高性能键值存储数据库

    系列文章目录 文章目录 系列文章目录 前言 一.Redis简介 1.1 为什么需要Redis 1.1.1 高性能 1.1.2 高并发 1.2 Redis的应用场景 二.Redis 下载安装 2.1 w ...

  5. 浅谈redis数据库的键值设计

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  6. ODAC(V9.5.15) 学习笔记(十九)主键值自动生成

    ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序 ...

  7. redis安装、持久化、数据类型、常用操作、操作键值、安全设置、慢查询日志、存储session、主从配置、集群介绍、集群搭建配置、集群操作,php安装redis扩展...

    21.9 redis介绍 21.10 redis安装 21.11 redis持久化 21.12 redis数据类型 21.13/21.14/21.15 redis常用操作 21.16 redis操作键 ...

  8. redis专题:redis键值设计、性能优化以及redis连接池配置

    文章目录 1.redis键值设计 ①:key设计规范 ②:value设计规范 2. 命令使用优化 3. redis连接池配置参数设计 4. redis连接池预热 5. redis的key过期删除策略 ...

  9. 【Redis】Redis 哈希 Hash 键值对集合操作 ( 哈希 Hash 键值对集合简介 | 查询操作 | 增加操作 | 修改操作 )

    文章目录 一.哈希 Hash 键值对集合 二.查询操作 1.Redis 中查询 Hash 键值对数据 2.查询 Hash 键是否存在 3.查询 Hash 中所有的键 Field 4.查询 Hash 中 ...

最新文章

  1. Ogre 学习笔记 (二) 环境:阴影 、雾效、灯光
  2. PHP 中get_magic_quotes_gpc()函数说明
  3. 前端学习(2612):vuex实现计算
  4. LeetCode 1060. 有序数组中的缺失元素(二分查找)
  5. opencv打开的图片应用于nn.Conv2d()(二)
  6. memcached学习(5). memcached的应用和兼容程序
  7. 2009年02月《安全天下事》、2009年02月《安全天下事之12月,辩证法之月》、《2008信息安全技术与产业大盘点》...
  8. C语言学习书籍推荐!(附自学课程)
  9. 波司登杯2013微软office应用创意大赛烟台大学校园赛参赛历程
  10. 【亲测有效】硬盘/分区修复教程
  11. Mysql 分页,排序 打字练习
  12. 发达国家如何布局大数据战略
  13. win10虚拟机下安装ubuntu16.04详细教程(含锐捷联网教程)
  14. 老电脑可以升级win10系统吗
  15. DeepMind重磅开源强化学习框架!覆盖28款游戏,24多个算法
  16. unity 特效_介绍几个 Unity 开源视觉特效项目
  17. lm做自相关做几阶_lm检验(lm检验怎么判断是几阶自相关)
  18. 市政协调研组:建议设大数据管理局
  19. 艾宾浩斯记忆曲线——定期、及时复习的重要性
  20. 浅谈Python类的属性和方法

热门文章

  1. $ajax 筛选某个属性,jQuery
  2. rabbitmq direct 多个消费者_RabbitMQ实战应用技巧
  3. 损失函数一直不变_MIT 18.03 微分方程笔记 3.4 狄拉克δ函数
  4. CentOS 安装Python 3.52
  5. dump 分析模式之 INCORRECT STACK TRACE
  6. PyQt5学习笔记03----Qt Designer生成源码
  7. File “/usr/bin/yum“, line 30 及 File “/usr/libexec/urlgrabber-ext-down“, line 28
  8. Ubuntu设置开机启动
  9. order by + 数字的用意
  10. Sparta(斯巴达)——信息收集扫描爆破集成