利用redis缓存mysql查询结果,关于缓存命名

xiaoxiao2021-02-28  101

问题:

在对 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代理服务器

转载请注明原文地址: https://www.6miu.com/read-35768.html

最新回复(0)