• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hujianxin
V2EX  ›  程序员

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

  •  
  •   hujianxin · May 14, 2017 · 8196 views
    This topic created in 3370 days ago, the information mentioned may be changed or developed.

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

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

    这个问题有最佳实践不?

    感谢!

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

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

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

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

    1,我只说基于 aof 和 monitor,可以实现 binlog 的效果,基于 binlog 可以实现多种异步复制,方案各异
    2,很多业务都是先入 redis,再入 mysql,你让 redis 做队列的业务怎么做?
    3,redis 数据结构已经很丰富了,当成唯一的数据库也不是抗不起来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2670 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 15:48 · PVG 23:48 · LAX 08:48 · JFK 11:48
    ♥ Do have faith in what you're doing.