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

2014-12-19 00:30:55 +08:00
 cevincheung
如何能尽可能的少修改代码,更加平滑的修改线上的东西。


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


这个读/取具体点怎么来做呢? 重点是如何尽可能的实时?
2104 次点击
所在节点    问与答
2 条回复
sunchuo
2014-12-19 09:42:33 +08:00
在MYSQL连接类里实现缓存。
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查询的数据。
请不要吐槽为什么某些页有几百条查询,这是历史遗留问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/154992

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX