缓存在何时有必要?
最近公司做一个项目,要大量用到 拼音码 与 五笔码 检索数据。
举个例子,加入数据库中有一条名为“你好”的数据,用户敲“NH”两个字符就能够得到所有的首字母拼音为N,H的数据,包括你好这条数据.
反之,用户添加一条新数据的时候,假如数据为“中国” 这个时候,我们也必须将中国这两个字转换成“ZG”(通过查询大约有5K条的数据库进行单汉字的逐一比对得到结果)然后存储到相应地方以备查询使用
现在是这样的,我想对单独汉字转换到单独拼音码的过程进行缓存,也就是说缓存一组组形如 我->W ,你->N 的内容。
可是我的老大说不需要,他说这个足够简单,就像1+1一样简单,缓存反而徒增复杂性。我经验不足,不知道如何缓存选择的时机与实现方式上取舍,请各位大牛不吝赐教,在下感激不尽 :)
随帖附上我的缓存代码,其中粗鄙之处也拜请一并指出 :)
举个例子,加入数据库中有一条名为“你好”的数据,用户敲“NH”两个字符就能够得到所有的首字母拼音为N,H的数据,包括你好这条数据.
反之,用户添加一条新数据的时候,假如数据为“中国” 这个时候,我们也必须将中国这两个字转换成“ZG”(通过查询大约有5K条的数据库进行单汉字的逐一比对得到结果)然后存储到相应地方以备查询使用
现在是这样的,我想对单独汉字转换到单独拼音码的过程进行缓存,也就是说缓存一组组形如 我->W ,你->N 的内容。
可是我的老大说不需要,他说这个足够简单,就像1+1一样简单,缓存反而徒增复杂性。我经验不足,不知道如何缓存选择的时机与实现方式上取舍,请各位大牛不吝赐教,在下感激不尽 :)
随帖附上我的缓存代码,其中粗鄙之处也拜请一并指出 :)
//代码拼音码与自定义码组合的引用类型
sealed class CodePairRef
{
public Char PinyinCode;
public Char UserDefineCode;
public Int64 Times;//被访问的次数
}
//用于将字符串翻译成拼音码与自定义码的类
static class Encode
{
private static Dictionary<Char, CodePairRef> cache = new Dictionary<Char, CodePairRef>(); //缓存字典
public static Int32 Capacity //缓存最大容量
{
get { return _capacity; }
set { _capacity = value; }
}static Int32 _capacity = 997;// :)
public static String sql = "get_py_wb";//存储过程
private static Object lockHelper = new Object();
private static String connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ToString();//公共的连接字符串
public static CodePairRef Process( Char ch)
{
if (cache.ContainsKey(ch)) //命中缓存
{
CodePairRef pair = cache[ch];
++pair.Times;
return pair;//返回缓存数据
}
SqlParameter[] sqlParams =
{
new SqlParameter("@chinese",SqlDbType.NVarChar,1),
new SqlParameter("@py_result",SqlDbType.NVarChar,1),
new SqlParameter("@wb_result",SqlDbType.NVarChar,1)
};
sqlParams[0].Value = ch;
sqlParams[1].Direction = ParameterDirection.Output;
sqlParams[2].Direction = ParameterDirection.Output;
try
{
SqlHelper.ExecuteNonQuery( connectionString , CommandType.StoredProcedure, sql, sqlParams);//参数化查询进行解码
}
catch
{
return null;
}
String py = sqlParams[1].Value as String;
String udef = sqlParams[2].Value as String;
if (String.IsNullOrEmpty(py) || String.IsNullOrEmpty(udef))
{
return null;
}
try
{
CodePairRef pair = new CodePairRef(); //构建返回值
pair.PinyinCode = py[0];
pair.UserDefineCode = udef[0];
cache.Add(ch, pair);//将新查询到的结果添加进缓存
#region 自动扩容与删除不常用数据
if (cache.Count >= Capacity)//当缓存数据超过最大容量的时候进行扩容与删除不常用数据
{
lock (lockHelper)
{
if (cache.Count >= Capacity)//2+1组合确保以下程序块在条件满足时只被执行一次
{
foreach (KeyValuePair<Char, CodePairRef> value in cache)
{
if (value.Value.Times < (Capacity/2))
{
cache.Remove(value.Key);
}
}
if (cache.Count >= Capacity)
{
Capacity *= 2;
}
}
}
}
#endregion
return pair;
}
catch
{
return null;
}
}
}
...全文
相关推荐
PHP下利用header()函数设置浏览器缓存的代码
**Expires**:此头标定义了资源的有效期限,即资源在何时应该被视为过期,通常以格林威治标准时间表示。设置一个过去的时间可以防止浏览器使用缓存版本。3.
22丨缓存架构:如何减少不必要的计算?.pdf
在互联网应用开发和维护过程中,缓存架构的设计和优化一直是提升系统性能的关键环节。尤其是在面临高并发场景时,缓存技术能够有效地减少不必要的计算,减轻服务器的负担,加速数据的响应时间。
storageJS:网络存储的静态缓存和非必要内容优化
其中,网络存储技术扮演着关键角色,尤其是在处理静态缓存和非必要内容优化方面。`storageJS`是一个小巧但功能强大的库,专为实现这样的目标而设计。
在js或css后加?v= 版本号不让浏览器缓存
每次版本号改变,浏览器都会将文件视为全新的资源,这可能会导致不必要的下载,尤其是在大型项目中,可能会增加用户的等待时间。因此,合理的版本控制策略和缓存策略的平衡是非常重要的。
PHP 缓存 PHP 缓存
**何时使用缓存:**一般建议在完成基本的系统架构设计后再考虑引入缓存。2. **何时生成缓存:**通常是在读取数据时生成缓存。3.


