解决ASP.NET中缓存被覆盖的问题

简介: 众所周知, ASP.NET的System.Web命名空间下的缓存可以用来保存一段时间的数据因此, 在项目中我们可能利用它来保存一些缓存数据.因此, 很多人写了这样的工具类来保存和加载缓存 保存缓存: public static void SetCache(string Cac...

众所周知, ASP.NET的System.Web命名空间下的缓存可以用来保存一段时间的数据

因此, 在项目中我们可能利用它来保存一些缓存数据.

因此, 很多人写了这样的工具类来保存和加载缓存

 

保存缓存:

 

public  static  void SetCache( string CacheKey,  object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(key, objObject);
        }

 

public  static  void SetCache( string CacheKey,  object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(key, objObject,  null, absoluteExpiration, slidingExpiration);
        }

 

加载缓存:

 

public  static  object GetCache( string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
             return objCache[key];
        }

 

但是这样就引入了一个问题:

如果多个用户同时访问,缓存是不是会被覆盖呢,或者同一个用户打开不同的窗口,缓存是否会被覆盖呢?

经过测试,答案是肯定的.

 

那么,如何解决这个问题呢?

我们想到了sessionId, 那个是一个用户的会话的概念.

因此,我们只要引入一个工具类,用来获取用户的会话id

public static string GetSessionId()
 {
     return HttpContext.Current.Session.SessionID;
 }

 

修改后的代码如下

 

保存缓存:

 

public  static  void SetCache( string CacheKey,  object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
             string sessionId = Utility.GetSessionId();
             string key = CacheKey +  " _ " + sessionId;
            objCache.Insert(key, objObject);
        }

 

public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            string sessionId = Utility.GetSessionId();
            string key = CacheKey + "_" + sessionId;
            objCache.Insert(key, objObject, null, absoluteExpiration, slidingExpiration);
        }

 

加载缓存:

public  static  object GetCache( string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
             string sessionId = Utility.GetSessionId();
             string key = CacheKey +  " _ " + sessionId;
             return objCache[key];
        }

 

经过测试, 问题解决OK

 

目录
相关文章
|
6月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
234 0
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
173 0
|
缓存 开发框架 .NET
ASP.NET Core 缓存
Get新知识: 缓存相关概念:缓存的类型:总结:总的来说,私有缓存会减少网络带宽的需求,同时会减少从缓存到API的请求。因为私有缓存是存储在客户端浏览器的,对于请求来说,如果缓存还在有限期内,那么请求连网络请求都不会发出会直接在客户端浏览器获取到响应,这样就减少网络请求次数,同样也会减少API请求次数。而共享缓存不会节省缓存到API的网路带宽,但是它会减少请求到API的请求。因为共享缓存是...
118 0
ASP.NET Core 缓存
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
193 5
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
434 1
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
162 1
|
缓存 开发框架 .NET
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
294 1
|
存储 缓存 开发框架
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
225 0
|
缓存 监控 NoSQL
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
440 0
|
存储 SQL 缓存
ASP.NET Core MVC 从入门到精通之缓存
ASP.NET Core MVC 从入门到精通之缓存
278 0

热门文章

最新文章