redis内存淘汰机制有哪些

1. Redis内存淘汰机制概述

Redis作为一个高性能的NoSQL数据库,在存储方面采用了内存存储技术,也就意味着其内存是极为宝贵的资源,就内存的优化而言,淘汰机制是运用比较频繁的一种,其实所谓淘汰机制,就是在Redis中,当内存空间不足时,自动将一些不常用的数据从内存中淘汰出去,以便为新的数据提供足够的内存空间。在Redis中,淘汰机制有五种丰富的实现方式,本文将逐一讲解。

2. 按照LRU算法淘汰数据

2.1 LRU算法简介

Least Recently Used(LRU)算法是解决淘汰问题的经典算法之一,他的具体做法是将最近不经常使用的数据从内存中淘汰出去,以此来保证存储的高效性。实现上,LRU记录的是最近一段时间内数据的使用情况,一般来说,如果一个链表节点长时间没有被访问过,便会被算法自动淘汰出去。

2.2 Redis中的LRU算法实现

在Redis中,我们也可以使用类似的方式实现LRU算法,具体来说,可以通过限制内存使用量的大小,以及在空间不足时,自动将一些节点从内存中清理出去。在Redis中,按照LRU算法淘汰数据的方式,通常被称为volatile-lru以及allkeys-lru

 maxmemory 10M  #限制内存最大容量

maxmemory-policy volatile-lru #采用volatile-lru算法淘汰

#或

maxmemory-policy allkeys-lru #采用allkeys-lru算法淘汰

从以上配置可以看出,maxmemory这个参数是用来限制Redis内存使用的大小的,而maxmemory-policy则是用来指定淘汰策略的,此处采用的是LRU,其中volatile-lruallkeys-lru分别代表按照LRU淘汰带过期时间的键,和不带过期时间的键。

3. 设置过期时间淘汰数据

3.1 过期时间淘汰简介

在Redis中,我们可以为每个Key设置过期时间,当这个时间到期后,Redis会自动将这个Key清除出内存,从而节约内存空间。

3.2 Redis中的过期时间淘汰实现

在Redis中,我们可以采用expire或者pexpire命令来为key设置过期时间,例如:

set mykey value

expire mykey 10 #设置过期时间为10秒

以上命令会将mykey键的生存时间设置为10秒,并在时间结束时自动将该键删除。实际上,expire方法还有一个变种,就是expireat,用于设置以Unix时间(时间戳)为基准的过期时间。

4. 根据CPU时间淘汰数据

4.1 按照CPU时间淘汰简介

在过去,Redis默认使用LRU算法进行淘汰操作,但这种方法存在明显的缺陷——一旦访问时间较近的节点很多,导致算法需要耗费大量的CPU,从而严重影响Redis的性能。因此,在Redis3.0之后,官方针对这一瓶颈做出了优化,新版本中提供了一种基于CPU耗时的淘汰算法——active-defragmentation

4.2 Redis中的active-defragmentation实现

在Redis中,active-defragmentation选项默认是关闭的,在使用时必须手动开启。同时,需要注意的是,active-defragmentation操作耗费的内存和CPU资源都较为庞大,因此,在决定是否开启这个功能时需要权衡其效果和代价。

maxmemory-samples 5

active-defrag yes

需要注意的是,开启了以后,在Redis较为繁忙时,active-defragmentation会占用大量的CPU资源,并且容易造成Redis实例的崩溃。

5. 提取Key的魔数以及标识淘汰数据

5.1 提取Key的魔数和标识简介

在一些特殊场景下,我们可以根据键的某些信息特征,来对键值数据进行淘汰操作,比如在Redis集群环境下,为了保证数据的分布式特性,我们可以根据Key的魔数以及标识,来对键值数据进行分片淘汰。

5.2 Redis中的魔数淘汰实现

在Redis中,我们可以采用hash-max-ziplist-entries以及hash-max-ziplist-value选项来设置哈希表中节点最大的键值对数量、以及最大的节点值长度,从而决定当前的键会被如何编码。

最终,只有在节点从hash编码改变为ziplist编码时,系统才会自动将一些键从内存中淘汰出去以释放空间。

 hash-max-ziplist-entries 512

hash-max-ziplist-value 64

6. 根据近期的Key操作频率淘汰数据

6.1 Key操作频率淘汰简介

在Redis中,用户可能会将一些甚至很久都不会使用的Key注入到数据库中,而Redis无论是位于内存中,还是在磁盘中,都会一直持有这些Key。

6.2 Redis中的Key操作频率淘汰实现

在Redis4.0中,新增的Key操作频率淘汰算法volatile-random,可以根据随机数的修改频率来对内存中的键值数据进行淘汰操作。

maxmemory-policy volatile-random

以上是开启volatile-policy淘汰策略,并采用volatile-random算法的方式,当发现内存不足时便自动淘汰数据。

7. 总结

以上五种淘汰机制,都是根据内存空间的限制以及对数据的使用情况进行自动淘汰的,从而保证Redis的数据高效存储。我们可以根据实际场景需求进行选择,比如在对读取支持更重要的场景下,可以采用LRU以及active-defragmentation机制,而在高速缓存等需要频繁淘汰的场景下,则可以采用其他的淘汰策略。

数据库标签