问题
我正在编写 Java 应用程序和数据库之间的自动缓存中间件。我解析查询,获取查询 MD5 哈希并将 CachedResultSet 存储在键值服务中。
我想对给定结果集的更新实现自动缓存失效。为此,我必须检查 INSERT、DELETE 或 UPDATE 查询是否影响 SELECT 查询的结果,该结果被缓存。
例子
假设我有以下 SELECT 查询:
Q1 -SELECT * FROM TEST WHERE TEST_COLUMN > 1500 AND TEST_COLUMN_2 = 'TEST';
Q2 -SELECT TEST_COLUMN_2 FROM TEST;
我缓存结果集。然后更新:
Q3 -UPDATE TEST SET TEST_COLUMN_2='TEST' WHERE TEST_COLUMN<1000;
第四季度-UPDATE TEST SET TEST_COLUMN_2='TEST2';
Q3不影响Q1结果集,因此不需要缓存失效。
Q3影响Q2结果集,因此需要缓存失效。
Q4影响Q1,Q2结果集,因此需要缓存失效
最简单的解决方案
最简单的解决方案是使用映射形式的列存储在给定表上运行的所有查询,其中 * 表示所有列:
DATABASE_A: {
SCHEMA_A:{
TABLE_TEST:{
*:[Q1], // invalidated by: Q3,Q4
TEST_COLUMN:[Q1], // invalidated by: none -> used as condition in Q3
TEST_COLUMN2:[Q1,Q2] // invalidated by: Q3,Q4
},
TABLE_TEST2: {
*:[Qx]
}
}
}
因此,如果表 TEST 中的 TEST_COLUMN2 列发生更新,则Q2的查询结果缓存无效。
INSERTS 和 DELETES 将使表的所有查询缓存无效
该方法的缺陷在于,即Q1被Q3无效,因为没有分析导致空交集的选择条件。
问题
是否有任何解决方案可以检查两个查询的条件是否重叠或相互矛盾,因此并非所有查询都需要根据查询条件无效?