stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制

Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢?

Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢?

本篇文章将介绍一下Redis的过期策略和内存淘汰机制。

1、redis的过期策略

1.定时删除

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时对key进行删除。优点:
保证内存被尽快释放。缺点:
1)若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。
2)定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重。

2.惰性删除

key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。优点:
删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步。缺点:
若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)。

3.定期删除

如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历,随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key,判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。(默认每个库检测20个key)。优点:
1)通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点。
2)定期删除过期key--处理"惰性删除"的缺点。缺点:
1)在内存友好方面,不如"定时删除"。
2)在CPU时间友好方面,不如"惰性删除"。

Redis采用的策略:定期删除+惰性删除

2、内存淘汰机制

Redis有过期策略,假如你的Redis只能存1G的数据,你一个请求写入2G,而你也没有及时请求key,那么惰性删除就不生效了,Redis占用内存就会越来越高。

Redis可以设置内存大小:

# maxmemory 
# 设置Redis最大占用内存大小为100
maxmemory 100mb

超过了这个内存大小,就会触发内存淘汰机制

Redis有一个默认  内存淘汰机制

# maxmemory-policy noeviction

maxmemory-policy一共有8个值,当内存不足时:

1)noeviction:不删除,直接返回报错信息。
2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。推荐使用这种。
3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。
4)allkeys-random:随机移除某个key。
5)volatile-random:在设置了过期时间的key中,随机移除某个key。
6)volatile-ttl:在设置了过期时间的key中,移除准备过期的key。
7)allkeys-lfu:移除最近最少使用的key。
8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。

LRU和LFU的区别:

LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!

比如有数据 1,1,1,2,2,3
此时缓存中已有(1,2)
当3加入的时候,得把前面的1淘汰,变成(3,2)

LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!

比如有数据 1,1,1,2,2,3
缓存中有(1(3次),2(2次))
当3加入的时候,得把后面的2淘汰,变成(1(3次),3(1次))

引申:

假如我的key没有设置expire,即没有设置过期时间。那么 volatile-lru、volatile-random、volatile-ttl  就无法执行了,和 noeviction 就一样了。

--end--

4d8a0bfecaa1aa29c5435833d5cc0b2f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之怎么使vim永久显示行号

1、进入当前用户目录 2、输入下面命令 vim ~/.vimrc 3、退出保存 :x 4、用vim打开文件验证

java.util.ConcurrentModificationException异常

2019独角兽企业重金招聘Python工程师标准>>> <p> 今天遇到了一个小bug&#xff0c;在对ArrayList操作时出现了java.util.ConcurrentModificationException异常。原来是arrary在遍历时&#xff0c;是不能删除其中的对象的。 for(MediaFeedData item : Item…

eclipse中git插件配置 编辑

一、Eclipse上安装GIT插件EGit EGit插件地址&#xff1a;http://download.eclipse.org/egit/updates OK&#xff0c;随后连续下一步默认安装就可以&#xff0c;安装后进行重启Eclipse 二、在Eclipse中配置EGit 准备工作&#xff1a;需要在https://github.com 上注册账号 Prefer…

使用 C# 开发 Kubernetes 组件,获取集群资源信息

写什么呢前段时间使用 C# 写了个项目&#xff0c;使用 Kubernetes API Server&#xff0c;获取信息以及监控 Kubernetes 资源&#xff0c;然后结合 Neting 做 API 网关。体验地址 http://neting.whuanle.cn:30080/账号 admin&#xff0c;密码 admin123本篇文章主要介绍&#xf…

whitelabel error page什么意思_什么是RESTful API?总算能说清楚了

要弄清楚什么是RESTful API,首先要弄清楚什么是REST。REST -- REpresentational State Transfer&#xff0c;英语的直译就是“表现层状态转移”。如果看这个概念&#xff0c;估计没几个人能明白是什么意思。那下面就让我来用一句人话解释一下什么是RESTful:URL定位资源&#xf…

【转】Asp.net控件开发学习笔记整理篇 - 数据回传

最近一直在做MVC项目&#xff0c;对于WEBFORM 好像快忘记了。周末无聊&#xff0c;顺带看看他人的笔记。再次温习下。 复习大纲&#xff1a; 导航、页面生命周期及其它导论 一、服务器控件生命周期 二、控件开发基础 三、Asp.net服务端状态管理 四、Asp.net客户端状态管理 五、…

BZOJ2326 [HNOI2011]数学作业

首先&#xff0c;列方程 我们定义s[i] 10 ^ ((int) log(i)) 于是&#xff0c;f[i] (f[i - 1] * s[i] i) % p 反正总之就是个沙茶递推 然后我们来看优化。。。怎么感觉像矩阵乘法呢&#xff1f; 发现要按照log(i)即i的位数分类讨论&#xff0c;在相同位数的时候令矩阵为 s[i]…

简直不敢相信!这个史上最被低估的学科,看完竟瑟瑟发抖!

▲ 点击查看历史&#xff0c;无疑是大众参与度较高的知识性学科之一&#xff0c;既没有艰深的原理和公式&#xff0c;也不需要较高的欣赏能力。不仅门槛低&#xff0c;而且具有故事性&#xff0c;容易形成话题&#xff0c;茶余饭后&#xff0c;几乎每个人、每个孩子都能谈论几句…

一款强大的Kubernetes API流量查看神器

点击上方蓝字关注 &#x1f446;&#x1f446;大家好&#xff0c;我是小碗汤&#xff0c;今天分享一个k8s流量查看器~mizu。mizu 是为 Kubernetes 提供的一个简单而强大的 API 流量查看器&#xff0c;可以查看微服务之间的所有 API 通信&#xff0c;以帮助调试和排除故障。相当…

辉光UIView的category

辉光UIView的category 本人视频教程系类 iOS中CALayer的使用 效果如下&#xff1a; 源码&#xff1a; UIViewGlowView.h 与 UIViewGlowView.m // // UIViewGlowView.h // YouXianClock // // Created by YouXianMing on 14-12-21. // Copyright (c) 2014年 YouXianMing. …

javascript 动态创建表格

<html><head><script>function createTable(rows,lines){this.rowsrows;this.lineslines;var Bodydocument.getElementById(body);var Tabledocument.createElement(table);//创建table标签元素Table.setAttribute(border,1);//给table标签添加其他属性for(v…

linux c之加入了加入原文件 math.h调用abs()函数出现implicit declaration of function错误

今天在vim 写C语言的时候 代码我已经导入了#include<math.h> 但是当我调用ads()函数的时候出现了下面错误 解决办法&#xff1a; 把abs函数改写成fabs函数就行&#xff0c;然后去网上找原因&#xff0c;发现fabs是求浮点数的&#xff0c;ads求整形的&#xff0c;以后在…

你的女神今日结婚了!!!你失恋了......

1 新垣结衣结了婚▼2 我和朋友最近的聊天内容&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 白粥盖浇饭&#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 中国人的辈分可以复杂到什么程度&#xff1f;&#xff08…

我的技术回顾那些与ABP框架有关的故事-2017年

推荐阅读&#xff1a;我的技术回顾那些与ABP框架有关的故事-2015年从ABP框架国内社区发展回顾.NET技术变迁-2016年从2022年来回顾ABP框架&#xff0c;我们会发现无论是商业模式还是架构设计思路&#xff0c;如果没有良好的商业模式的话&#xff0c;ABP框架很容易进入难产的状态…

Camera360与全球1.8亿用户共同创造更美的照片

Camera360是成都品果科技有限公司推出的基于IOS、Windows Phone和安卓系统的功能强大的手机摄影软件。能拍摄出不同风格&#xff0c;不同特效的照片&#xff0c;同时具有互联网分享功能。Camera360在全球拥有1.8亿用户&#xff0c;国外0.95亿&#xff0c;国内0.85亿&#xff0c…

八皇后问题(一)

问题描述: 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。如下图即是两种方案: 思路: 比如我们搞个数组,数组的下表表示多少行,然后数值表示多少列,比如a[4] = 5,意思就代表第四行,第五列 首先…

linux shell 嵌套expect 与服务器交互脚本

2019独角兽企业重金招聘Python工程师标准>>> 我们与服务器进行交互是该用expect 脚本的&#xff0c;用 “/usr/bin/expect <<-EOF” 来开启expect 脚本 用spawn 来开启一个新的进程 expect 来接受命令&#xff0c;send来发送交互命令 结束用 EOF来over expect…

SkyWalking集成与案例

今天我们通过代码的形式来了解下&#xff0c;如何在项目中使用Skywalking。前几篇文章可以参考&#xff1a;《学习Skywalking 搭建篇》《Skywalking执行效果 多图篇》《Skywalking的ES索引 收藏篇》今天说说代码篇。先说下比较常见的开源 APM 如下&#xff1a;CAT&#xff1…