https://segmentfault.com/a/1190000006805840php
背景:php作web开发,MVC,phalconmysql
缘由:web
service层获取数据,有新增数据字段;redis
controller层是经过redisCache调用service接口;sql
redisCache采用redis-file双缓存结构,可能存在状况:redis-cache有效;file-cache有效;直接本地调用service,再写进redis和file-cache中;segmentfault
线上有个脚本会每隔1秒经过redisCache调用一次此service接口,而且强制刷新缓存(redis-file);缓存
灰度环境和生产环境用的是同一套redis,并且必须这样;
因此,这就形成线上的脚本不断的从线上的service中取得数据,并刷新的redis-file缓存中,从而形成灰度环境直接读了线上缓存,致使灰度代码的service变动没有生效测试
尝试解决:this
灰度代码:问题controller调用redisCache接口,有强制刷新参数,将其置为false;
存在问题:这样是恨不正确的作法,会把灰度的service数据强制刷新到redis-file缓存中,从而致使线上缓存出现脏数据,这样后果很严重!!spa
灰度代码:问题controller中,直接调用本地的service,不走缓存;
存在问题:致使灰度环境的全部(此controller)请求直接打在mysql上,从而增长了mysql自己的风险。
总结:由于灰度环境在公司内网,访问量较小,相比方法1,方法2能够暂时解决灰度测试时的缓存问题。可是仍然存在风险。
(各位看官,有木有更好的解决方案?)
缘由:
环境:php+mysql+phalcon,生产环境,mysql存在主从;
经过接口传入A、B两组数据并在一个事务中分别插入到A-table、B-table中,提交事务,再更新A刚插入的一个字段;
更新经过phalcon的findFrist找到数据 刚才插入的数据,更新字段,调用save;
// 示例代码 ATable,BTable都是继承phalcon的model
$a = array('id' => 1, 'testa' => 'data');
$b = array('id' => 1, 'testb' => 'data');
// 插入数据
$db->startTrascation();
$a_obj = new ATable();
$a_obj->id = $a['id'];
$a_obj->testa = $a['testa'];
$a_obj->save();
$b_obj = new BTable();
$b_obj->id = $b['id'];
$b_obj->testb = $b['testb'];
$b_obj->save();
$db->commit();
// 更新数据,findFirst
$update_a_obj = ATable::findFirst(array('id=:a_id:', 'bind' => array('id' => $a['id'])));
$update_a_obj->testa = 'new_data';
$update_a_obj->save();
// 这里就会出错,由于这里findFirst走了从库
// -----------------说明----------------------
// findFirst走从库是项目自己在model层作的初始化
public function initialize() {
parent::initialize();
$this->setReadConnectionService('db_r');
$this->setWriteConnectionService('db');
}
// setReadConnectionService由phalcon底层提供
总结:1. 永远不要认为主从同步;2.同一个mysql链接,不要出现既用主库、又用从库;