Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis。在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?另外对于带有过期时间的 Key Redis 又是如何处理的呢?
我们都知道如果我们要设置 Redis 的最大内存大小只需要在配置文件redis.conf 中配置一行 maxmemory xxx 即可,或者我们通过 config set 命令在运行时动态配置 Redis 的内存大小。
3.1、过期策略的配置
那么当 Redis 内存不够的时候,我们要知道 Redis 是根据什么策略来淘汰数据的,在配置文件中我们使用 maxmemory-policy 来配置策略,如下图:
我们可以看到策略的值由如下几种:
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、策略的执行过程
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.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:
意思是说 Redis 会在有过期时间的 Key 集合中随机 20 个出来,删掉已经过期的 Key,如果比例超过 25%,再重新执行操作。每秒中会执行 10 个这样的操作。
今天给大家介绍了一下 Redis 的内存回收和 Key 过期策略的处理,Redis 作为必备的开发组件,我们必须好好掌握,希望今天的文章能帮助大家更好的掌握 Redis 的核心。另外欢迎大家到我们的知识星球中与我们一起进步。
许多组织都在努力从分析中获取业务价值。Gartner的调查称,到2022年,只有20%的...
服务网格(Service Mesh)为服务通信带来了安全性、弹性、可见性,因此使开发人员...
本文转载自微信公众号「后端技术指南针」,作者程序员大白啊 。转载本文请联系后...
Nginx 是一个采用主从架构的 Web 服务器,可用于反向代理、负载均衡器、邮件代理...
简介: 有一类写多读少的业务场景:大部分请求是对数据进行修改,少部分请求对数...
美国服务器租用已经不是刚刚兴起的业务,对于国内企业用户来讲,至少也有15年的...
随着虚拟技术的不断成熟,服务器租用在全球的热度日益高涨。虽然国内服务器技术...
在 Node.js 中开启一个 HTTP 服务很简单,如果想使用 Node.js 开启一个 HTTPS 的...
在过去的20年中,Progressive雇用了70至90名夏季IT实习生,这些实习生从5月至8月...
做网站懒得备案,选国外云服务器就能解决这个问题,那么 国外云服务器哪家好 呢?...