V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hujianxin
V2EX  ›  程序员

Redis 数据何时持久化到 MySQL 里面呢?

  •  
  •   hujianxin · 2017-05-14 21:26:42 +08:00 · 7507 次点击
    这是一个创建于 2787 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位前辈,我请教一个 Redis 问题。

    使用 Redis 实现了网站评论的赞踩,排行榜功能。请问,这些热数据,在什么时机从数据库里面读入,什么时机持久化到数据库中呢?

    这个问题有最佳实践不?

    感谢!

    22 条回复    2017-05-15 19:00:09 +08:00
    Mirana
        1
    Mirana  
       2017-05-14 21:37:51 +08:00   ❤️ 1
    redis 也能持久化啊
    cloudzhou
        2
    cloudzhou  
       2017-05-14 21:41:07 +08:00
    redis 使用内存非常大,你可以考虑热点放在 redis, 比如评论前 100 条,之后走 mysql 搜索
    odoooo
        3
    odoooo  
       2017-05-14 22:17:53 +08:00
    1. 异步脚本定时同步。

    2. 在 redis 中记录上次同步时间,由程序判断来同步进数据库。
    xia0ta0
        4
    xia0ta0  
       2017-05-14 22:58:42 +08:00
    Redis 自身的持久化完全能够满足这种需求
    stabc
        5
    stabc  
       2017-05-14 23:03:33 +08:00
    跑题一下:个人建议是顶踩这一块放弃 redis,毕竟内存足够的话,依靠 MYSQL 自己的缓冲,对 MYSQL 的操作本来就是对内存的操作,性能上没有问题。而且顶踩和依据顶踩做排序不是更适合用关系型数据库么。倒是可以用 redis 来做排行榜的缓存。
    billlee
        6
    billlee  
       2017-05-14 23:55:59 +08:00
    @stabc #5 MySQL 的默认配置下,commit 是要对 journal 做 sync 的,单个机械硬盘的 IOPS 大概也就是 100 了。
    Immortal
        7
    Immortal  
       2017-05-15 02:39:21 +08:00
    没这类经验 但是突然想到 是不是可以模仿 redis 落地的机制 自己设定一个合适的值(整除就是意味着到达)然后落地
    再结合前面说的 不是所有评论就等于热数据 可以取评论最热门的那几条
    mringg
        8
    mringg  
       2017-05-15 06:00:34 +08:00 via iPhone
    个人认为可以通过读 aof 文件的方式来持久化
    changhe626
        9
    changhe626  
       2017-05-15 08:06:53 +08:00
    可以使用 mysql/oracle 进行持久化的,小伙子,你可以百度
    Ouyangan
        10
    Ouyangan  
       2017-05-15 08:58:22 +08:00
    你可以写到 redis,不能写到 mysql 么。。。
    jianzhiyao020
        11
    jianzhiyao020  
       2017-05-15 09:27:08 +08:00
    redis 作为 mysql 缓冲区即可
    kaka8wp
        12
    kaka8wp  
       2017-05-15 09:34:45 +08:00
    每小时往数据库备份一次
    ahkxhyl
        13
    ahkxhyl  
       2017-05-15 09:36:27 +08:00
    关注下~
    1023400273
        14
    1023400273  
       2017-05-15 09:44:17 +08:00
    坐等大神解答
    vus520
        15
    vus520  
       2017-05-15 11:47:59 +08:00
    现在有不少 redis 异步同步的方案了
    比如,pika 的同步镜像方案,就是读 redis 的 binlog,跟 Mysql 一样,用来同步复制主的数据到从,从而实现复制和集群。
    要复制一份到 mysql,基于 binlog 可以做一个 parse 即可。
    woshixiaohao1982
        16
    woshixiaohao1982  
       2017-05-15 12:01:40 +08:00
    redis 自带持久化 使用 AOF 写时 更新
    gouchaoer
        17
    gouchaoer  
       2017-05-15 13:08:05 +08:00
    你搞清楚,凡是写必须马上持久化
    redis 是读缓存
    crazyneo
        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 备份。
    changwei
        19
    changwei  
       2017-05-15 16:05:26 +08:00 via Android
    首先还是要看服务器负载情况,一般情况下还是挑人流量少的时间点把,不可能数据库都已经压力很大的情况下你这边还在做持久化存储,这个可以查看各种监控数据来判断的,或者写个脚本自动根据数据库连接数,cpu,内存之类的判断是否可以进行持久化操作任务。
    vus520
        20
    vus520  
       2017-05-15 16:08:40 +08:00
    @crazyneo 你对 redis 了解比较详细。抬自己的时候把别人也踩一下,漂亮。

    楼主要的是持久化 Mysql 的方案,你来一个不需要。

    我说的 binlog 指的是这类基于 log 方案,redis 除了 aof,monitor 也可以,这些增删改的原始行为都叫 binlog,ok ?我说 binlog 基本上大家就都明白了。
    crazyneo
        21
    crazyneo  
       2017-05-15 17:00:30 +08:00
    @vus520 本来踩一脚就完了,你这话说的我不得不踩两脚—— redis 的复制实际是基于 rdb 的,你这个说法会让别人以为 aof 可以做数据复制,进而损失复制过程中缓存的数据,即使是拿 aof 做数据迁移,也要评估停机时间对业务的影响。
    此外,对于排行榜类功能,确实就不需要到 mysql 层,这牵涉到一个设计问题,就是 redis 本身是作为读热点存在的,他不应该主动往 mysql 这种持久化存储层去写数据,而应该只有读,你要做排行榜之类应该是业务上异步双写,而不是让 redis 主动往 mysql 去写——在 redis 内写单个操作是原子化的,到 mysql 你还得做个事务保证同步万一不成功还要考虑回滚?尤其是你要从 redis 往 mysql 写很可能还是个长事务,一执行好几分钟,到时候骂娘的可不仅仅是运维。
    vus520
        22
    vus520  
       2017-05-15 19:00:09 +08:00
    @crazyneo

    1,我只说基于 aof 和 monitor,可以实现 binlog 的效果,基于 binlog 可以实现多种异步复制,方案各异
    2,很多业务都是先入 redis,再入 mysql,你让 redis 做队列的业务怎么做?
    3,redis 数据结构已经很丰富了,当成唯一的数据库也不是抗不起来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:14 · PVG 07:14 · LAX 15:14 · JFK 18:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.