redis 本身有持久化,为什么还要写进 mysql 呢?

2015-09-10 09:34:10 +08:00
 chuanwu

redis 本身的持久化做得挺靠谱的,为什么还要多一个定时任务来写进 mysql?
如果是因为防止恶意攻击被 flush 的话, mysql 也不大可能会幸免啊。

33173 次点击
所在节点    Redis
62 条回复
caoyue
2015-09-10 10:41:54 +08:00
有些数据还是结构化的比较容易使用吧
stackpop
2015-09-10 10:46:57 +08:00
没有人提到事务么?
lavadore
2015-09-10 10:52:18 +08:00
请科普关系型数据库
neoblackcap
2015-09-10 10:53:59 +08:00
@stackpop 事务+1,明明很多人的主程序就是从 MySQL 读数据的,写进去不是很正常么?

若是把 redis 作为唯一的持久化机制,当然可以不写 MySQL ,只不过你的程序需要另外实现事务而已。这没什么。然而当加上事务以及开启持久化特性之后,这样一个写的过程我觉得可能还不如直接写 MySQL 来得快
zonghua
2015-09-10 11:12:27 +08:00
比如博客网站侧边栏的标签,归档和相关的内容是在缓存里面的吧,不可能是都查询一次。
line
2015-09-10 11:27:32 +08:00
sql 查询,很方便
snailsir
2015-09-10 11:27:38 +08:00
@socrates “实时的异步写入” 要怎么做呢?求教
jsjscool
2015-09-10 11:30:25 +08:00
用 MySQL 落地主要是为了自己后期轻松点。经常有如下场景:
1.同步数据。千万级别的历史数据用 MySQL 直接导出 SQL 给需求方就行了。 Redis 总会麻烦一些。
2.数据分析师经常找你要数据,而且大多数分析软件不支持 Redis ,这个时候你怎么弄?

所以用 MySQL 落地对自己和公司都是有大大的好处。
linescape
2015-09-10 11:33:00 +08:00
这是一道很好的面试题
wy315700
2015-09-10 11:33:55 +08:00
@snailsir 修改 redis 源码,,以前听说个大牛,一天就搞定了
snailsir
2015-09-10 11:41:04 +08:00
@wy315700 这么牛逼,求学习
shoaly
2015-09-10 12:01:37 +08:00
我觉得 是因为 sql 的方式可以很好的把 项目分表, 去分开, redis 这种给人解决先天性就是 kv 模式 很难去解剖复杂的数据结构
tesion99
2015-09-10 12:06:14 +08:00
redis 的数据存于内存中,如果突然断电的话,服务器 redis 中的内存数据就丢失了,写进 mysql 有确保数据不丢失的安全考虑吧
chuanwu
2015-09-10 12:14:47 +08:00
统一回复一下吧:
1. 有朋友提到说 Redis 会吃满内存,从而爆掉。
但一般来说 redis 的使用场景(仅从我的角度来看),是在可能需要频繁读写数据,但该数据又并不太重要或者可能只是用一次时,比如点赞,短信验证等,该类数据的话,如前者,存到 mysql 也并不能减少内存压力啊,短信验证的话,用 redis ,设置 expire ,比 mysql 要更好啊,也不会累积太多数据。
2. 实时异步存储

在实际使用时,还是需要从 redis 里面来获取最新数据啊。

3. redis 重启后数据加载耗时
我在实际使用中, mysql 持久只是担心服务器挂掉从而丢失数据,但这类情况特别少见。这边请有经验的前辈分享一下。什么样的数量级会导致 redis 加载过慢? 而且 redis 重启,肯定还是需要从 mysql 再把数据搞回来,这样的话,速度会比 redis 自身的要快很多吗?

wingoo 提到的,也是我现在遇到的问题,每一次要用到某个数据时,比较麻烦,需要去拼 key 。
但不现拼现 get 的话,数据不一定是最新的啊。
neoblackcap 提到的问题,如果是这种情况的话,完全可以在使用到该数据时,来实时存储啊,否则数据可能不准确。
个人愚见。
msg7086
2015-09-10 12:24:58 +08:00
随便说几点。

1. 权限控制
MySQL 有权限控制,用户可以精确到每个 IP 的每个账户,目标可以精确到每个表的每个操作。
Redis 则是天生设计成完全开放权限,包括完全删除数据库的操作,任何人都可以执行。要么就只能把指令重命名成空的,完全禁止任何人执行。

2. 数据完整
MySQL 的数据库保存在磁盘中,万一崩溃断电,也有数据库日志可以用以完成数据库事务。
MySQL 支持主从备份,所有的写入操作都可以实时发送到异地,哪怕突然机房被核弹轰炸,也不会丢失数据(可能除了最后几条语句)。
Redis 的崩溃……嗯小心数据全丢。
Redis 的 Replication 备份……嗯小心数据全丢。

3. 负载均衡
MySQL 可以单主多从,也可以胆子够大在内网做双主,也可以用 innodb 配合 galera 做集群,每台机器都有一个独立的拷贝,因此服务器之间只要传输写指令即可。
Redis 可以单主多从(然而小心数据全丢),但是不能做多主互联。最多最多只能做 sharding ,也就是每台机器只保存一部分数据,读写一律被分散到其他机器上。直接后果就是内网流量大增。

4. 数据隔离
MySQL 里我可以选择删掉某个应用的所有数据而保留另一个应用的所有数据。
Redis 里要么依赖 11 个 DB 的选择,要么依赖命名空间。

5. 性价比
MySQL 是内存+硬盘,上个 SSD 配合 Query Cache 那速度已经是很快了。
Redis 是纯内存。乖乖掏钱加内存换至强啦。而且你还是得配备高性能磁盘,因为定时刷到磁盘和开机加载数据的操作还是要磁盘性能的。
vikeria
2015-09-10 12:30:47 +08:00
感觉好像前段时间看过这个帖子
tigerz
2015-09-10 12:36:54 +08:00
可能的问题:
1. redis 的持久化是异步的,出现异常丢数据的概率很高。
2. mysql 可以做复杂的查询。
hippoboy
2015-09-10 12:43:06 +08:00
@chuanwu 能否说说如何实现?特别是这个定时任务写到 mysql 如何实现?搜索关键词也行....第一次接触 redis 搞的无头绪啊,orz
22too
2015-09-10 12:48:40 +08:00
我是做统计的,公司各种统计任务

1. 改写之前的 sql 统计习惯?

不可能的,这个太难了,再说,好不容易学了一些一个 sql 就能解决的统计问题,现在你告诉我,让我全部使用 redis 的规则来写,然后数据处理全部使用编程语言进行

2. 我的思维是固化的

我只知道我统计出来的数据很重要或者不重要,重要的数据为何我要冒险使用可能会有问题,或者自己不熟的操作方式去做,不重要的数据,我为何要写个程序去做?而不是仅仅写一个条嵌套 sql 。

3. 需求不同

开发这样想是对的,但是其他的人可能会面临新的压力,新的技术挑战,所以需求定位是最终的出发点,除非哪天 redis 的统计也能做的很溜

个人意见
xmbaozi
2015-09-10 12:49:23 +08:00
1.持久化不是实时的
2.只能用键查询

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/219551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX