大家好,今日小柳来为大家解答以上的问题。redis清缓存,redis缓存清除策略及其配置很多人还不知道,现在让我们一起来看看吧!

redis清缓存 redis缓存清除策略及其配置redis清缓存 redis缓存清除策略及其配置


redis清缓存 redis缓存清除策略及其配置


1、LRU, 近少使用 (Least Recently Used,LRU),经典缓存算法。

2、LRU会使用一个链表维护缓存中每个数据的访问情况,并根据数据的实时访问,调整数据在链表中的位置,然后通过数据在链表中的位置,表示数据是近刚访问的,还是已有段时间未访问。

3、LRU会把链头、尾分别设为MRU端和LRU端:LRU可分成如下情况:case2图解:链表长度为5,从链表头部到尾部保存的数据分别是5,33,9,10,8。

4、设数据9被访问一次,则9就会被移动到链表头部,同时,数据5和33都要向链表尾部移动一位。

5、所以若严格按LRU实现,设Redis保存的数据较多,还要在代码中实现:Redis如何实现近似LRU算法的呢?近似LRU算法仍需区分不同数据的访问时效性,即Redis需知道数据的近一次访问时间。

6、因此,有了LRU时钟:记录数据每次访问的时间戳。

7、Redis对每个KV对中的V,会使用个redisObject结构体保存指向V的指针。

8、那redisObject除记录值的指针,还会使用24 bits保存LRU时钟信息,对应的是lru成员变量。

9、这样,每个KV对都会把它近一次被访问的时间戳,记录在lru变量。

10、每个KV对的LRU时钟值是如何计算的?Redis 使用一个实例级别的全局LRU时钟,每个KV对的LRU time会根据全局LRU时钟进行设置。

11、这全局LRU时钟保存在Redis全局变量server的成员变量 lruclock于是,就得注意, 若一个数据前后两次访问的时间间隔 1s,那这两次访问的时间戳就是一样的! 因为LRU时钟精度就是1s,它无法区分间隔小于1秒的不同时间戳!getLRUClock函数将获得的UNIX时间戳,除以LRU_CLOCK_RESOLUTION后,就得到了以LRU时钟精度来计算的UNIX时间戳,也就是当前的LRU时钟值。

12、getLRUClock会把LRU时钟值和宏定义LRU_CLOCK_MAX(LRU时钟能表示的值)做与运算。

13、那Redis 运行过程中,全局LRU时钟值是如何更新的?和Redis 在驱动框架中,定期运行的时间所对应的serverCron有关。

14、serverCron作为时间的回调函数,本身会周期性执行,其频率值由redis.conf的 hz配置项 决定,默认值10,即serverCron函数会每100ms(1s/10 = 100ms)运行一次。

15、serverCron中,全局LRU时钟值就会按该函数执行频率,定期调用getLRUClock进行更新:对于每个KV对,它对应的redisObject.lru在哪些函数进行初始化和更新的呢?对于一个KV对,其LRU时钟值初是在这KV对被创建时,进行初始化设置的,这初始化作在 createObject函数 中调用,当Redis要创建一个KV对,就会调用该函数。

16、LRU_CLOCK返回当前全局LRU时钟值。

17、因为一个KV对一旦被创建,就相当于有了次访问,其对应LRU时钟值就表示了它的访问时间戳:那一个KV对的LRU时钟值又是何时再被更新?只要一个KV对被访问,其LRU时钟值就会被更新!而当一个KV对被访问时,访问作终都会调用 lookupKey 。

18、lookupKey会从全局哈希表中查找要访问的KV对。

19、若该KV对存在,则lookupKey会根据maxmemory_policy的配置值,来更新键值对的LRU时钟值,也就是它的访问时间戳。

20、而当maxmemory_policy没有配置为LFU策略时,lookupKey函数就会调用LRU_CLOCK函数,来获取当前的全局LRU时钟值,并将其赋值给键值对的redisObject结构体中的lru变量近似LRU主要逻辑在performEvictiCache作为中间缓存时代,将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。

21、performEvictions被evictionTimeProc调用,而evictionTimeProc函数又是被processCommand调用。

22、一旦performEvictions被调用,且maxmemory-policy被设置为allkeys-lru或volatile-lru,近似LRU就被触发执行了。

23、执行可分成如下步骤:调用getMaxmemoryState评估当前内存使用情况,判断当前Redis 使用内存容量是否超过maxmemory配置值。

24、若未超过maxmemory ,则返回C_OK,performEvictions也会直接返回。

25、getMaxmemoryState评估当前内存使用情况的时候,若发现已用内存超出maxmemory,会计算需释放的内存量。

26、这个释放内存大小=已使用内存量-maxmemory。

本文到这结束,希望上面文章对大家有所帮助。