gpt4 book ai didi

Asp.Net Cache,从缓存中修改对象并更改缓存值

转载 作者:行者123 更新时间:2023-12-03 14:10:37 25 4
gpt4 key购买 nike

我在使用 Asp.Net 缓存功能时遇到问题。我将一个对象添加到缓存中,然后在另一次从缓存中获取该对象,修改它的一个属性,然后将更改保存到数据库中。

但是,下次我从 Cache 获取对象时,它包含更改的值。因此,当我修改对象时,它会修改缓存中包含的版本,即使我没有专门在缓存中更新它。有谁知道我如何从不引用缓存版本的缓存中获取对象?

IE。

第1步:

Item item = new Item();
item.Title = "Test";
Cache.Insert("Test", item, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

第2步:
Item item = (Item)Cache.Get("test");
item.Title = "Test 1";

第 3 步:
Item item = (Item)Cache.Get("test");
if(item.Title == "Test 1"){
Response.Write("Object has been changed in the Cache.");
}

我意识到,通过上面的示例,对项目的任何更改都会反射(reflect)在缓存中是有道理的,但我的情况有点复杂,我绝对不希望这种情况发生。

最佳答案

缓存就是这样做的,它会缓存您放入其中的任何内容。

如果您缓存引用类型,则检索该引用并对其进行修改,当然,下次您检索缓存项时,它将反射(reflect)修改。

如果您希望拥有一个不可变的缓存项,请使用结构。

Cache.Insert("class", new MyClass() { Title = "original" }, null, 
DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);
MyClass cachedClass = (MyClass)Cache.Get("class");
cachedClass.Title = "new";

MyClass cachedClass2 = (MyClass)Cache.Get("class");
Debug.Assert(cachedClass2.Title == "new");

Cache.Insert("struct", new MyStruct { Title = "original" }, null,
DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

MyStruct cachedStruct = (MyStruct)Cache.Get("struct");
cachedStruct.Title = "new";

MyStruct cachedStruct2 = (MyStruct)Cache.Get("struct");
Debug.Assert(cachedStruct2.Title != "new");

关于Asp.Net Cache,从缓存中修改对象并更改缓存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com