现有两张表 :Countries(id,name),缓存表Cached_Countries(id,name)
对表Contries查询时的逻辑如下:
1:根据查询条件(where-clause),判断是否能从Cached_Contries中查询。
2:如果能从Cached_Countries中查询,则直接从Cached_Countries表中查询,并返回。
3:如果不能从Cached_Countries中查询,则从Countries中查询,并把查询结果插入到Cached_Countries表中。
难点在于:如何判断是否应该从Cached_Countries中查询。
如:第一次执行sql 查询条件为:”id>0“, 同时把id>0的结果写入到了Cached_Countries表中;每二次执行sql查询条件为:”id>1“。 明显肉眼看出,id>0的结果是包含id>1的结果的, 这样就能直接从Cached_Countries中查询。
"id>0" contains "id>1"
"id>0 or name='China'" contains "id>0"
这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。 大数据量查询的时候 ,大家知道多慢了,所以我想做缓存,做比较灵活的缓存,哪种key-value形式的类http缓存大家就不用讨论了。
由于数据更新从而使缓存失效的情况,暂且不讨论(这个仅仅是业务逻辑设计的问题)。
如何实现这个功能呢??
你还是别用这种无聊的设计了,直接从数据库取,数据库没你想象的那么脆弱,有时候对缓冲的后数据的查询性能还不如直接去数据库取,毕竟数据库有索引等能提高查询速度,而缓存没有
相信我,这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。 大数据量查询的时候 ,你就知道多慢了。
@如坐夕阳: 所谓大数据,多半是数据库设计不合理造成的,当然确实有真的大数据,您公司真有那么大的访问量?企业级开发数据库已经完全够你用了
参考NopCommerce的设计:
1、Country全部缓存,每次取的时候都从缓存取,如果没有Country的缓存,就从数据库取。
2、添加、更新都使Country的缓存作废,从而下次取Country的时候,全部从数据库重新取。
这个方法非常适合非业务数据的缓存,我把这种缓存封装到了Repository,这样当我需要Country或者Role之类的东西,根本不需要管是从缓存来的还是从数据库来的。
相信我,这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。 大数据量查询的时候 ,你就知道多慢了。
全部获取是不现实的。。
@如坐夕阳: 那就给你的查询做个索引器。比如id>0转换成一个索引序列,后续的查询一样转换成索引序列,两个序列求差集,差集为0表示不需要从数据库(或网络服务)取,要取也只取差集的内容,取回来后更新索引序列。