首页 新闻 会员 周边

缓存Table的实现。

0
悬赏园豆:50 [待解决问题]

现有两张表 :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"

 

参考:http://stackoverflow.com/questions/20042742/how-can-i-know-a-where-clause-query-results-contains-another-where-clause-query

 

这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。  大数据量查询的时候 ,大家知道多慢了,所以我想做缓存,做比较灵活的缓存,哪种key-value形式的类http缓存大家就不用讨论了。

由于数据更新从而使缓存失效的情况,暂且不讨论(这个仅仅是业务逻辑设计的问题)。 

 

如何实现这个功能呢??

如坐夕阳的主页 如坐夕阳 | 初学一级 | 园豆:152
提问于:2013-11-18 18:46
< >
分享
所有回答(2)
0

你还是别用这种无聊的设计了,直接从数据库取,数据库没你想象的那么脆弱,有时候对缓冲的后数据的查询性能还不如直接去数据库取,毕竟数据库有索引等能提高查询速度,而缓存没有

56180825 | 园豆:1756 (小虾三级) | 2013-11-18 19:28

 相信我,这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。  大数据量查询的时候 ,你就知道多慢了。 

支持(0) 反对(0) 如坐夕阳 | 园豆:152 (初学一级) | 2013-11-19 09:06

@如坐夕阳: 所谓大数据,多半是数据库设计不合理造成的,当然确实有真的大数据,您公司真有那么大的访问量?企业级开发数据库已经完全够你用了

支持(0) 反对(0) 56180825 | 园豆:1756 (小虾三级) | 2013-11-20 22:39
0

参考NopCommerce的设计:

1、Country全部缓存,每次取的时候都从缓存取,如果没有Country的缓存,就从数据库取。

2、添加、更新都使Country的缓存作废,从而下次取Country的时候,全部从数据库重新取。

这个方法非常适合非业务数据的缓存,我把这种缓存封装到了Repository,这样当我需要Country或者Role之类的东西,根本不需要管是从缓存来的还是从数据库来的。

Shine Ss | 园豆:214 (菜鸟二级) | 2013-11-18 19:46

相信我,这只是一个引子,,, 我所说的Countries表其实是对应了一个网络服务的,, 基于这个网络服务我们可以作查询 。。  大数据量查询的时候 ,你就知道多慢了。 

全部获取是不现实的。。

支持(0) 反对(0) 如坐夕阳 | 园豆:152 (初学一级) | 2013-11-19 09:07

@如坐夕阳: 那就给你的查询做个索引器。比如id>0转换成一个索引序列,后续的查询一样转换成索引序列,两个序列求差集,差集为0表示不需要从数据库(或网络服务)取,要取也只取差集的内容,取回来后更新索引序列。

支持(0) 反对(0) Shine Ss | 园豆:214 (菜鸟二级) | 2013-11-19 09:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册