Redis5.0之后的内存策略

Stella981
• 阅读 488

前言:这八种算法是基于redis5.0版之后的,他新增了新增allkeys-lfu,volatile-lfu这两种算法,也就是多了LFU算法,而LFU与LRU算法不同在于;LRU是淘汰最近最长时间未使用的页面进行淘汰,而LFU是要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。


1. Redis内存策略

1.1 内存使用情况说明

Redis将数据都保存到内存中,如果一直往内存中存储数据,而不维护.将来可能导致内存数据存不下.内存溢出.

  • 1.主动淘汰
            在redis赋值操作执行时,可以添加超时时间.当时间一到则数据自动删除.

  • 2.采用算法进行淘汰

1.2 Redis中内存优化算法

1.2.1LRU算法

     LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

以时间T为维度,删除不使用的数据,实现内存的清空。

1.2.2LFU算法

     LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。

1.2.3具体八种算法

  • 1.volatile-lru 设定了超时时间数据,之后采用LRU算法进行删除.

  • 2.allkeys-lru 全部数据,采用LRU算法进行内存数据的优化.

  • 3.volatile-lfu 设定了超时时间的数据,采用LFU算法进行删除

  • 4.allkeys-lfu 所有的数据采用LFU算法实现数据删除.

  • 5.volatile-random 为设定超时时间的数据采用随机算法.

  • 6.allkeys-random 所有数据采用随机算法实现删除.

  • 7.volatile-ttl 将所有设定了超时时间的数据,利用ttl方式进行排序,将还没有超时的数据提前删除.

  • 8.noeviction (默认策略)不采用任何的算法删除数据.如果将来内存溢出则报错返回.

Redis5.0之后的内存策略

1.2.4修改redis内存策略

设定redis中的内存优化策略.

597 maxmemory-policy volatile-lru

608 maxmemory-samples 5         lru算法取值个数

问题:如果redis中有100万的数据,都要采用LRU算法进行优化,则计算100万数据的时间性能太低了.

优化:随机筛选5个数据. 在5个数据中执行lru算法.优化1个数据.

一般默认值为5,表示性能最优.筛选的个数可以调整 最大不要超过10.

据官方的统计,如果筛选的个数为10 ,则接近真实的LRU算法.但是会增加内存的开销.

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
九路 九路
3年前
6 手写Java LinkedHashMap 核心源码
概述LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(LeastRecentlyUsed)算法,即最近最少使用算法,核心思想就是当缓存满时,会优先淘汰那些近期最少使用的缓存对象LruCache的缓存算法LruCache采用的缓存算法为LRU(LeastRe
小恐龙 小恐龙
3年前
LRU算法四种实现方式介绍
LRU全称是Least RecentlyUsed,即最近最久未使用的意思。LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这