复述,如何使用LRU算法?

  

<强> 1,设置复述,使用LRU算法

LRU(最近最少使用)最近最少使用算法是众多置换算法中的一种。
复述,中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小.Redis用到的LRU算法,是一种近似的LRU算法。

<强>(1)设置maxmemory

上面已经说过maxmemory是为了限定复述最大内存使用量。有多种方法设定它的大小。其中一种方法是通过配置设置设定,如下:

127.0.0.1:6379>配置得到maxmemory   1)“maxmemory"   2)“0”;   127.0.0.1:6379>配置设置maxmemory 100 mb   好吧   127.0.0.1:6379>配置得到maxmemory   1)“maxmemory"   2)“104857600”

另一种方法是修改配置文件复述。相依:

maxmemory 100 mb

注意,在64位系统下,maxmemory设置为0表示不限制复述,内存使用,在32位系统下,maxmemory隐式不能超过3 gb。
当复述,内存使用达到指定的限制时,就需要选择一个置换的策略。

<强>(2)置换策略

当复述,内存使用达到maxmemory时,需要选择设置好的maxmemory-policy进行对老数据的置换。
下面是可以选择的置换策略:

    <李>

    noeviction:不进行置换,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回误差

    <李>

    allkeys-lru:优先删除掉最近最不经常使用的钥匙,用以保存新数据

    <李>

    volatile-lru:只从设置失效(到期集)的关键中选择最近最不经常使用的关键进行删除,用以保存新数据

    <李>

    allkeys-random:随机从所有密钥中选择一些关键进行删除,用以保存新数据

    <李>

    volatile-random:只从设置失效(到期集)的关键中,选择一些关键进行删除,用以保存新数据

    <李>

    volatile-ttl:只从设置失效(到期集)的关键中,选出存活时间(TTL)最短的键进行删除,用以保存新数据

需要注意的是:

(1)设置maxmemory-policy的方法和设置maxmemory方法类似,通过复述。conf或是通过CONFIG SET动态修改。

(2)如果没有匹配到可以删除的key,那么volatile-lru、volatile-random和volatile-ttl策略和noeviction替换策略一样——不对任何key进行置换。

(3)选择合适的置换策略是很重要的,这主要取决于你的应用的访问模式,当然你也可以动态的修改置换策略,并通过用Redis命令——INFO去输出cache的命中率情况,进而可以对置换策略进行调优。

一般来说,有这样一些常用的经验:

  • 在所有的key都是最近最经常使用,那么就需要选择allkeys-lru进行置换最近最不经常使用的key,如果你不确定使用哪种策略,那么推荐使用allkeys-lru。

  • 如果所有的key的访问概率都是差不多的,那么可以选用allkeys-random策略去置换数据。

  • 如果对数据有足够的了解,能够为key指定hint(通过expire/ttl指定),那么可以选择volatile-ttl进行置换。

volatile-lru 和 volatile-random经常在一个Redis实例既做cache又做持久化的情况下用到,然而,更好的选择使用两个Redis实例来解决这个问题。

设置是失效时间expire会占用一些内存,而采用allkeys-lru就没有必要设置失效时间,进而更有效的利用内存。

(3)置换策略是如何工作的

理解置换策略的执行方式是非常重要的,比如:

  1. 客户端执行一条新命令,导致数据库需要增加数据(比如set key value)

  2. Redis会检查内存使用,如果内存使用超过maxmemory,就会按照置换策略删除一些key

  3. 新的命令执行成功

我们持续的写数据会导致内存达到或超出上限maxmemory,但是置换策略会将内存使用降低到上限以下。

如果一次需要使用很多的内存(比如一次写入一个很大的set),那么,Redis的内存使用可能超出最大内存限制一段时间。

(4)近似LRU算法

Redis中的LRU不是严格意义上的LRU算法实现,是一种近似的LRU实现,主要是为了节约内存占用以及提升性能。Redis有这样一个配置——maxmemory-samples,Redis的LRU是取出配置的数目的key,然后从中选择一个最近最不经常使用的key进行置换,默认的5,如下:

maxmemory-samples 5

可以通过调整样本数量来取得LRU置换算法的速度或是精确性方面的优势。

Redis不采用真正的LRU实现的原因是为了节约内存使用。虽然不是真正的LRU实现,但是它们在应用上几乎是等价的。下图是Redis的近似LRU实现和理论LRU实现的对比:

复述,如何使用LRU算法?