radis简单理解

radis简单理解radis简单理解

大家好,又见面了,我是你们的朋友全栈君。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)

 通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)  

1redis只是缓存,不是数据库如mysql,所以redis中有的数据库,mysql中一定有。

2用户请求先去请求redis,如果没有,再去数据库中去读取。

3redis中缓存一些请求量比较大的数据(这些缓存数据,mysql中一定也是有的),没必要所有数据都缓存到redis中。

5之所以从缓存中拿数据会快,是因为缓存的数据存在于内存中,不像mysql的数据是存在磁盘上的,即不用经过从磁盘加载到内存这个过程(这个过程是非常耗时和低效的),直接从内存获取数据。

6当redis缓存崩溃的时候,那么不是海量的请求都去访问数据库了?数据库能抗住吗?

1)收下要分析,当成千亿个请求同时访问过来,数据库为什么会扛不住?

①超大量的并发,数据库扛不住。

举个例子就明白了。

10000万个plsql客户端,同时访问Oracle进行数据库查询、写入等操作,数据库肯定吃不消。

参考:http://blog.csdn.net/ideality_hunter/article/details/77621802

从这个角度来说,redis并不能帮什么忙。

②数据库存在低速设备上,每次访问数据库,都要经过io,即从磁盘调入内存的过程。这个才是使用redis等缓存机制的原因。

2)当redis奔溃了,成千亿个请求同时访问过来,数据库扛不住,该怎么办?

=====解答某些同学的提问,核心是,redis中存的数据,数据库中是否还要存的问题。

我的观点:

1前提:mysql中存all即所有的数据(redis只是缓存的mysql中的部分数据),redis中缓存mysql中存在的访问量超级大的数据。

2如果redis中没有我要的数据,那么其实这些请求并发量没有那么大(为什么?参看上面的前提),那么就去mysql访问,肯定并没有太大压力。

反方观点1:既然redis中存了,数据库为什么还要存呢?所以他们认为数据存入redis就不用存数据库了。

反方观点2:如果redis崩溃了,缓存丢失了,不是所有的请求都压到mysql了?mysql数据是存在硬盘上的,读取是低速的,mysql肯定扛不住。

我的解答:

解答反方观点1:这个不用争,redis是当缓存用的,不是当数据库用的。

解答反方观点2:我承认mysql这种情况下肯定扛不住,但是你全把数据放入redis风险不就更大了吗?因为我虽然慢,但是最起码没有丢失,但是你redis是放入内存的,所有数据都丢失了?

反方观点3:我的redis数据并没有丢啊,redis有灾备机制,因为redis会将其中的数据实时地存入磁盘,这样就不怕丢了。

解答反方观点3:那这不是回到我的思路上了吗?你存磁盘其实跟存数据库不是一个道理吗?方正都是存磁盘?你怎么能将99G或者更大的数据快速的从磁盘加载到redis即内存中呢?不可能的。

所以,咱们两种方式其实都是一样的,都解决不了,如果redis即内存崩溃了,然后重启redis之后,怎么快速的响应千万甚至过亿的请求。

我的方式:redis坏了,从数据库读取。

你的方式:redis坏了,从磁盘慢慢地恢复到redis,然后从redis读取。

反方观点5:如果redis崩溃了,我不光可以放入磁盘一种方式,我还可以放入所在集群中的其他机器如B的内存中啊,这样如果机器A的redis崩溃了,只需要去访问机器B的内存中去取所需要的内容即可。

解答反方观点5:①这种方式我没研究过,集群,竟然内存也是共享的?②就算你说的是对的,我的那种方式,也完全可以融入你的机制,如果redis崩溃了,也将数据转移到集群中的B的内存中。这样的话,咱俩的方式其实就一样了。

反方观点6:你如果也采取我的那种方式,将数据转移到集群中的其他机器的内存中,那么为什么还要再存入mysql中一份呢,完全没有必要,因为对于这部分数据,根本不会去mysql中去读取的,一直是在redis中读取就行了。

解答反方观点6:你是对的,我无言以对。但是我质疑你说的将数据转移到集群中其他机器上这种方式的可行性。

我对反方观点5的质疑:照你你这种机制,其实就可以不用硬盘了,你用内存就行了,你可以把所有的数据都存入redis了,还将用户等信息放入mysql中干什么?

反方解答我的质疑:mysql中存的是不经常访问的事情。

总结:

的确, 如果可以实现A机器崩溃时可以将redis中的数据转移到集群中机器B的内存中(我对这种方式的可行性是质疑的),那么,数据存入redis就可以不用存入mysql,但是这就颠覆了我及常人对缓存的理解,这其实就不是什么缓存,而是直接将redis当数据库来用了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106205.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 零拷贝技术_基因单拷贝

    零拷贝技术_基因单拷贝零拷贝技术概述零拷贝技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及CPU的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU的负载。实现零拷贝用到的主要技术是DMA数据传输技术和内存区域映射技术零拷贝机制可以减少数据在内核缓冲区和用户进程缓冲区之间反复的I/O拷贝操作零拷贝机制可以减少用户进程地址空间之间因为上下文切换而带来的CPU开销物理内存和虚拟

  • 杂记-匆匆北京行

    杂记-匆匆北京行

  • onResume的作用

    onResume的作用描述:今天在做一个功能的时候,从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,需要A能够进行刷新操作。但是默认跳回去的时候,A界面还是上次那个。解决方案:重写Aactivity的onResume()方法,在onResume()方面里进行刷新操作。因为按照activity的生命周期模型,当activ

  • ajax如何解决跨域_除了jsonp还有什么跨域方式

    ajax如何解决跨域_除了jsonp还有什么跨域方式$.ajax({url:url,//路径async:false,//同步type:”get”,//请求方式dataType:”jsonp”,//跨域jsonp:”callback”,//回调函数的参数名data:data,cache:false,/*发送前执行方法*/beforeSend:function(){},/*成功…

  • idea配置svn仓库

    idea配置svn仓库IntelliJIDEA使用教程(总目录篇)首先,使用的时候,自己得先在电脑上安装个小乌龟。也就是svn啦。第一步安装小乌龟。如下:具体安装好像没什么具体要求,一路next,就好。如上图箭头所示,在安装TortoiseSVN的时候,默认commandlineclienttools,是不安装的,这里建议勾选上。这个我不确定我当时选没选,不过呢,你给安装上,也是没问题的。把上面的勾选取…

  • 嵌入式软件工程师待遇怎么样

    嵌入式软件工程师待遇怎么样本来大家选择嵌入式也就是冲着嵌入式的发展前景不错而来,所以在嵌入式这块还是有很多不知道的知识,这些也都要等着老师去给你讲解了,下面先来了解下嵌入式软件工程师待遇怎么样吧。嵌入式软件工程师待遇怎么样:1、应届毕业生如果你是在一线城市的话,有人带你,你自己有比较学的好,那么你的薪资待遇就可以达到6k+,但是不同公司不同待遇,而且不同地区不同的薪资待遇,就像北上广,这些地区薪资待遇是比其他地区高出2k以上,甚至更高的。就像人家阿里,那工资肯定就比其他公司要高的多。所以得看你要去什么地方发展了,但是平均

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号