在对 mysql 查询结果缓存时,我一直都有这样的疑惑。那就是当更新一条记录或者删除一条记录时候,那么对应的主键所有的查询结果必须同时更新,那么在就是说在
update table set field = value where id = XXX;之后
select * from table; 或者 select field1, field2... from table where id = XXX这些查询结果都会发现变化,那么如何保持结果的正确,避免脏数据的读取呢?? 给缓存的命名就显得非常重要了,之前我的想法是以这样的命名来建立缓存:
db_table_primaryId_sql这样的话就有个问题,当更新一条记录的时候可以根据 db_table_primaryId_* 来删除所有的缓存,但是如果 update 的是多行,那么久等于说要将所有的 db_table_* 缓存都失效。这样效率不是很高。
在工作中实际的做法是这样的: 查询无非是 getAll,getRow 这两种,获取全部,获取某一行,那么在缓存 key 命名中加入这两个就可以了
//针对 getAll: db_name:table_name:all:others:sql_hash //针对 getRow: db_name:table_name:row:primary_key_id=?在 update ,delete, insert 之后都会全部清除 db_name:table_name:all:others:* 的缓存,并且根据修改的 id 去清除 db_name:table_name:row:primary_key_id=? 里面的行缓存 在 insert 之后就单单增加 db_name:table_name:row:primary_key_id=? 的缓存
最后的最后还是要啰嗦几句,在现在工作中,如果很大的流量来频繁链接 redis 和 mysql,显然是顶不顺的,工作中发现公司是用了一个 swoole 的服务来进行维护 redis 和 MySQL 的长连接,用 tcp协议包 自定义协议来 socket 通信传入 sql ,swoole 的服务主要是执行逻辑,更新缓存,插入数据等等。我觉得应该是和下面的两文章介绍的差不多。可惜我不会 swoole ,看的有点吃力。
基于swoole扩展实现真正的PHP数据库连接池 PHP开发异步高性能的MySQL代理服务器
