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-lru
和allkeys-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机制,而在高速缓存等需要频繁淘汰的场景下,则可以采用其他的淘汰策略。