V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2016-03-06 04:24:22 +08:00 · 4482 次点击
    这是一个创建于 3175 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在思考一个问题 redis 如何同步 mysql 数据,网上的说法基本上两个:
    1.是使用 Gearman 去同步(如果使用 RDS 服务就无法使用这个)
    2.是程序控制逻辑(需要写额外的代码)
    但是感觉都不太好,不知道还有没有更好的方案
    第 1 条附言  ·  2016-03-06 16:15:12 +08:00
    当 select 的时候这个比较简单,在 redis 设置一个 key ,把结果放入进去,下一次直接查询直接查询 redis 就可以了(实际项目测试效果不错, tornado 查询到输出到前端大概费时 4ms 左右),至于用 mysql 是对 redis 持久化信心不足,个人遇到过 redis 快照的坑(机器重启的时候快照没刷上, rdb 文件巨大加载时间长等等),当数据写入到 redis 的时候能定时同步到 mysql 里面去,这里不知道怎么实现比较合适,例如: update+1 这种操作,怎么去修改 mysql 的结果,然后同步到 redis 里面去会比较好?
    15 条回复    2016-09-06 17:40:20 +08:00
    ericls
        1
    ericls  
       2016-03-06 04:37:59 +08:00 via iPhone
    改写的代码 逃不掉的啊
    ericls
        2
    ericls  
       2016-03-06 04:38:38 +08:00 via iPhone
    *该写
    yangqi
        3
    yangqi  
       2016-03-06 05:53:28 +08:00
    mysql 数据为什么要用 redis 缓存?实在要放到内存里直接在 mysql 里建内存表就好了啊
    odirus
        4
    odirus  
       2016-03-06 09:03:37 +08:00
    只要 MySQL 玩得溜,速度性能都非常好。缓存被太多人误用了,动不动都缓存。
    calease
        5
    calease  
       2016-03-06 11:59:24 +08:00
    cache 和 DB 作用不同,没法"同步"数据。
    程序控制逻辑是正确的做法。

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

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

    就和楼上说的,你对 redis 持久化没信心就应该以 mysql 为主, redis 在前面做 cache ,两个不可能百分百同步的, cache 肯定会有 miss 掉的
    yinhexi
        15
    yinhexi  
       2016-09-06 17:40:20 +08:00
    看业务实时情景,如果减少业务的代码控制内存,可以使用 canal 搭配队列来做缓存的更新。 canal 监控数据库的变动,如果数据库有任何的变动,直接通过一个后台程序来更新缓存数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1811 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 196ms · UTC 16:43 · PVG 00:43 · LAX 08:43 · JFK 11:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.