Redis-内存淘汰算法

这篇具有很好参考价值的文章主要介绍了Redis-内存淘汰算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis可以存多少数据

32位的操作系统默认3G

谁现在用32位啊?我们说64位的 一般来讲是不设上限的

但是我们也可以主动配置maxmemory, maxmemory支持各单位:
maxmemory 1024 (默认字节)
maxmemory 1024KB
maxmemory 1024MB
maxmemory 1204GB
当Redis存储超过这个配置值,则触发Redis内存淘汰。

实际上,每次进行读写的时候,都会去检查是否需要释放内存,如果需要则会触发。
 

那怎么淘汰呢

分两大类

第一类

noeviction,默认就是这种策略,此时如果内存达到maxmemory, 则写入操作会失败,但
不会淘汰已有数据。

第二类

多种淘汰策略,主要支持LRU, LFU, RANDOM, TTL这几个方式:
lru:根据LRU (Least recently used, 最近最少使用)算法尝试回收最长时间未使用的。              

Ifu:根据LFU (Least Frequently Use) 驱逐最不常用的键,Ifu是在4.0引入的

random: 回收随机的键使得新添加的数据有空间存放。

ttl:回收在过期集合的键,并且优先回收存活时间(TTL) 较短的键,使得新添加的数据有空间存放。

这四种策略,可以选择时volatile, 也就是设置了过期时间的Key,或者是alkeys,即全部的Key,所以一共有8种淘汰方式。

LRU算法


最近最久未使用,即记录每个Key的最近访问时间,维护一一个访问时间的数据

如果为所有数据维护一个顺序列表,实际就是做一个双向链表,但是如果Redis数据稍微多些,这个链表就是巨大的成本,对于Redis而言,内存是最宝贵的,所以Redis选择了近似LRU算法。

近似的LRU算法

在LRU模式,redisObject对象 中Iru字段存储的是key被访问时Redis的时钟server.lruclock,当key被访问的时候,
Redis会更新这个key的redisObject的Iru字段。注意,Redis为了保证核心单线程服务性能,缓存了Unix操作系统时钟,默认每100毫秒更新一次,缓存的值是Unix时间戳取模2^24
近似LRU算法在现有数据结构的基础上采用随机采样的方式来淘汰元素,当内存不足时,就执行一次近似LRU算法。
具体步骤是随机采样n个key,这个采样个数默认为5,然后根据时间戳淘汰掉最旧的那个key,如果淘汰后内存还是不足,就继续随机采样来淘汰。

采样范围

采样范围是什么呢? Redis可以选择范围策略,有两种: 1.alkeys, 所有key中随机采样。2.volatile从有过期时间的key随机采样。分别对应alkeys-lru, volatitle-lru。

优化-淘汰池

Redis3.0对近似LRU算法进行了一些优化。
新算法会维护一个大小为16的候选池,池中的数据根据访问时间进行排序。第-次随机选取的key都会放入池中,
然后淘汰掉最久未访问的,比如第一次选了5个,淘汰了1个,剩下4个继续留在池子里。
随后每次随机选取的key只有活性比池子里活性最小的key还小时才会放入池中,当池子装满了,如果有新的key需要放入,则将池中活性最大的key移除。
 

有一个活性堆 最上面永远是活性最小的 如果比它还小才能加入堆 但是如果堆已经满了 那就要把最大的活性的弹出(既然我们要让结果贴合 淘汰最旧的 那就不会弹出活性最大的拉) 合理 里面只存最小活性的 然后每次要淘汰就淘汰活性最小的

原本的近似LRU算法 全局采样 然后从里面拿出一个活性最低的 来近似作为淘汰了全局活性最低的 这到底哪合理了

现在的算法比之前的贴近反正

LFU算法

LFU淘汰算法,即Least Frequently Used,最不频繁(断句)淘汰算法,顾名思义,优先淘汰活跃最低,使用频率最低的。
 

LRU是淘汰最久没使用的 我个人觉得LFU更合理 我肯定要淘汰最不常用的反正

如果使用LRU,那么redisObject中lru字段, 就是用来存储最近访问时间的,这个字段长度是LRU_ _BITS, 这个值一直都是24位。
如果是LFU,因为LRU、LFU是不会同时开启的,所以两者可以说是互斥,基于这个情况,加上节约内存的考虑,Redis在LFU策略下复用Iru字段,还是用它来表示LFU的信息,不过将24拆解,高16bit存储ldt(L ast DecrementTime),低8bit存储logc(Logistic Counter)
 

高的16位保存了.上次访问时间戳,因为少了8位,所以LFU下时间精度是1分钟,不然用秒的话2^16次方只能表示65536秒(因为这次的时间只是辅助作用喵),后8位存储的是一个访问计数。
一个Key是否活跃,就是这两个字段综合决定的。
如果上一次访问时间很久,那么访问计数就会衰减,当然,最后起作用的就是访问计数。

当某个KEY被访问到的时候  

第一步,计算次数衰减
因为无论是多快,相对于上次访问,-定有时间间隔,根据间隔,来计算你应该减少的次数。使用的函数就是LFUDecrAndReturn。
 

第二步,一定概率增加访问计数
次数不足5次,那一定会增加,如果大于5次小于255次,会一定概率加1,原来的次数越大,越困难。除了原来的次数影响之外,还有一个Ifu-log-factor参数可以被设置的。也就是说,可以通过lfu-log-factor参 数来调节难度,这个越大,难度也越大,如果为0,那么每次必然+1,很快就能255, 255就是最大值,默认是10,需要1M流量才能达到最大值。

第三步,更新
当前时间更新到高16位,次数更新到低8位。
 文章来源地址https://www.toymoban.com/news/detail-654449.html

到了这里,关于Redis-内存淘汰算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis实战-缓存数据&解决缓存与数据库数据一致性

    缓存( Cache),就是数据交换的 缓冲区 ,俗称的缓存就是 缓冲区内的数据 ,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪,这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存技术,

    2024年02月12日
    浏览(40)
  • Redis内存数据库

    Redis内存数据库 NoSQL数据库简介 Redis简介 Redis应用场景 windows下安装和使用Redis 在linux下安装redis Redis数据可视化RedisDesktopManager Redis配置 Redis 数据类型 Redis 字符串(String) Redis 哈希(Hash) Redis 列表(List) Redis 集合(Set) Redis 有序集合(sorted set) Redis key命令 Redis连接命令 Redis服务器命令

    2024年02月09日
    浏览(31)
  • redis数据库缓存服务器

    redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用:加快访问速度,缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作,要么全部执行,要么什么也没有做” 支持主从支持高可用,支持

    2024年02月05日
    浏览(44)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(39)
  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(53)
  • Redis---数据库和缓存如何保证一致性?

    用「读 + 写」请求的并发的场景来分析: 假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存

    2024年01月24日
    浏览(41)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(35)
  • 数据库缓存服务——NoSQL之Redis配置与优化

    目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非关系型数据库产生背景 2.5 总结

    2024年02月15日
    浏览(36)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道 Redis主从复制是指在Redis中设置一个主节点(Master)和一个或多个从节点(Slave),

    2024年02月15日
    浏览(35)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包