高分求解答-------一早上没进展了

huangwenquan123 2010-07-30 03:23:19
第一次发200分的贴子,希望大家帮帮忙,真的很急
现在的问题是,设置了缓存,当数据库没有新数据的时候而且缓存没过期时就直接从缓存中取,
当数据库有新数据插入时,重新设置缓存,可以取到新数据

if (!string.IsNullOrEmpty(context.Request.Form["Letter"].ToString()))
{
context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;
string[] depencise = { "BrandCount" };
CacheDependency cde = new CacheDependency(null, depencise);
if (context.Cache["Brand"] == null)
{
List<BrandInfo> brandinfoinfo = brand_bll.GetBrand(0, "");
context.Cache["Brand"] = brandinfoinfo;
context.Cache.Insert("Brand", brandinfoinfo, cde, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
info = context.Cache["Brand"] as List<BrandInfo>;
string name = context.Request.Form["Letter"].Trim();
if (info.Count > 0)
{
for (int i = 0; i < info.Count; i++)
{
string bname = info[i].BName;
string abc = Tools.Tools.GetPYString(bname.Substring(0, 1)).ToUpper();
if (abc == name)
{
sb.Append("{BName:'" + bname + "',ID:'" + info[i].ID + "',Logo:'" + info[i].Logo + "'}");
sb.Append("%");
}
}
}
if (string.IsNullOrEmpty(sb.ToString()))
sb.Append("false");
context.Response.Write(sb.ToString());
context.Response.End();
}

我设置了缓存依赖项

context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;
string[] depencise = { "BrandCount" };

当数据库没有插入新数据,Cache["BrandCount"]值没改变的时候
为什么Cache["Brand"]总是为空呢?断点进去看到总是空

如果把上面那两句去掉的话,单单一个缓存是没问题,
可是有上面那句后,Cache["Brand"]总是空,如果缓存总是空那这样设置缓存都没意义了
我哪里写错了呢?
希望高手帮帮忙!
先谢谢了!
...全文
244 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangwenquan123 2010-07-31
  • 打赏
  • 举报
回复
键缓存依赖项,如果数据库有新增记录就会使所依赖的缓存对象移除
那这样可以设置缓存久一点不?比如1年。。。会有什么问题?
tiandiyuzhou1 2010-07-30
  • 打赏
  • 举报
回复
纯粹js
yqyqyoyo 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 huangwenquan123 的回复:]
C# code

if (context.Cache["BrandCount"] == null)
context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;

加了个判断是不会出先Cache["Brand"]为空了!

不过还是有问题额
我在数据库插入一条新数据时,它并不会……
[/Quote]

你的判断语句写错了。个人认为应该改写成:

List<BrandInfo> lst=(brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;

if (context.Cache["BrandCount"] != null&&context.Cache["BrandCount"]!=lst.Count.ToString())
context.Cache["BrandCount"] = lst.Count;


你那样写数据库更新了。程序中却无法知道你是否更新了数据库。
因为context.Cache["BrandCount"]经过一次赋值之后,如果不是超时。则条件context.Cache["BrandCount"] == null 始终为否。所以下面这句不会执行。
而把判断条件换为
context.Cache["BrandCount"] != null&&context.Cache["BrandCount"]!=lst.Count.ToString() 保证了如果缓存已经存在,则判断缓存的数据长度和数据库中的长度是否相等来判断数据库是否更新。
但这里还是读取了一次数据库。和没有使用缓存没什么区别。当然这样判断,上面还是要加判断context.Cache["BrandCount"] == null 要不然会出异常。
royalli 2010-07-30
  • 打赏
  • 举报
回复
18楼解决的很不错!
george010 2010-07-30
  • 打赏
  • 举报
回复
数据库依赖好像是要到命令行里进行配置的吧?
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复

if (context.Cache["BrandCount"] == null)
context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;

加了个判断是不会出先Cache["Brand"]为空了!

不过还是有问题额
我在数据库插入一条新数据时,它并不会立即显示,而是要等到缓存过期后才显示
那这个缓存依赖项好象没用处额,我哪里写错了呢?
在请各位大侠指点下
谢谢了!
yqyqyoyo 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huangwenquan123 的回复:]
Cache["Brand"]的总是为空,按理说应该是当Cache["BrandCount"]的值改变的时候他才会为空重新赋值

为什么Cache["BrandCount"]的值没变他还总是为空,
这是为什么呢?
[/Quote]

我知道为什么Cache["Brand"]总是为空,原因在于你的代码段:

context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;
string[] depencise = { "BrandCount" };
CacheDependency cde = new CacheDependency(null, depencise);



仔细看看这段代码,在第一行你重新设置了缓存key为BrandCount的缓存值,
而在下面的缓存依赖 中的key 依赖时设置的key为BrandCount。
所以在下面来取Cache["Brand"]值的时候,缓存依赖认为缓存数据已经发生了更新,故已经清理的缓存。
所以每次Cache["Brand"]值是null,从而重新取值。

不知道我的推断有没有错。你可以试一下看看。
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复
Cache["Brand"]的总是为空,按理说应该是当Cache["BrandCount"]的值改变的时候他才会为空重新赋值

为什么Cache["BrandCount"]的值没变他还总是为空,
这是为什么呢?
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复


插错 不好意思!
yqyqyoyo 2010-07-30
  • 打赏
  • 举报
回复

context.Cache["BrandCount"] = (brand_bll.GetBrand(0, "") as List<BrandInfo>).Count;
string[] depencise = { "BrandCount" };
CacheDependency cde = new CacheDependency(null, depencise);
if (context.Cache["Brand"] == null)
{
List<BrandInfo> brandinfoinfo = brand_bll.GetBrand(0, "");
context.Cache["Brand"] = brandinfoinfo;
context.Cache.Insert("Brand", brandinfoinfo, cde, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
info = context.Cache["Brand"] as List<BrandInfo>;



可以说明一下,这段代码中的具体哪个位置在调试的时候出现数据位null?
天下如山 2010-07-30
  • 打赏
  • 举报
回复
不会 也顶个

下次学习 不懂也来问大家。
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 happyrain2010 的回复:]
你已经给缓存赋值了 为什么还调用了一个insert方法呢?
[/Quote]如果缓存为空就给它赋值

谢谢帮顶的!
happyrain2010 2010-07-30
  • 打赏
  • 举报
回复
你已经给缓存赋值了 为什么还调用了一个insert方法呢?
njxiaoxiong 2010-07-30
  • 打赏
  • 举报
回复
友情帮顶。。。。。。。。
zhanzhao1989 2010-07-30
  • 打赏
  • 举报
回复
顶一个。
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yqyqyoyo 的回复:]
可以改成手动控制而不使用依赖缓存。
在获取数据的地方判断缓存中有,则取缓存中数据,没有则重新取数据并存放在缓存中。
在对数据进行更新操作的时候把次缓存remove。 一样可以实现你所说的。
[/Quote]谢谢,不过现在想要实现的是缓存键依赖项,想知道哪里错了,如果现在不问明白,以后可能都不知道了!
symbol_bc 2010-07-30
  • 打赏
  • 举报
回复
jf啊,这个不太懂
huangwenquan123 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ch_weni 的回复:]
http://www.cnblogs.com/yiki/archive/2009/04/08/1431457.html

数据库缓存依赖
[/Quote]谢谢,不过我早上翻遍了baidu,google,cnblogs
发现要么依赖项,要么就是没有键依赖项,找到的都是相对于文件的依赖项
yqyqyoyo 2010-07-30
  • 打赏
  • 举报
回复
可以改成手动控制而不使用依赖缓存。
在获取数据的地方判断缓存中有,则取缓存中数据,没有则重新取数据并存放在缓存中。
在对数据进行更新操作的时候把次缓存remove。 一样可以实现你所说的。

加载更多回复(1)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧