从入门到精通!java可视化编程软件哪个好
1、我往Redis里写的数据怎么没了?
使用Redis的同学你要明白一点,你为什么用Redis?用redis的作用是什么?用redis的好处是什么?凡事多思考一下为什么,多想想背后的原因。
就在不久前有朋友跟我说过,说他们生产环境的Redis怎么经常会丢掉一些数据?写进去了,过一会儿可能就没了。我的天啊,你问这个问题就说明Redis你就没用对啊。Redis是缓存,你给当存储了用了是吧?
首先要明白一点啥叫缓存?为啥用缓存?
Redis是用内存当缓存的。内存是无限的吗?相反,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个G的内存,但是可以有几个T的硬盘空间。Redis主要是基于内存来进行高性能、高并发的读写操作的。
那既然内存是有限的,比如Redis就只能用10个G,你一直往里面写数据,一直写一直写最后10个G都用的差不多了,你还写会,你想想会发生什么?当然会干掉一些的数据了,然后就保留10个G的数据。你说会不会造成数据丢失?
那Redis会干掉哪些数据?保留哪些数据呢?当然是干掉不常用的数据,保留常用的数据了。
所以说,这是缓存的一个最基本的概念:数据是会过期的。要么是你自己设置个过期时间,要么是Redis自己给干掉。
所以你的Redis如果使用不当,把生产数据存到里面,又没有去持久化到mysql,那就会有丢失的可能。
2、我的数据明明都过期了,怎么还占用着内存啊?
还有一种就是如果你给key设置好了一个过期时间,你知道到一定的时间再去查这个key就没有了,但是你知道redis是怎么给你弄成过期的吗?什么时候删除掉?
如果你不知道,在实际的使用过程中你就可能会发现这么一个问题:为啥好多数据明明应该过期了,结果发现redis内存占用还是很高?那是因为你不知道Redis是怎么删除那些过期key的。
举例,Redis 内存一共是10个G,你现在往里面写了5个G的数据,然后你对这些数据全都设置了10分钟之后过期,结果10分钟之后,你再来查看看,Redis的内存使用率怎么还是50%呢?5个G的数据都过期了,我从redis里查,是查不到了,结果过期的数据为啥还占用着Redis的内存呢。
如果你连这个问题都不知道,上来就懵了,回答不出来,建议你使用Redis之前多做做功课,不然你写代码的时候,想当然的认为写进Redis的数据就一定会存在,后面导致系统各种漏洞和bug,就不好弄了。
3、问题剖析
(1)设置过期时间
set key value 过期时间(1小时)
表示set进去的key,1小时之后就没了,就失效了。
我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效。
如果假设你设置一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?
答案是:定期删除+惰性删除
所谓定期删除,指的是Redis默认是每隔100ms就随机抽取
一些设置了过期时间的key,检查其是否过期,如果过期就删除。
为什么是随机抽取?
假设Redis里放了10万个key,都设置了过期时间,你每隔几百毫秒,就检查10万个key,那redis基本上就死了,因为这样cpu负载会很高的,全都消耗在你的检查过期key上了。
所以这里可不是每隔100ms就遍历所有的设置过期时间的key,Redis如果设置成检查所有Key那将是一场性能上的灾难。所以实际上redis是每隔100ms随机抽取
一些key来检查和删除的。
但是问题是,随机抽取检测key是否过去会导致定期删除
策略可能会导致很多过期key到了时间并没有被删除掉,那咋整呢?所以Redis还有另一个策略就是惰性删除
。
惰性删除 就是说,在你获取某个key的时候,Redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
所以并不是key到时间就被删除掉,而是你查询这个key的时候,Redis再懒惰的检查一下。
通过上述两种手段,保证过期的key一定会被干掉。
那么刚才的问题就不难理解了,就是说,你的过期key,靠定期删除没有被删除掉,还停留在内存里,占用着你的内存呢,除非你的系统去查一下那个key,才会被redis给删除掉。如果都过期了,定期删除才删了一点点,而你又没有去查,没有触发惰性删除,那么短时间内你的redis内存占用率还是会下不来。
但是实际上这还是有问题的,如果定期删除漏掉了很多过期key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了,咋整?
别担心Redis还有方案:内存淘汰机制。
(2)内存淘汰策略
如果Redis的内存占用过多的时候,此时会进行内存淘汰,Redis提供如下丰富的可选策略:
1)noeviction:
当内存不足以容纳新写入数据时,新写入操作会报错。
(这个一般没人用吧,实在是太恶心了)
2)allkeys-lru:
当内存不足以容纳新写入数据时,在所有键空间中,移除最近最少使用的key
(这个是最常用的)
3)allkeys-random:
当内存不足以容纳新写入数据时,在所有键空间中,随机移除某个key。
(这个一般没人用吧,为啥要随机,把我重要的key干掉了咋整,肯定是把最近最少使用的干掉)
4)volatile-lru:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
(这个一般不太合适)
5)volatile-random:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6)volatile-ttl:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
例如:Redis 里有10个key,现在内存已经满了,设置的淘汰策略是allkeys-lru
,此时Redis需要删除掉一些key来保证你可以继续写入。在这10个key中,其中1个key,最近1分钟被查询了100次,1个key,最近10分钟被查询了50次,1个key,最近1个小时被查询了1次。肯定那些最近最少使用的被干掉了。
为啥存redis的数据有时候会丢失?
很简单,你写的数据太多了,内存占满了,或者触发了什么条件,如redis使用了allkeys-lru内存淘汰策略,自动给你清理掉了一些最近很少使用的数据。
如何获取免费架构学习资料?
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以戳这里即可免费获取哦
识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以戳这里即可免费获取哦
从入门到精通!java可视化编程软件哪个好相关推荐
- 视频教程-Spring Cloud微服务--入门到精通-Java
Spring Cloud微服务--入门到精通 本系列课程由多位老师共同录制而成,旨在为想要学习Java的用户提供一套系统的成长方案. Java从入门到进阶 ¥59.00 立即订阅 扫码下载「CSDN程 ...
- 视频教程-springboot从入门到精通-Java
springboot从入门到精通 本人具有7年java开发经验,两年java教学经验,擅长java开发相关技术,能够熟掌握并应用目前主流web开发技术,如SSH,SSM等,数据库开发技术oracle, ...
- 视频教程-Spring框架快速入门到精通-Java
Spring框架快速入门到精通 十年项目开发经验,主要从事java相关的开发,熟悉各种mvc开发框架. 王振伟 ¥18.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 ...
- 视频教程-mybatis快速入门到精通-Java
mybatis快速入门到精通 十年项目开发经验,主要从事java相关的开发,熟悉各种mvc开发框架. 王振伟 ¥18.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 A ...
- Excel数据分析从入门到精通(一)软件操作技巧
Excel数据分析从入门到精通(一)软件操作技巧 1.单元格内换行 2.锁定标题行 3.查找重复值 4.删除重复值 5.将金额转换为万元显示 6.隐藏0值 7.隐藏单元格内所有的值 8.在单元格内输入 ...
- Excel数据分析从入门到精通(二)软件操作快捷键
Excel数据分析从入门到精通(二)软件操作快捷键 1.智能拆分--Ctrl+E 2.自动生成下拉列表--Alt+↓ 3.插入批注--shift+F2 4.快速查找--Ctrl+F 5.快速定位--C ...
- Hadoop 从入门到精通----leo学习编程不良人视频的笔记--part01
编程不良人原版笔记 - https://blog.csdn.net/wei198621/article/details/111280555 part 01 hadoop 集群的搭建 – https:/ ...
- Java低级编程软件_JAVA语言说低级语言吗
高级语言:C.C++.Java.Python.Pascal.Lisp.Prolog.FoxPro.易语言等都是高级语言,相对于低级语言来说,高级语言采用易于识别和记忆的字符来作为关键字,也更接近人类的 ...
- python web 开发从入门到精通 pdf,Python编程从入门到精通 PDF包下载
Python开发学习合集 用Python做科学计算pdf 像计算机科学家一样思考python.pdf 利用python进行数据分析.pdf Python科学计算-张若愚.pdf Python标准库Do ...
最新文章
- java手机端播放.swf_Android使用WebView播放flash的方法
- 查询数据(使用聚合函数,还是单表)
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
- JavaScript实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
- PTA L2-001 紧急救援 (点带权最短路)
- 0基础怎么学python10010基础怎么学python_0基础学python全套python教程
- pose estimation papers and datasets
- 前端学习(2957):组件之间的参数传递父传子
- 力扣501. 二叉搜索树中的众数(JavaScript)
- 杭电2112HDU Today(map 最短路径)
- 配置codeblocks 的养眼colour theme ;鼠标颜色与型状配置,界面汉化,以及调试入门
- Frp后台自动启动的几个方法-内网穿透
- 谷歌Chrome繁体字乱码问题
- 微pe添加网络组件_(已解决)干掉peset后如何启动PE的网络组件?
- linux 没有network服务,求助,network起不来
- php 获取当前域名大胡子,养黄金大胡子的小经验
- 交叉碳市场和 Web3 以实现再生变革
- HTTP中的常用方法
- 4g模块与51单片机通信
- ZYNQ7000学习(十八)多路 PWM 原理分析以及实现试验
热门文章
- 恋爱Linux(Fedora20)2——安装Java运行环境(JDK)
- DM9000调试记录
- linux中下载的服务压缩包存放在,linux 下tomcat6 配置为服务
- 两个数相乘积一定比每个因数都大_小升初数学知识点大全含公式+20类必考应用题(含答案解析),孩子考试一定用得上!...
- c语言self用法,C/C++知识点之Self Numbers C语言 UVA640
- php解密 码表,php拼音码表的生成
- 160 - 45 Dope2112.2
- Mysql的undo、redo、bin log分析
- AMUL的完整形式是什么?
- scala 随机生成整数_如何在Scala中以整数形式获取当前年份?