各位前辈,我请教一个 Redis 问题。
使用 Redis 实现了网站评论的赞踩,排行榜功能。请问,这些热数据,在什么时机从数据库里面读入,什么时机持久化到数据库中呢?
这个问题有最佳实践不?
感谢!
1
Mirana 2017-05-14 21:37:51 +08:00 1
redis 也能持久化啊
|
2
cloudzhou 2017-05-14 21:41:07 +08:00
redis 使用内存非常大,你可以考虑热点放在 redis, 比如评论前 100 条,之后走 mysql 搜索
|
3
odoooo 2017-05-14 22:17:53 +08:00
1. 异步脚本定时同步。
2. 在 redis 中记录上次同步时间,由程序判断来同步进数据库。 |
4
xia0ta0 2017-05-14 22:58:42 +08:00
Redis 自身的持久化完全能够满足这种需求
|
5
stabc 2017-05-14 23:03:33 +08:00
跑题一下:个人建议是顶踩这一块放弃 redis,毕竟内存足够的话,依靠 MYSQL 自己的缓冲,对 MYSQL 的操作本来就是对内存的操作,性能上没有问题。而且顶踩和依据顶踩做排序不是更适合用关系型数据库么。倒是可以用 redis 来做排行榜的缓存。
|
6
billlee 2017-05-14 23:55:59 +08:00
@stabc #5 MySQL 的默认配置下,commit 是要对 journal 做 sync 的,单个机械硬盘的 IOPS 大概也就是 100 了。
|
7
Immortal 2017-05-15 02:39:21 +08:00
没这类经验 但是突然想到 是不是可以模仿 redis 落地的机制 自己设定一个合适的值(整除就是意味着到达)然后落地
再结合前面说的 不是所有评论就等于热数据 可以取评论最热门的那几条 |
8
mringg 2017-05-15 06:00:34 +08:00 via iPhone
个人认为可以通过读 aof 文件的方式来持久化
|
9
changhe626 2017-05-15 08:06:53 +08:00
可以使用 mysql/oracle 进行持久化的,小伙子,你可以百度
|
10
Ouyangan 2017-05-15 08:58:22 +08:00
你可以写到 redis,不能写到 mysql 么。。。
|
11
jianzhiyao020 2017-05-15 09:27:08 +08:00
redis 作为 mysql 缓冲区即可
|
12
kaka8wp 2017-05-15 09:34:45 +08:00
每小时往数据库备份一次
|
13
ahkxhyl 2017-05-15 09:36:27 +08:00
关注下~
|
14
1023400273 2017-05-15 09:44:17 +08:00
坐等大神解答
|
15
vus520 2017-05-15 11:47:59 +08:00
现在有不少 redis 异步同步的方案了
比如,pika 的同步镜像方案,就是读 redis 的 binlog,跟 Mysql 一样,用来同步复制主的数据到从,从而实现复制和集群。 要复制一份到 mysql,基于 binlog 可以做一个 parse 即可。 |
16
woshixiaohao1982 2017-05-15 12:01:40 +08:00
redis 自带持久化 使用 AOF 写时 更新
|
17
gouchaoer 2017-05-15 13:08:05 +08:00
你搞清楚,凡是写必须马上持久化
redis 是读缓存 |
18
crazyneo 2017-05-15 15:58:04 +08:00
@vus520 你这段话里槽点太多,你这不是一知半解,是半知无解。
redis 从 2.6 版本开始支持复制,2.8 以后开始支持 psync,这些复制都是纯异步的。 此外,redis 不存在 binlog,只有 aof 和 rdb,前者是类似 binlog 的操作集合,可以通过 bgrewriteaof 进行重写,后者是类似 mysqldump 出的文件一样是某个时间点的数据状态记录。 排行榜之类的功能没必要持久化到 mysql 数据库里,因为这些数据不会是核心业务数据,直接用 redis 自带的 aof 功能即可,但这个会比较消耗性能(比不开 aof 时相差 20%-30%性能),那就自己写个 cron 脚本通过 bgsave 每日做一次 rdb 备份。 |
19
changwei 2017-05-15 16:05:26 +08:00 via Android
首先还是要看服务器负载情况,一般情况下还是挑人流量少的时间点把,不可能数据库都已经压力很大的情况下你这边还在做持久化存储,这个可以查看各种监控数据来判断的,或者写个脚本自动根据数据库连接数,cpu,内存之类的判断是否可以进行持久化操作任务。
|
20
vus520 2017-05-15 16:08:40 +08:00
@crazyneo 你对 redis 了解比较详细。抬自己的时候把别人也踩一下,漂亮。
楼主要的是持久化 Mysql 的方案,你来一个不需要。 我说的 binlog 指的是这类基于 log 方案,redis 除了 aof,monitor 也可以,这些增删改的原始行为都叫 binlog,ok ?我说 binlog 基本上大家就都明白了。 |
21
crazyneo 2017-05-15 17:00:30 +08:00
@vus520 本来踩一脚就完了,你这话说的我不得不踩两脚—— redis 的复制实际是基于 rdb 的,你这个说法会让别人以为 aof 可以做数据复制,进而损失复制过程中缓存的数据,即使是拿 aof 做数据迁移,也要评估停机时间对业务的影响。
此外,对于排行榜类功能,确实就不需要到 mysql 层,这牵涉到一个设计问题,就是 redis 本身是作为读热点存在的,他不应该主动往 mysql 这种持久化存储层去写数据,而应该只有读,你要做排行榜之类应该是业务上异步双写,而不是让 redis 主动往 mysql 去写——在 redis 内写单个操作是原子化的,到 mysql 你还得做个事务保证同步万一不成功还要考虑回滚?尤其是你要从 redis 往 mysql 写很可能还是个长事务,一执行好几分钟,到时候骂娘的可不仅仅是运维。 |