查询结果交叉检查自动缓存失效

时间:2013-09-11 14:13:12

标签: sql caching memcached resultset middleware

问题

我正在编写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;

我缓存结果集。 然后UPDATEs:

Q3 - UPDATE TEST SET TEST_COLUMN_2='TEST' WHERE TEST_COLUMN<1000;

Q4 - 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 无效,因为没有分析导致空交集的选择条件。

问题

是否有任何解决方案可以检查两个查询的条件是否重叠或相互矛盾,因此根据查询条件,不是所有查询都需要无效?

0 个答案:

没有答案