Redis中LRU算法和LFU算法的区别小结

 更新时间:2023年12月10日 10:38:01   作者:从0到1的旅行家  
在Redis中,LRU算法和LFU算法是两种常用的缓存淘汰算法,它们可以帮助我们优化缓存性能,本文主要介绍了Redis中LRU算法和LFU算法的区别,感兴趣的可以了解一下

 一、LRU

LRU(最近最少使用):LRU策略基于"最近使用原则",即最近被访问的项目具有更高的保留优先级。当缓存空间已满,而需要插入新项目时,LRU策略会替换最近最少使用的项目。这种策略假设最近被访问的项目更有可能在近期再次使用,因此将较长时间没有被使用的项目替换出去。

简单来说就是淘汰很久没用的数据或项目。

LRU的实现

传统 LRU 算法的实现是基于「链表」结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可,因为链表尾部的元素就代表最久未被使用的元素。

Redis 并没有使用这样的方式实现 LRU 算法,因为传统的 LRU 算法存在两个问题:

  • 需要用链表管理所有的缓存数据,这会带来额外的空间开销;
  • 当有数据被访问时,需要在链表上把该数据移动到头端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。

Redis 是如何实现 LRU 算法的?

Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是在 Redis 的对象结构体中添加一个额外的字段,用于记录此数据的最后一次访问时间

当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值(此值可配置),然后淘汰最久没有使用的那个

Redis 实现的 LRU 算法的优点:

  • 不用为所有的数据维护一个大链表,节省了空间占用;
  • 不用在每次数据访问时都移动链表项,提升了缓存的性能;

但是 LRU 算法有一个问题,无法解决缓存污染问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染。

二、LFU

LFU(最不经常使用):LFU策略基于"最不经常使用原则",即使用次数最少的项目具有较低的保留优先级。当缓存空间已满,而需要插入新项目时,LFU策略会替换使用次数最少的项目。这种策略假设使用频率较低的项目在未来也会继续被较少地使用,因此将使用次数较少的项目替换出去。

        LFU 算法会记录每个数据的访问次数。当一个数据被再次访问时,就会增加该数据的访问次数。这样就解决了偶尔被访问一次之后,数据留存在缓存中很长一段时间的问题,相比于 LRU 算法也更合理一些。

简单来说就是淘汰用的最少的数据或项目。

Redis 是如何实现 LFU 算法的?

LFU 算法相比于 LRU 算法的实现,多记录了「数据的访问频次」的信息。Redis 对象的结构如下:

typedef struct redisObject {
    ...
      
    // 24 bits,用于记录对象的访问信息
    unsigned lru:24;  
    ...
} robj;

Redis 对象头中的 lru 字段,在 LRU 算法下和 LFU 算法下使用方式并不相同。

在 LRU 算法中,Redis 对象头的 24 bits 的 lru 字段是用来记录 key 的访问时间戳,因此在 LRU 模式下,Redis可以根据对象头中的 lru 字段记录的值,来比较最后一次 key 的访问时间长,从而淘汰最久未被使用的 key。

在 LFU 算法中,Redis对象头的 24 bits 的 lru 字段被分成两段来存储,高 16bit 存储 ldt(Last Decrement Time),用来记录 key 的访问时间戳;低 8bit 存储 logc(Logistic Counter),用来记录 key 的访问频次。

到此这篇关于Redis中LRU算法和LFU算法的区别小结的文章就介绍到这了,更多相关Redis LRU算法和LFU算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis数据结构类型示例解析

    Redis数据结构类型示例解析

    这篇文章主要为大家介绍了Redis数据结构类型示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 如何基于Session实现短信登录功能

    如何基于Session实现短信登录功能

    对比起Cookie,Session是存储在服务器端的会话,相对安全,并且不像Cookie那样有存储长度限制,下面这篇文章主要给大家介绍了关于如何基于Session实现短信登录功能的相关资料,需要的朋友可以参考下
    2022-10-10
  • 浅谈我是如何用redis做实时订阅推送的

    浅谈我是如何用redis做实时订阅推送的

    这篇文章主要介绍了浅谈我是如何用redis做实时订阅推送的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • ELK配置转存redis缓存采集nginx访问日志的操作方法

    ELK配置转存redis缓存采集nginx访问日志的操作方法

    本文介绍了在服务器上部署MySQL及如何启动MySQL服务,并详细说明了如何查找安装软件的日志文件位置,通过使用rpm命令查询MySQL服务的日志文件位置,以及通过编辑Logstash配置文件来添加MySQL日志信息,感兴趣的朋友一起看看吧
    2024-11-11
  • 基于Redis实现共享Session登录的实现

    基于Redis实现共享Session登录的实现

    本文主要介绍了基于Redis实现共享Session登录的实现,包括发送短信验证码、短信验证码登录和注册、以及登录状态校验的流程,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 一文详解如何使用Redis实现分布式锁

    一文详解如何使用Redis实现分布式锁

    这篇文章主要介绍了一文详解如何使用Redis实现分布式锁,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Windows下redis下载、redis安装及使用教程

    Windows下redis下载、redis安装及使用教程

    redis 提供了多种数据类型来支持不同的业务场景,所以经常使用在分布式锁中,今天给大家讲解redis安装及使用教程,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Redis批量删除指定前缀的Key两种方法

    Redis批量删除指定前缀的Key两种方法

    redis作为缓存服务器在项目中经常使用,使用redis存储数据时,我们经常会将key分组,这篇文章主要给大家介绍了关于Redis批量删除指定前缀的Key两种方法,需要的朋友可以参考下
    2024-01-01
  • 使用Redis实现分布式锁与缓存策略方式

    使用Redis实现分布式锁与缓存策略方式

    文章介绍了Redis在分布式系统中实现分布式锁和缓存策略的优势,并详细阐述了SETNX+EXPIRE、使用Lua脚本、SETEXPXNX命令和Redisson框架等几种常见的分布式锁实现方案,同时,文章还探讨了旁路缓存、缓存穿透、缓存雪崩和缓存击穿等几种缓存策略
    2025-11-11
  • Redis集群删除后重建后报错:unrecoverable erro:corrupted cluster config file问题及解决

    Redis集群删除后重建后报错:unrecoverable erro:corrupted clust

    这篇文章主要介绍了Redis集群删除后重建后报错:unrecoverable erro:corrupted cluster config file问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-06-06

最新评论