缓存在何时有必要?

Laputa_Island Laputa_Island 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近公司做一个项目,要大量用到 拼音码 与 五笔码 检索数据。

举个例子,加入数据库中有一条名为“你好”的数据,用户敲“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;
}


}
}
...全文

相关推荐

评论 25
收藏 已收藏
分享
返回顶部
Laputa_Island
C# 111,129 成员 642,539 内容