.net通过cache.insert缓存后,后续的操作影响缓存的数据

没来 2015-03-07 12:57:31
从数据库将数据读取出来后,使用Cache.Insert将其缓存,然后对数据进行操作(比如筛选)并显示结果。请注意:是先缓存,再筛选。第二次读取时,不再读数据库,而是从缓存中返回数据。发现返回的数据是筛选后的数据。这不科学啊!!!求解,谢谢!

Public Shared Function GetStudents () As List (Of Student)
Dim key As String = "AllStudents"
If Not IsNothing (Cache(key)) Then
Return CType(Cache(key), List(Of Student))
End If
Dim lItems As List(Of Student)
'读取数据库,返回值给lItems,此处代码省略
Cache.Insert(key, lItems, Nothing, DateTime.Now.AddSeconds(600), TimeSpan.Zero)
Return lItems
End Function

Public Shared Sub GetStudentsInClass (classId As Integer)
'假设有50名学生,无论后面的筛选如何进行,下面这句的返回值应该是不变的
Dim lItems As List (Of Student)=GetStudents()
If classId > 0 Then
'此处进行筛选.按理不是直接操作缓存的数据,但问题是,这句结束后,缓存的数据就变成了筛选后的数据,而不是全部
lItems.RemoveAll (Function (vStudent) vStudent.ClassId <> classId)
End If
'后面展示结果
End Sub

...全文
274 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
moonwrite 2015-03-13
  • 打赏
  • 举报
回复
引用 8 楼 freeparadise521 的回复:
[quote=引用 6 楼 moonwrite 的回复:] 君是否知道 按值传递 和 按引用传递的 本质 我一般都是会 在缓存中查询 var query = cache.where(......)
那我岂不是得清楚这个缓存的key?还是将所有数据都缓存进去,然后再像查询数据库一样操作?if so, 内存。。。[/quote] 我的代码只是一个例子,当然必须先找key,然后根据key后会得到一个集合,在这个集合中查询 首先你要明白缓存的目的,就是让一些不经常变的数据 比如 京东商品的所有分类 缓存到内存中,减少以后对数据库的查询,是一种牺牲内存换速度的策略(现在的内存白菜价) 然后你可以在这个商品的所有分类.where(查询一级分类或二级分类) 等等等 这些查询都是比查数据库快很多的
没来 2015-03-13
  • 打赏
  • 举报
回复
引用 6 楼 moonwrite 的回复:
君是否知道 按值传递 和 按引用传递的 本质 我一般都是会 在缓存中查询 var query = cache.where(......)
那我岂不是得清楚这个缓存的key?还是将所有数据都缓存进去,然后再像查询数据库一样操作?if so, 内存。。。
没来 2015-03-13
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
[quote=引用 4 楼 freeparadise521 的回复:] [quote=引用 2 楼 sp1234 的回复:] 不是 RemoveAll 方法不科学,是你那样编写的代码。
或者说:我怎么才能避免remoeall执行后,缓存的数据也发生改变这种情况?再次缓存一遍肯定不是办法[/quote] 你就不应该 removeall 人家。你应该复制出你需要的数据集合来。[/quote] 不太理解,能否举个例子?我试过将共赋值给一个新的变量,然后再对这个新变量进行操作,可还是一样的结果。
moonwrite 2015-03-07
  • 打赏
  • 举报
回复
君是否知道 按值传递 和 按引用传递的 本质 我一般都是会 在缓存中查询 var query = cache.where(......)
  • 打赏
  • 举报
回复
引用 4 楼 freeparadise521 的回复:
[quote=引用 2 楼 sp1234 的回复:] 不是 RemoveAll 方法不科学,是你那样编写的代码。
或者说:我怎么才能避免remoeall执行后,缓存的数据也发生改变这种情况?再次缓存一遍肯定不是办法[/quote] 你就不应该 removeall 人家。你应该复制出你需要的数据集合来。
没来 2015-03-07
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
不是 RemoveAll 方法不科学,是你那样编写的代码。
或者说:我怎么才能避免remoeall执行后,缓存的数据也发生改变这种情况?再次缓存一遍肯定不是办法
没来 2015-03-07
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
你既然修改缓存的对象,还不许再次读取出这个对象?
先谢谢! lItems.RemoveAll (Function (vStudent) vStudent.ClassId <> classId) 按我的理解,这句代码并没有修改缓存的对象,而只是修改了这个局部变量而已啊。。。这么理解不对?
  • 打赏
  • 举报
回复
不是 RemoveAll 方法不科学,是你那样编写的代码。
  • 打赏
  • 举报
回复
你既然修改缓存的对象,还不许再次读取出这个对象?

62,047

社区成员

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

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

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

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