如何从缓存中快速获取数据
做项目的时候 需要一些设置数据
例如: 部门 人员 客户 行业 等等 我一般喜欢将这些数据 缓存到客户端
一般使用Dataset 缓存数据
当缓存数据比较大的时候 (6000条以上)
我一般是使用DataView 的 rowfilter 根据条件过滤缓存数据 获取合适的条目
数据量大的时候 发现速度比较慢(以前没有注意到)
经过几次试验 解决办法如下:
1. 使用DataTable.Select() 方法 比用DataView 的 rowfilter 要快一些
2. 使用HashTable 保存数据 (这个性能非常快 适合键值对形式的缓存数据)
using System.Collections;
Hashtable hst = new Hashtable();
hst.Add("a", "a01");
hst.Add("b", "b01");
//确定键值a是否存在
bool isExist = hst.Contains("a");
或者
bool isExist = hst.ContainsKey("a");
注解: hst.Contains 和 hst.ContainsKey 好像是一个意思 (我觉得)
3. 使用泛型字典
using System.Collections.Generic;
SortedDictionary<string, string> test = new SortedDictionary<string, string>();
test.Add("a", "a01");
test.Add("b", "b01");
//确定键值a是否存在
bool isExist = test.Keys.Contains<string>("a");
使用排序字典是最快的 也可以使用普通的字典 Dictionary
4. 如果 是vs2008以上的版本 可以使用Linq 区分泛型实体
个人觉得 linq 在性能方面 可能不是太高(没有实际测试 看过网上别人的测试结论是比较慢)
http://topic.csdn.net/u/20090810/15/26ce5147-e1fc-4ded-808f-bb5b4a294a02.html
总结一下:
<1> 最快的是泛型排序字典 因为它的类型是明确的 不用装箱 拆箱操作
<2> 第二 是HashTable 也比较快 不过现在一般都推荐使用第一种
<3> 使用DataTable.Select() 适用于用Dataset缓存数据的情况
<4> 使用Dataview 的 rowfilter 适用于用Dataset缓存数据的情况(数据量小的情况下 适用)
如果数据量大 我们可以定义一个类 里面有多个属性 (例如:类 CMedia)
Dictionary<string, CMedia)> test = new Dictionary<string, CMedia)>();
需要定位缓存数据的时候 使用test.Keys.Contains<string>("a"); 定位
然后 就找到了作为值的类