V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cevincheung
V2EX  ›  问与答

关于 MySQL 和 Redis 的问题,如何尽可能的平滑解决?

  •  
  •   cevincheung · 2014-12-19 00:30:55 +08:00 · 2030 次点击
    这是一个创建于 3424 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何能尽可能的少修改代码,更加平滑的修改线上的东西。


    有说redis自动同步到mysql也有说mysql定期同步到redis,然后都是读redis,没有从mysql读。


    这个读/取具体点怎么来做呢? 重点是如何尽可能的实时?
    2 条回复    2014-12-19 10:12:02 +08:00
    sunchuo
        1
    sunchuo  
       2014-12-19 09:42:33 +08:00
    在MYSQL连接类里实现缓存。
    lyragosa
        2
    lyragosa  
       2014-12-19 10:12:02 +08:00
    渔来啦!

    我来介绍一下我的网站的处理逻辑。

    首先介绍背景,我的网站是我大二的时候第一次学php的时候写的,那个时候我啥都不懂所以写了很多历史遗留代码,各种for100循环里面读100次数据库啥的。五年过去了依然正常运行,不过内核改了八次期间换了3个自制框架就不详谈了。相信这个逻辑比大多数v2er的网站糟糕,因为大家通常都会把小时候写的代码完全不要,长大了重写,而我是把一个小时候写的代码放到生产环境一直用,所以即使工作几年了也不能重写,只能在其上扩展。

    解决方案是这样:

    - 首先将所有mysql读取写入的操作迁移到mysql类上(没错,我当年连这个都不知道,全部用原生语法读写的)
    - 制作两个方法:get和getCache,get是直接读,getCache是读redis
    - 根据需求设定redis过期时间,比如用户信息缓存10分钟,用户名缓存4小时,用户列表缓存12小时,几乎固定的数据7天,这个作为一个参数附加到getCache方法
    - getCache的操作:首先将SQL文的hash作为key,查询redis,如果有值则读取,如果没有就读数据库,并把这个值写入到redis(key为sql文的hash,val为结果的json)。
    - 将原来的程序里面的一部分get改成getCache。
    - 每过一段时间看心情清空redis数据库。

    演示效果请看我个人资料中的网站,右下方的 xxx queries (xxx cached) 中的cached即为通过redis查询的数据。
    请不要吐槽为什么某些页有几百条查询,这是历史遗留问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1583 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:30 · PVG 00:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.