使用redis作为缓存,数据还需要存入数据库中吗?(转)

转自https://blog.csdn.net/wypersist/article/details/79955704

使用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当数据库来用了。

竟然还真有这种方式:

https://www.zhihu.com/question/21419897

转载博文:https://blog.csdn.net/Ideality_hunter/article/details/77621643

原文地址:https://www.cnblogs.com/ffaiss/p/10981949.html

时间: 2024-08-29 10:46:02

使用redis作为缓存,数据还需要存入数据库中吗?(转)的相关文章

python 读取SQLServer数据插入到MongoDB数据库中

# -*- coding: utf-8 -*-import pyodbcimport osimport csvimport pymongofrom pymongo import ASCENDING, DESCENDINGfrom pymongo import MongoClientimport binascii '''连接mongoDB数据库'''client = MongoClient('10.20.4.79', 27017)#client = MongoClient('10.20.66.10

将 text 文件里的数据导入到 mysql 数据库中

如题,将 text 文件里的数据导入到 mysql 数据库中. 我自己具体的实现可以分为几种了: 1.写你擅长的程序设计语言 进行读写文件,然后连接数据库,进行写入: 2.在 mysql 里直接进行运行 sql 脚本语句,进行导入. 第一个现在就不再说了,简单. 现在就说说怎么直接将 .text 文件利用 sql 语句 进行导入. 1.首先在数据库中新建一个表(这里的表至少要和 你数据里的字段进行匹配,即一行存在的字段数): 2.运行sql脚本语句: 比如: 你的文件为 D:/field.txt

python爬取数据并保存到数据库中(第一次练手完整代码)

1.首先,下载需要的模块requests, BeautifulSoup, datetime, pymysql(注意,因为我用的python3.7,不支持mysqldb了),具体的下载方法有pip下载,或者使用Anaconda版本python的童鞋可以使用conda下载. 2.创建conndb,py,包含数据库的连接断开,增删改查等操作: #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql def conn_db(): # 连接数

mapreduce实现从hbase中统计数据,结果存入mysql中

最近开始学习使用mapreduce统计hbase中的数据,并将结果集存入mysql中,供前台查询使用. 使用hadoop版本为2.5.1,hbase版本为0.98.6.1 mapreduce程序分为三个部分:job.map函数.reduce函数 job类: 1 public class DayFaultStatisticsJob { 2 private static final Logger logger = LoggerFactory.getLogger(DayFaultStatisticsJ

用纯ASP代码实现图片上传并存入数据库中

用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中 关于如何上传文件到服务器恐怕是遇见最多的问题了,尤其是上传图片,比如 你想要在自己的社区里面实现类似网易虚拟社区提供的"每日一星"的功能, 就要提供给网友上传照片的功能.上传图片文件到服务器可以使用各种免费的 文件上传组件,使用起来功能虽然很强大,但是由于很多情况下,我们只能使 用免费的支持ASP的空间或者租用别人的虚拟空间,对于第一种情况,我们 根本就没有可能来使用文件上传组件:至于第二种情况,我们也要付出不少的 &q

用纯ASP代码实现图片上传并存入数据库中

用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中关于如何上传文件到服务器恐怕是遇见最多的问题了,尤其是上传图片,比如你想要在自己的社区里面实现类似网易虚拟社区提供的“每日一星”的功能,就要提供给网友上传照片的功能.上传图片文件到服务器可以使用各种免费的文件上传组件,使用起来功能虽然很强大,但是由于很多情况下,我们只能使用免费的支持ASP的空间或者租用别人的虚拟空间,对于第一种情况,我们根本就没有可能来使用文件上传组件:至于第二种情况,我们也要付出不少的“银子”才可以.除非你拥有自

EXCEL表数据导入到ORACLE数据库中

将EXCEL表导入ORACLE数据库中 一.建立表 1.建立表 2.查询表 select * from yy; 二.导入程序 在excel中找到需要导入的数据 2.将excel中的数据另存为文本文件(有制表符分割的) 3.在pl*sql中选择tools-->text importer,在出现的窗口中选择"Data from Textfile",然后再选择"Open data file", 在弹出的文件选择框中选中保存有数据的文本文件,此时将会看到data fr

Excel表数据导入Sql Server数据库中

Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型(注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET( 'Microsoft.Jet.OLEDB.4.0 ', 'Excel  5.0;DatabASE=[Excel表

关于mysql转移数据库时没有导出sql脚本的情况下,如何导入数据到新的数据库中

因为某些原因,在转移数据库的数据时,没有导出sql脚本,然后就被坑的不要不要的.不过,忙活了一下午,终于找到一种办法将数据库的文件夹直接导入到新的mysql的文件文件夹下的data文件中,就可以直接使用了. 具体步骤,往下看 在操作之前先要停止mysql的服务(net stop mysql),所有操作完成后,再启动mysql服务(net start mysql) (1)在mysql的安装文件中找到data文件夹 (2)将你原先data下的某个数据库中的文件夹拷到新的mysql的安装文件中的dat