背景
我希望纯粹存储是否已经执行了查询。如果有,则应针对数据缓存(内部数据库,进程外)运行查询,否则应针对原始数据源(第 3 方外部 Web 服务)运行查询。这种缓存的动机是允许我们对该 API 进行的调用次数是有限的,并且我们可能会多次执行相同的查询。
在对原始数据源运行一次查询后,它只会在后续调用中对缓存的数据源运行。注意:为了简单起见,我故意忽略了缓存过期的问题。
鉴于每个查询可能包含许多参数(目前只有 5 个),并且参数的数量可能会随着时间的推移而增加,我不想使用诸如“WHERE x AND y AND z AND a AND b AND c”之类的内容来查询缓存的数据源和 d 和……”。
为此,我只想知道这个确切的查询之前是否已经运行过,如果有,我会假设它的数据已经在缓存的数据存储中可用(尽管格式不同)。我认为某种形式的“cachekey”可以识别具有相同参数和关联值的任何查询对我有用。每次我尝试查询时,我都会根据查询对象的状态生成缓存键,并检查缓存键存储以确定查询是否曾经运行过。cachekey 存储需要促进快速查找。
问题
我发现棘手的是这个缓存键应该是什么样子以及如何生成它。到目前为止,我倾向于
- 将有趣的查询参数及其值连接到一个字节数组中
- 从字节数组创建一个 MD5
- 将此缓存键存储在二进制(16)索引列中
为了争论,我愿意接受可能会导致缓存报告缓存数据可用于查询的一些冲突,而没有考虑到可能性很小(尽管我有多小) m 不是 100% 确定)。
上述创建缓存键的解决方案是否合理,或者我应该考虑其他方法吗?