Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis。在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?

1、前言Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis。在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?另外对于带有过期时间的 Key Redis 又是如何处理的呢?

2、Redis 内存设置我们都知道如果我们要设置 Redis 的最大内存大小只需要在配置文件redis.conf 中配置一行 maxmemory xxx 即可,或者我们通过 config set 命令在运行时动态配置 Redis 的内存大小。

小编最近将收集的Java程序员进阶架构师的资料做了一些整理,资料适合1-5年的Java开发者,现在分享给每一位从事Java的朋友。需要的朋友可以从此链接里面获取 https://w.url.cn/s/AnCuiWo

3、Redis 内存过期策略

3.1、过期策略的配置

那么当 Redis 内存不够的时候,我们要知道 Redis 是根据什么策略来淘汰数据的,在配置文件中我们使用 maxmemory-policy 来配置策略,如下图:

我们可以看到策略的值由如下几种:

  1. volatile-lru: 在所有带有过期时间的 key 中使用 LRU 算法淘汰数据;

2.alkeys-lru: 在所有的 key 中使用最近最少被使用 LRU 算法淘汰数据,保证新加入的数据正常;

3.volatile-random: 在所有带有过期时间的 key 中随机淘汰数据;

4.allkeys-random: 在所有的 key 中随机淘汰数据;

5.volatile-ttl: 在所有带有过期时间的 key 中,淘汰最早会过期的数据;

6.noeviction: 不回收,当达到最大内存的时候,在增加新数据的时候会返回 error,不会清除旧数据,这是 Redis 的默认策略;

volatile-lru, volatile-random, volatile-ttl 这几种情况在 Redis 中没有带有过期 Key 的时候跟 noeviction 策略是一样的。淘汰策略是可以动态调整的,调整的时候是不需要重启的,原文是这样说的,我们可以根据自己 Redis 的模式来动态调整策略。”To pick the right eviction policy is important depending on the access pattern of your application, however you can reconfigure the policy at runtime while the application is running, and monitor the number of cache misses and hits using the Redis INFO output in order to tune your setup.“

3.2、策略的执行过程

1.客户端运行命令,添加数据申请内存;

2.Redis 会检查内存的使用情况,如果已经超过的最大限制,就是根据配置的内存淘汰策略去淘汰相应的 key,从而保证新数据正常添加;

3.继续执行命令。

3.3、近似的 LRU 算法

Redis 中的 LRU 算法不是精确的 LRU 算法,而是一种经过采样的LRU,我们可以通过在配置文件中设置 maxmemory-samples 5 来设置采样的大小,默认值为 5,我们可以自行调整。官方提供的采用对比如下,我们可以看到当采用数设置为 10 的时候已经很接近真实的 LRU 算法了。

在 Redis 3.x 以上的版本的中做过优化,目前的近似 LRU 算法以及提升了很大的效率,Redis 之所以不采样实际的 LRU 算法,是因为会耗费很多的内存,原文是这样说的

The reason why Redis does not use a true LRU implementation is because it costs more memory.

4、Key 的过期策略

4.1、设置带有过期时间的 key

前面介绍了 Redis 的内存回收策略,下面我们看看 Key 的过期策略,提到 Key 的过期策略,我们说的当然是带有 expire 时间的 key,如下:

通过 redis> set name ziyouu ex 100 命令我们在 Redis 中设置一个 key 为 name,值为 ziyouu 的数据,从上面的截图中我们可以看到右下角有个 TTL,并且每次刷新都是在减少的,说明我们设置带有过期时间的 key 成功了。

4.2、Redis 如何清除带有过期时间的 key

对于如何清除过期的 key 通常我们很自然的可以想到就是我们可以给每个 key 加一个定时器,这样当时间到达过期时间的时候就自动删除 key,这种策略我们叫定时策略。这种方式对内存是友好的,因为可以及时清理过期的可以,但是由于每个带有过期时间的 key 都需要一个定时器,所以这种方式对 CPU 是不友好的,会占用很多的 CPU,另外这种方式是一种主动的行为。

有主动也有被动,我们可以不用定时器,而是在每次访问一个 key 的时候再去判断这个 key 是否到达过期时间了,过期了就删除掉。这种方式我们叫做惰性策略,这种方式对 CPU 是友好的,但是对应的也有一个问题,就是如果这些过期的 key 我们再也不会访问,那么永远就不会删除了。

Redis 服务器在真正实现的时候上面的两种方式都会用到,这样就可以得到一种折中的方式。另外在定时策略中,从官网我们可以看到如下说明

Specifically this is what Redis does 10 times per second:

1.Test 20 random keys from the set of keys with an associated expire.

2.Delete all the keys found expired.

3.If more than 25% of keys were expired, start again from step

意思是说 Redis 会在有过期时间的 Key 集合中随机 20 个出来,删掉已经过期的 Key,如果比例超过 25%,再重新执行操作。每秒中会执行 10 个这样的操作。

5、总结

今天给大家介绍了一下 Redis 的内存回收和 Key 过期策略的处理,Redis 作为必备的开发组件,我们必须好好掌握,希望今天的文章能帮助大家更好的掌握 Redis 的核心。另外欢迎大家到我们的知识星球中与我们一起进步。

java redis 数据自过期_Java架构-Redis的内存回收策略和Key过期策略,看这篇就够了...相关推荐

  1. redis缓存雪崩、缓存击穿和缓存穿透还傻傻分不清?看这篇就够了

    前言 关于Redis的高频问题,缓存雪崩.缓存击穿和缓存穿透一定少不了,相信大家在面试中都被问到过类似的问题.为什么这些问题一直热门呢?因为我们在使用Redis缓存时,这些问题都是很容易遇到的.接下来 ...

  2. 阿里P8架构师“墙裂”推荐,JVM性能调优看这篇就够了

    根据JDK12和JDK 13 EA版本全面更新,新增内容近50%,并对第2版中含糊.瑕疵和错误内容进行了修正. 计算机图书领域的丰碑,前两版累计印刷36次,销量超过30万册,两家网店评论数量超过900 ...

  3. redis详细介绍附实例代码--看一篇就够了

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html redis介绍详解附实例代码- ...

  4. 99. 中高级开发面试必问的Redis,看这篇就够了

    中高级开发面试必问的Redis,看这篇就够了! 一.概述 二.数据类型 STRING LIST SET HASH ZSET 三.数据结构 字典 跳跃表 四.使用场景 计数器 缓存 查找表 消息队列 会 ...

  5. Java应用系统监控看这篇就够了

    Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...

  6. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  7. Java String,看这篇就够了

    String,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思. ...

  8. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统

    一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...

  9. java用redis缓存的步骤_Java 使用Redis缓存工具的图文详细方法

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...

最新文章

  1. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
  2. Js选择器方法汇总之Salesforce常用
  3. 服务端 I/O 性能大比拼:Node、PHP、Java、Go哪家强?
  4. 专访厦门第二医院影像科主任郭岗:基于 IBM 推出的 AI 集成解决方案,如何给医生减负增效?...
  5. python多态_多态是什么?为什么要使用多态?
  6. 【Wordpress】分享500多款国外WordPress经典主题 其之三
  7. 局部内部类 java 1614958356
  8. git 强制将本地代码更新仓库里面的代码
  9. html5实现饼图和线图-我们到底能走多远系列(34)
  10. 深入浅出Flume之原理解析
  11. 自定义刻度尺进度条总结
  12. CF487E Tourists (圆方树,LCT)
  13. windows 命令方式查找指定IP的MAC地址
  14. 微信特殊字符包括颜文字、表情的后台存储及前端展示方法
  15. 树脂除镍离子交换作用
  16. R机器学习:分类算法之判别分析LDA,QDA的原理与实现
  17. 基于 Debian 的 GNU/Linux的Parrot 3.11 已发布
  18. 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN
  19. 用u盘把红旗linux操作系统安装到电脑硬盘c:,把系统装进U盘的详细步骤
  20. 原生table-多级表头【广度优先实现】

热门文章

  1. address标签,为网页加入地址信息
  2. html中盒子模型立体结构图
  3. java中的final, finally, finalize的区别
  4. 软件是否有必要进行性能测试
  5. CSLA .Net学习资料
  6. 如何使用JavaScript实现纯前端读取和导出excel文件(转)
  7. Java forEach中 Lambda Expr中的 final变量要求
  8. iOS隐藏键盘的几种方式
  9. paip sms to blog.txt
  10. golang go 语言在 window下执行命令 获取本地ip