返回顶部
首页 > 资讯 > 数据库 >Redis中LFU算法的深入分析
  • 196
分享到

Redis中LFU算法的深入分析

2024-04-02 19:04:59 196人浏览 薄情痞子
摘要

前言 在Redis中的LRU算法文中说到,LRU有一个缺陷,在如下情况下: ~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~| ~~B~~B~~B~~B~~B~~B~~B~~B~

前言

Redis中的LRU算法文中说到,LRU有一个缺陷,在如下情况下:

~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~|
~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~|
~~~~~~~~~~C~~~~~~~~~C~~~~~~~~~C~~~~~~|
~~~~~D~~~~~~~~~~D~~~~~~~~~D~~~~~~~~~D|

会将数据D误认为将来最有可能被访问到的数据。

Redis作者曾想改进LRU算法,但发现Redis的LRU算法受制于随机采样数maxmemory_samples,在maxmemory_samples等于10的情况下已经很接近于理想的LRU算法性能,也就是说,LRU算法本身已经很难再进一步了。

于是,将思路回到原点,淘汰算法的本意是保留那些将来最有可能被再次访问的数据,而LRU算法只是预测最近被访问的数据将来最有可能被访问到。我们可以转变思路,采用一种LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到。在上面的情况中,根据访问频繁情况,可以确定保留优先级:B>A>C=D。

Redis中的LFU思路

在LFU算法中,可以为每个key维护一个计数器。每次key被访问的时候,计数器增大。计数器越大,可以约等于访问越频繁。

上述简单算法存在两个问题:

  • 在LRU算法中可以维护一个双向链表,然后简单的把被访问的节点移至链表开头,但在LFU中是不可行的,节点要严格按照计数器进行排序,新增节点或者更新节点位置时,时间复杂度可能达到O(N)。
  • 只是简单的增加计数器的方法并不完美。访问模式是会频繁变化的,一段时间内频繁访问的key一段时间之后可能会很少被访问到,只增加计数器并不能体现这种趋势。

第一个问题很好解决,可以借鉴LRU实现的经验,维护一个待淘汰key的pool。第二个问题的解决办法是,记录key最后一个被访问的时间,然后随着时间推移,降低计数器。

Redis对象的结构如下:


typedef struct redisObject {
  unsigned type:4;
  unsigned encoding:4;
  unsigned lru:LRU_BITS; 
  int refcount;
  void *ptr;
} robj;
您可能感兴趣的文档:

--结束END--

本文标题: Redis中LFU算法的深入分析

本文链接: https://lsjlt.com/news/50791.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis中LFU算法的深入分析
    前言 在Redis中的LRU算法文中说到,LRU有一个缺陷,在如下情况下: ~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~| ~~B~~B~~B~~B~~B~~B~~B~~B~...
    99+
    2024-04-02
  • 深入浅析Vue2中的Diff算法
    为什么要用 Diff 算法虚拟 DOM因为 Vue2 底层是用虚拟 DOM 来表示页面结构的,虚拟 DOM其实就是一个对象,如果想知道怎么生成的,其实大概流程就是:首先解析模板字符串,也就是 .vue 文件然后转换成 AST 语法树接着生成...
    99+
    2023-05-14
    diff算法 Vue.js 前端
  • Redis中LRU淘汰策略的深入分析
    前言 Redis作为缓存使用时,一些场景下要考虑内存的空间消耗问题。Redis会删除过期键以释放空间,过期键的删除策略有两种: 惰性删除:每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,...
    99+
    2024-04-02
  • 深入浅析React中diff算法
    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的...
    99+
    2024-04-02
  • 如何深入理解Python中的Apriori关联分析算法
    今天就跟大家聊聊有关如何深入理解Python中的Apriori关联分析算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放...
    99+
    2023-06-02
  • 怎么深入解析Vue3中的diff 算法
    今天给大家介绍一下怎么深入解析Vue3中的diff 算法。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。1.0  diff 无key子节点在处理被标记...
    99+
    2023-06-26
  • Java编码算法与哈希算法深入分析使用方法
    目录一、编码算法1.什么是编码2.URL编码3.Base64编码二、哈希算法1.概述2.哈希碰撞3.常用哈希算法①.MD5②.SHA-1③.RipeMD-1604.哈希算法的用途三、...
    99+
    2022-11-13
    Java编码算法 Java哈希算法
  • 分析redis集群中数据分布算法
    这篇文章主要介绍“分析redis集群中数据分布算法”,在日常操作中,相信很多人在分析redis集群中数据分布算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析redis集...
    99+
    2024-04-02
  • Redis内存碎片原理深入分析
    目录前言释放的内存去了哪里?什么是内存碎片?什么导致内存碎片?如何解决?总结前言 我们先来看一个问题, 假设Redis实例保存了5GB的数据,现在删除了2GB的数据,那么Redis...
    99+
    2023-02-01
    Redis内存碎片 Redis 内存
  • 深入分析Python中Lambda函数的用法
    目录lambda语法高阶函数内置高阶函数lambda函数是一种小的匿名函数。 lambda语法 lambda函数: lambda [arg1 [,arg2,...[,argn]]] ...
    99+
    2022-12-22
    Python Lambda函数 Python Lambda表达式
  • Redis中AOF与RDB持久化策略深入分析
    目录写在前面一、Redis为什么要持久化二、Redis的持久化方式2.1. AOF持久化(Append of file)2.1.1 fsync 系统调用2.1.2 AOF持久化策略2.1.3 aof_rewrite2.2...
    99+
    2022-11-28
    Redis持久化策略 RedisAOF RedisRDB
  • Java中Redis回收算法LRU的示例分析
    这篇文章给大家分享的是有关Java中Redis回收算法LRU的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何通俗易懂的理解LRU算法?1.LRU是什么?LRU全称Least Recently Used...
    99+
    2023-06-20
  • Android中pendingIntent与Intent的深入分析
    Android中pendingIntent的深入分析 pendingIntent字面意义:等待的,未决定的Intent。 要得到一个pendingIntent对象,使用方法类...
    99+
    2022-06-06
    Android
  • C#中async和await的深入分析
    目录大概理解深入分析await和Wait()的区别去掉Task.Run的Wait小结其他.Await();总结大概理解 查了一个小时的资料:async和await 发现这个大神的解释...
    99+
    2022-11-13
    c# async和await c#异步编程
  • 深入解析Redis中常见的应用场景
    前言 Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景。下面话不多说了,来一起看看详细的介...
    99+
    2022-06-04
    场景 常见 Redis
  • 深入解析Go语言的运算符用法
    Go语言中运算符的高级用法解析Go语言作为一门现代化的编程语言,提供了丰富的运算符供开发者使用。除了常规的算术运算符和逻辑运算符外,Go语言还提供了一些高级的运算符,可以帮助开发者更加高效地进行编程。本文将对...
    99+
    2024-01-18
    - 解析 - 高级用法
  • 分析Redis中的字典、哈希算法和ReHash原理
    本篇内容介绍了“分析Redis中的字典、哈希算法和ReHash原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • 深入分析安卓(Android)中的注解
    归纳而言,Android中的注解大概有以下好处       1、提高我们的开发效率    &n...
    99+
    2022-06-06
    注解 Android
  • Golang中的错误处理深入分析
    目录一、Go的内建类型error二、怎么判断一个错误值具体代表那一类错误知道错误类型的所属范围知道错误变量是哪几个值三、错误值体系的两种方法立体的-错误类型体系扁平的-错误值列表一、...
    99+
    2023-01-09
    Go错误处理 GoLang错误处理
  • 深入浅析JVM中的参数分配
    深入浅析JVM中的参数分配?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、堆参数设置-XX:+PrintGC 使用这个参数,虚拟机启动后,只要遇到GC就会打印日志-XX:...
    99+
    2023-05-31
    jvm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作