V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
SlipStupig
V2EX  ›  Python

redis 缓存 mysql 结果问题

  •  
  •   SlipStupig · Mar 6, 2016 · 5073 views
    This topic created in 3704 days ago, the information mentioned may be changed or developed.
    在思考一个问题 redis 如何同步 mysql 数据,网上的说法基本上两个:
    1.是使用 Gearman 去同步(如果使用 RDS 服务就无法使用这个)
    2.是程序控制逻辑(需要写额外的代码)
    但是感觉都不太好,不知道还有没有更好的方案
    Supplement 1  ·  Mar 6, 2016
    当 select 的时候这个比较简单,在 redis 设置一个 key ,把结果放入进去,下一次直接查询直接查询 redis 就可以了(实际项目测试效果不错, tornado 查询到输出到前端大概费时 4ms 左右),至于用 mysql 是对 redis 持久化信心不足,个人遇到过 redis 快照的坑(机器重启的时候快照没刷上, rdb 文件巨大加载时间长等等),当数据写入到 redis 的时候能定时同步到 mysql 里面去,这里不知道怎么实现比较合适,例如: update+1 这种操作,怎么去修改 mysql 的结果,然后同步到 redis 里面去会比较好?
    15 replies    2016-09-06 17:40:20 +08:00
    ericls
        1
    ericls  
       Mar 6, 2016 via iPhone
    改写的代码 逃不掉的啊
    ericls
        2
    ericls  
       Mar 6, 2016 via iPhone
    *该写
    yangqi
        3
    yangqi  
       Mar 6, 2016
    mysql 数据为什么要用 redis 缓存?实在要放到内存里直接在 mysql 里建内存表就好了啊
    odirus
        4
    odirus  
       Mar 6, 2016
    只要 MySQL 玩得溜,速度性能都非常好。缓存被太多人误用了,动不动都缓存。
    calease
        5
    calease  
       Mar 6, 2016
    cache 和 DB 作用不同,没法"同步"数据。
    程序控制逻辑是正确的做法。

    另外 Redis 比 MySQL 在 Lookup 方面快太多了,
    讨论哪个好不好没意义。
    virusdefender
        6
    virusdefender  
       Mar 6, 2016
    这个还是建议在代码逻辑或者 ORM 层面去处理吧
    SlipStupig
        7
    SlipStupig  
    OP
       Mar 6, 2016
    @odirus 这个是是不对的, redis 的查询速度是 mysql 不可比拟的
    SlipStupig
        8
    SlipStupig  
    OP
       Mar 6, 2016
    @calease redis 也是数据库啊,它跟 memcache 是不一样的, redis 有丰富的数据结构,完整的持久化机制,而且内存表不支持事务功能 @yangqi
    calease
        9
    calease  
       Mar 6, 2016
    @SlipStupig
    既然你想要把 MySQL 的数据放进 redis 里,
    我默认你把 redis 作为 cache , mysql 作为 DB 使用,
    那么 cache 并不需要同步 DB 的数据,
    cache 只需要 serve 它有的数据就行了,
    cache 里的数据从哪来是程序控制的。
    我哪句也没涉及 redis 到底是不是“数据库”
    orvice
        10
    orvice  
       Mar 6, 2016
    代码层控制,缓存一些 select 数据就可以了
    slixurd
        11
    slixurd  
       Mar 6, 2016
    居然有人用 Redis 的持久化.....
    而且还是把 Redis 当作 Database 而不是 Cache 来用
    soli
        12
    soli  
       Mar 6, 2016
    写专门的服务去同步;在程序逻辑上实现实时同步。

    数据量大了需要考虑增量同步的事儿。
    SlipStupig
        13
    SlipStupig  
    OP
       Mar 6, 2016
    @soli 增量也确实是个问题,目前做法是定时去刷掉 redis 的数据,并不是一个很好的选择
    yangqi
        14
    yangqi  
       Mar 6, 2016
    @SlipStupig redis 和 mysql 完全不同的使用场景, redis 是 in-memory data structure store 。而 mysql 是 RDBMS, 两个根本不是一个重量级的,不能单纯的只比较查询速度。

    就和楼上说的,你对 redis 持久化没信心就应该以 mysql 为主, redis 在前面做 cache ,两个不可能百分百同步的, cache 肯定会有 miss 掉的
    yinhexi
        15
    yinhexi  
       Sep 6, 2016
    看业务实时情景,如果减少业务的代码控制内存,可以使用 canal 搭配队列来做缓存的更新。 canal 监控数据库的变动,如果数据库有任何的变动,直接通过一个后台程序来更新缓存数据。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3216 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 14:04 · PVG 22:04 · LAX 07:04 · JFK 10:04
    ♥ Do have faith in what you're doing.