{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

redis是否可以代替mysql进行数据存储?怎么样?

AndrmanAndrman 回答0 收藏1
收藏问题

10条回答

hellowoody

hellowoody

回答于2022-06-28 15:04

Redis本身是支持数据持久化的,很多有些程序员都会觉得Redis应该可以替代MySQL,但是我们在使用一项技术的时候,不是看它能不能,而是要看它适合不适合;而在大部分场景下,Redis是无法替代MySQL的。

  • MySQL是关系型数据库,数据储存在磁盘上,数据的格式是我们熟知的二维表格的样式。关系型数据库具有很多强大的功能;大部分都支持SQL语句查询,对事务也有很好的支持。

  • Redis被称作非关系型数据库,属于内存数据库,数据都储存在内存中(Redis有RDB持久化策略),Redis支持的数据类型也比较多,比如字符串,HASH,List等。

  • MySQL和Redis没有竞争的关系,通常当并发访问量比较大的时候,特别是读操作很多,架构中可以引入Redis,帮助提升架构的整体性能,减少Mysql(或其他关系型数据库)的压力;

  • 不是MySQL or Redis;而是MySQL + Redis ;

因为Redis的性能十分优越,可以支持每秒十几万此的读/写操作,并且它还支持持久化、集群部署、分布式、主从同步等,Redis在高并发的场景下数据的安全和一致性,所以它经常用于这些场景:

  1. 经常要被查询,但是CUD操作频率低的数据;比如数据字典,确定了之后很少被修改,是可以放到缓存中的;还有热点数据,查询极为频繁的数据,放到Redis中可以减少MySQL的压力;

  2. 经常被查询,但是实时性要求不高数据,比如购物网站的热销排行榜,定时统计一次后把统计结果放到Redis中提供查询(请不要每次都使用select top 10 from xxxx)。

  3. 缓存还可以做数据共享(Session共享),在分布式的架构中,把用户的Session数据放到Redis中。

  4. 高并发场景下的计数器,比如秒杀,把商品库存数量放到Redis中(秒杀的场景会比较复杂,Redis只是其中之一,例如如果请求超过某个数量的时候,多余的请求就会被限流);

  5. 因为Redis对高并发的支持和单线程机智,它也经常用作分布式锁;

Redis虽然功能强大、性能高效,但是也不是万能的,项目在引入Redis的时候,需要考虑的问题也比较多,并且会带来额外的开发和运维的工作量。

  1. 首先要判断数据是否适合缓存到Redis中,可以从几个方面考虑:数据会被经常查询么?命中率如何?写操作多么?数据大小?数据一致性如何保证?

  2. 我们经常采用这样的方式将数据刷到Redis中:查询的请求过来,现在Redis中查询,如果查询不到,就查询数据库拿到数据,再放到缓存中,这样第二次相同的查询请求过来,就可以直接在Redis中拿到数据;不过要注意【缓存穿透】的问题。

  3. 缓存的刷新会比较复杂,通常是修改完数据库之后,还需要对Redis中的数据进行操作;代码很简单,但是需要保证这两步为同一事务,或最终的事务一致性。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

评论0 赞同0
  •  加载中...
X1nFLY

X1nFLY

回答于2022-06-28 15:04

首先可以明确一点的是:Redis可以对MySQL中的部分数据进行存储,但Redis是无法代替MySQL来做数据存储的。Redis是非关系型数据库,MySQL是关系型数据库,听上去都是数据库,但两者的定位及应用场景是完全不同的。

数据库的目的及功能

数据库是专门用来存储数据的地方,可以理解成是一个电子档案馆。数据库需要具备最基本的新增、更新、查询、删除等操作,另外要在并发操作下保证数据的隔离性和一致性。

为什么会存在非关系型数据库(NoSQL)?

我们知道,传统的关系型数据库都是持久化存储的,数据是存放在硬盘中的。随着数据量的扩大,无论是写入还是查询操作都会产生IO开销。为了解决写读数据带来的IO瓶颈就出现了NoSQL技术。

Redis非关系型数据库的初衷及不足

Redis作为一种非关系型数据库的代表,它是基于内存的高性能Key-Value数据库。它支持每秒十几万次的读写操作,在读写性能上远远超过传统的关系型数据库

Redis读写速度之所以这么快,是因为它将数据直接存放在内存中进行操作的。但是问题也来了,如果使用Redis来做数据存储,那内存开销是相当大的,出于成本考虑我们一般只使用Redis来存储热点数据。

另外一方面,虽然Redis也支持数据持久化,但是Redis的数据查询能力很差而且事务支持不完善。这样一比较,在数据存储能力上,Redis远远比不上MySQL这类关系型数据库。


综上,Redis一般都是配合MySQL来使用的,也无法代替MySQL来做数据持久存储。

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

评论0 赞同0
  •  加载中...
zgbgx

zgbgx

回答于2022-06-28 15:04

redis是不可以代替mysql进行数据存储的。redis和mysql不应该是竞争的关系,而是一对好基友。在实际工作中针对不同的场景,根据redis和mysql的各自优点采用不同的存储方案,合理的运用两者才能达到理想的效果。

NoSQL是“Not Only SQL”的意思,本质上是跟SQL形成互补关系的应用。

之所以有“redis是否可以代替mysql进行数据存储”这样的疑问,一定是有很多人认为redis是可以替代mysql的。我也不可否认,在特定的场景下或者说小型web服务的场景下,redis确实可以替代mysql做数据存储。但是这是有前提条件的,绝不能就可以说redis可以代替mysql进行数据存储的。

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

上面是redis的官网描述,redis是一个基于BSD协议开源的内存数据库,可用作数据库、缓存和消息队列,支持strings、hashes、lists、sets、sorted sets、bitmaps...等等数据结构。

每一种数据结构都有适合自己的应用场景,熟悉运用redis的各种数据结构,确实让各位有一种错觉“redis可以替代mysql”。

redis是基于内存存储的,采用IO单路复用模型。一个字就是快!对于并发访问量比较高的场景,使用redis可以避免流量直接冲向数据库层。


下面是个人使用redis和mysql的一些心得:

  1. redis存业务数据,mysql存更细粒度或者基于数据模型对象的数据,redis是中间缓存层,mysql是数据存储层。

  2. mysql中like/in/and/or/join等数据查询检索redis是无法支持的,通常情况下,我们会以mysql数据为基础数据,然后通过一系列的策略或者job跑出业务数据放到redis中存储,这是二者结合使用的典型应用场景。

  3. redis对事务的支持还是比较简单的,所以很多复杂的数据落库场景很难用redis去支持,即便可以支持,那也需要花费高昂的代价,这个时候你突然想起来有一个mysql好像可以完美的支持事务。

  4. 大部分的业务请求基本上就到redis这一层就结束了,如果查不到数据那就查不到,不会再去数据库里面去查了,所以也不用考虑“缓存穿透”的问题。

  5. redis中存储的大部分数据是不过期的,所以也没有“缓存雪崩”的问题。

  6. redis能够让你的业务运行的更快,mysql能够让你的数据更安全。

  7. 那么问题来了,如何保证redis中存储的业务数据能够与mysql中存储的数据保持一致呢?所以我们需要做一套数据一致性的方案来保证这个前提。


综上,MySQL和redis各自有各自的应用场景,掌握好他们的特性,在不同的场景下应用最适合的存储方案才是编码之道。

欢迎大家积极参与讨论,一起学习,共同成长~

评论0 赞同0
  •  加载中...
baiy

baiy

回答于2022-06-28 15:04

Mysql是关系型数据库,而NOSQL譬如redis通常都是弱关系,如果你的数据相互之间关系非常弱,哪自然可以使用redis,反之如果你是强关系,使用redis则需要自己实现上层的数据模型关系,祝你好运

评论0 赞同0
  •  加载中...
Olivia

Olivia

回答于2022-06-28 15:04

基本上,作为一个靠开发维持生活的人,看到此类比较什么比什么好、什么能不能代替什么的问题,基本上会判定为是初学者的无聊撕逼,这种情况都是直接略过。但是,偶尔这些问题也会出自某些资深同行之口,那么可以分情况讨论。

如何回答这类问题,基本上取决于这个问题出现在什么场景下:
场景一:面试
可以考虑的回答:面试官你是认真的吗?贵司是真的考虑要这么干还是已经这么干了?我感觉我的职业生涯规划可能跟贵司的发展方向并不是非常匹配,所以,非常抱歉!我还有事,先走了。
场景二:技术分享

可以考虑拒绝回答。而且如果是公司内部的技术分享,基本上可以考虑找下家了。讨论这种问题的公司要么是太牛逼而毫无生存压力,要么是太垃圾而毫无生存机会。前者的可能性不会太大。所以,走为上策吧!


在各位大佬喷我之前,请先让我把话说完。

这个问题如果不是那么认真地提出来的话,我还有可能会假装认真地回答。

如果真有人认真地提出这个问题,我只能认为此人对待技术本身有点太不认真了。

当然,纯属个人看法。


好了,各位请随便喷吧!反正我也不会回来看。

评论0 赞同0
  •  加载中...
baukh789

baukh789

回答于2022-06-28 15:04

两者适用于不同的场景,谁也替代不了谁

redis主要用于热点数据的快速查询,数据要符合“查多改少”的特点,事务性差。

mysql存储的结构化数据,强调数据的一致性,需要数据高度一致的场景还是要关系型数据库出马,电信运营商、金融等行业oracle还是主流解决方案。

这两种数据库,在检索方式,存储容量上,也是不一样的。

MySQL是关系型数据库,可以通过多字段的检索来确定数据,而且,基于硬盘的存储,容量会大得多。

而Redis是kv数据库,虽然支持多种数据结构,但是本质上,依然是kv。它的高效检索是依赖于数据缓存在内存当中的。不能进行多条件联合检索,也不支持like等检索。

存在即合理,redis和关系型数据库是共生关系

大型系统都会同时看到redis、关系型数据库的身影,通过相互配合解决系统的高并发和数据的一致性。当然这里面要考虑缓存击穿、缓存雪崩、缓存和数据库的一致性等问题。

总之,两者是相辅相成的,欢迎探讨。

评论0 赞同0
  •  加载中...
?xiaoxiao,

?xiaoxiao,

回答于2022-06-28 15:04

不可以,存储数据类型不一样,都是开源数据库,用redis 代替mysql没意义

评论0 赞同0
  •  加载中...
lunaticf

lunaticf

回答于2022-06-28 15:04

想搞明白这个问题,必须要先知道,什么是redis,什么是mysql,他们的各自优缺点是什么

  • redis:是一种非关系kv内存数据库(也就是常说的nosql),即将数据存储在缓存中,支持的数据类型比较多,比如字符串,hash,list等缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。
  • mysql:是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,数据的格式是我们熟知的二维表格的样式,关系型数据库具有很多强大的功能,大部分都支持SQL语句查询,对事务也有很好的支持。
  • mysqlredis没有竞争的关系,通常当并发访问量比较大的时候,特别是读操作很多,架构中可以引入redis,帮助提升架构的整体性能,减少mysql(或其他关系型数据库)的压力。

所以两者是相互配合,而不是替代,因为Redis的性能十分优越,可以支持每秒十几万次的读/写操作,并且它还支持持久化、集群部署、分布式、主从同步等,Redis在高并发的场景下数据的安全和一致性,所以它经常用于这些场景:

  1. 经常要被查询,但是创建、更新、删除等操作频率低的数据;比如数据字典,确定了之后很少被修改,是可以放到缓存中的;还有热点数据,查询极为频繁的数据,放到redis中可以减少mysql的压力;
  2. 经常被查询,但是实时性要求不高数据,比如购物网站的热销排行榜,定时统计一次后把统计结果放到redis中提供查询 。
  3. 缓存还可以做数据共享(session共享),在分布式的架构中,把用户的session数据放到redis中。
  4. 高并发场景下的计数器,比如秒杀,把商品库存数量放到redis中(秒杀的场景会比较复杂,redis只是其中之一,例如如果请求超过某个数量的时候,多余的请求就会被限流);
  5. 因为redis对高并发的支持和单线程机智,它也经常用作分布式锁;

redis虽然功能强大、性能高效,但是也不是万能的,项目在引入redis的时候,需要考虑的问题也比较多,并且会带来额外的开发和运维的工作量。

  1. 首先要判断数据是否适合缓存到redis中,可以从几个方面考虑:数据会被经常查询么?命中率如何?写操作多么?数据大小?数据一致性如何保证?
  2. 我们经常采用这样的方式将数据刷到redis中:查询的请求过来,现在redis中查询,如果查询不到,就查询数据库拿到数据,再放到缓存中,这样第二次相同的查询请求过来,就可以直接在redis中拿到数据;不过要注意【缓存穿透】的问题。
  3. 缓存的刷新会比较复杂,通常是修改完数据库之后,还需要对redis中的数据进行操作;代码很简单,但是需要保证这两步为同一事务,或最终的事务一致性。

评论0 赞同0
  •  加载中...
Cristic

Cristic

回答于2022-06-28 15:04

redis是nosql数据库,擅长处理键值对(key, value)结构的数据,同时他还支持丰富的数据结构 set, map, list, zset

mysql擅长处理关系型数据

如果你的应用场景,仅限于存储和简单查询,不去做复杂的关联操作,并且能够容忍一定的数据丢失的话,可以使用redis代替mysql。但是主流场景不这样使用,redis主要用作热点数据的缓存,相当于缓存一些读多写少的数据,用于降低mysql(后者其它关系型数据库)的读写压力。

评论0 赞同0
  •  加载中...
yuanzhanghu

yuanzhanghu

回答于2022-06-28 15:04

缓存数据库怎么替代物理数据库

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<